diff --git a/demos/03-pcap-demo.py b/demos/03-pcap-demo.py index 0548532..a721914 100755 --- a/demos/03-pcap-demo.py +++ b/demos/03-pcap-demo.py @@ -2,6 +2,7 @@ from time import sleep from libAnt.drivers.pcap import PcapDriver +from libAnt.loggers.pcap import PcapLogger from libAnt.node import Node from libAnt.profiles.factory import Factory @@ -14,8 +15,8 @@ def eCallback(e): print(e) -with Node(PcapDriver('demo-capture-1.pcap'), 'PcapNode1') as n: +with Node(PcapDriver('log-0.pcap', loopplayback=True), 'PcapNode1') as n: # n.enableRxScanMode() # Pcap driver is read-only f = Factory(callback) n.start(f.parseMessage, eCallback) - sleep(30) # Listen for 30sec + sleep(10) diff --git a/libAnt/drivers/pcap.py b/libAnt/drivers/pcap.py index c4857b2..0b68cc7 100644 --- a/libAnt/drivers/pcap.py +++ b/libAnt/drivers/pcap.py @@ -8,19 +8,21 @@ class PcapDriver(Driver): - def __init__(self, pcap : str, logger: Logger = None): + def __init__(self, pcap : str, logger: Logger = None, loopplayback: bool = False): super().__init__(logger=logger) self._isopen = False self._pcap = pcap + self._loopplayback = loopplayback self._buffer = Queue() self._loop = None class PcapLoop(Thread): - def __init__(self, pcap, buffer: Queue): + def __init__(self, pcap, buffer: Queue, loopplayback): super().__init__() self._stopper = Event() self._pcap = pcap + self._loopplayback = loopplayback self._buffer = buffer def stop(self) -> None: @@ -28,33 +30,37 @@ def stop(self) -> None: def run(self) -> None: self._pcapfile = open(self._pcap, 'rb') - # move file pointer to first packet header - global_header_length = 24 - self._pcapfile.seek(global_header_length, 0) - first_ts = 0 - start_time = time.time() while not self._stopper.is_set(): - try: - ts_sec, = unpack('i', self._pcapfile.read(4)) - except error: + # move file pointer to first packet header + global_header_length = 24 + self._pcapfile.seek(global_header_length, 0) + + first_ts = 0 + start_time = time.time() + while not self._stopper.is_set(): + try: + ts_sec, = unpack('i', self._pcapfile.read(4)) + except error: + break + ts_usec = unpack('i', self._pcapfile.read(4))[0] / 1000000 + + if first_ts is 0: + first_ts = ts_sec + ts_usec + + ts = ts_sec + ts_usec + send_time = ts - first_ts + elapsed_time = time.time() - start_time + if send_time > elapsed_time: + sleep_time = send_time - elapsed_time + time.sleep(sleep_time) + + packet_length = unpack('i', self._pcapfile.read(4))[0] + self._pcapfile.seek(4, 1) + for i in range(packet_length): + self._buffer.put(self._pcapfile.read(1)) + if not self._loopplayback: break - ts_usec = unpack('i', self._pcapfile.read(4))[0] / 1000000 - - if first_ts is 0: - first_ts = ts_sec + ts_usec - - ts = ts_sec + ts_usec - send_time = ts - first_ts - elapsed_time = time.time() - start_time - if send_time > (elapsed_time): - sleep_time = send_time - elapsed_time - time.sleep(sleep_time) - - packet_length = unpack('i', self._pcapfile.read(4))[0] - self._pcapfile.seek(4, 1) - for i in range(packet_length): - self._buffer.put(self._pcapfile.read(1)) self._pcapfile.close() @@ -63,7 +69,7 @@ def _isOpen(self) -> bool: def _open(self) -> None: self._isopen = True - self._loop = self.PcapLoop(self._pcap, self._buffer) + self._loop = self.PcapLoop(self._pcap, self._buffer, self._loopplayback) self._loop.start() def _close(self) -> None: