def main(): """ Top-level main for sniffer host-side tool. """ (options, remaining_args) = parse_args() if options.debug: CONFIG.debug_set_level(options.debug) # Set default stream to pipe stream_type = 'p' stream_descriptor = "../../examples/apps/ncp/ot-ncp-ftd "+options.nodeid if options.uart: stream_type = 'u' stream_descriptor = options.uart elif options.socket: stream_type = 's' stream_descriptor = options.socket elif options.pipe: stream_type = 'p' stream_descriptor = options.pipe if options.nodeid: stream_descriptor += " "+str(options.nodeid) else: if len(remaining_args) > 0: stream_descriptor = " ".join(remaining_args) stream = StreamOpen(stream_type, stream_descriptor, False) if stream is None: exit() wpan_api = WpanApi(stream, options.nodeid) sniffer_init(wpan_api, options) pcap = PcapCodec() hdr = pcap.encode_header() if options.hex: hdr = util.hexify_str(hdr)+"\n" sys.stdout.write(hdr) sys.stdout.flush() try: tid = SPINEL.HEADER_ASYNC prop_id = SPINEL.PROP_STREAM_RAW while True: result = wpan_api.queue_wait_for_prop(prop_id, tid) if result and result.prop == prop_id: length = wpan_api.parse_S(result.value) pkt = result.value[2:2+length] if options.ti_crc: pkt = ti_crc(pkt) pkt = pcap.encode_frame(pkt) if options.hex: pkt = util.hexify_str(pkt)+"\n" sys.stdout.write(pkt) sys.stdout.flush() except KeyboardInterrupt: pass if wpan_api: wpan_api.stream.close()
def main(): """ Top-level main for sniffer host-side tool. """ (options, remaining_args) = parse_args() if options.debug: CONFIG.debug_set_level(options.debug) # Set default stream to pipe stream_type = 'p' stream_descriptor = "../../examples/apps/ncp/ot-ncp-ftd "+options.nodeid if options.uart: stream_type = 'u' stream_descriptor = options.uart elif options.socket: stream_type = 's' stream_descriptor = options.socket elif options.pipe: stream_type = 'p' stream_descriptor = options.pipe if options.nodeid: stream_descriptor += " "+str(options.nodeid) else: if len(remaining_args) > 0: stream_descriptor = " ".join(remaining_args) stream = StreamOpen(stream_type, stream_descriptor, False) if stream is None: exit() wpan_api = WpanApi(stream, options.nodeid) sniffer_init(wpan_api, options) pcap = PcapCodec() hdr = pcap.encode_header() if options.hex: hdr = util.hexify_str(hdr)+"\n" sys.stdout.write(hdr) sys.stdout.flush() try: tid = SPINEL.HEADER_ASYNC prop_id = SPINEL.PROP_STREAM_RAW while True: result = wpan_api.queue_wait_for_prop(prop_id, tid) if result and result.prop == prop_id: length = wpan_api.parse_S(result.value) pkt = result.value[2:2+length] pkt = pcap.encode_frame(pkt) if options.hex: pkt = util.hexify_str(pkt)+"\n" sys.stdout.write(pkt) sys.stdout.flush() except KeyboardInterrupt: pass if wpan_api: wpan_api.stream.close()
def main(): """ Top-level main for sniffer host-side tool. """ (options, remaining_args) = parse_args() if options.debug: CONFIG.debug_set_level(options.debug) # Set default stream to pipe stream_type = 'p' stream_descriptor = "../../examples/apps/ncp/ot-ncp-ftd " + options.nodeid if options.uart: stream_type = 'u' stream_descriptor = options.uart elif options.socket: stream_type = 's' stream_descriptor = options.socket elif options.pipe: stream_type = 'p' stream_descriptor = options.pipe if options.nodeid: stream_descriptor += " " + str(options.nodeid) else: if len(remaining_args) > 0: stream_descriptor = " ".join(remaining_args) stream = StreamOpen(stream_type, stream_descriptor, False, options.baudrate) if stream is None: exit() wpan_api = WpanApi(stream, options.nodeid) result = sniffer_init(wpan_api, options) if not result: sys.stderr.write("ERROR: failed to initialize sniffer\n") exit() else: sys.stderr.write("SUCCESS: sniffer initialized\nSniffing...\n") pcap = PcapCodec() hdr = pcap.encode_header() if options.hex: hdr = util.hexify_str(hdr) + "\n" sys.stdout.write(hdr) sys.stdout.flush() epoch = datetime(1970, 1, 1) timebase = datetime.utcnow() - epoch timebase_sec = timebase.days * 24 * 60 * 60 + timebase.seconds timebase_usec = timebase.microseconds try: tid = SPINEL.HEADER_ASYNC prop_id = SPINEL.PROP_STREAM_RAW while True: result = wpan_api.queue_wait_for_prop(prop_id, tid) if result and result.prop == prop_id: length = wpan_api.parse_S(result.value) pkt = result.value[2:2 + length] if options.crc: pkt = crc(pkt) # metadata format (totally 17 bytes): # 0. RSSI(int8) # 1. Noise Floor(int8) # 2. Flags(uint16) # 3. PHY-specific data struct contains: # 3.0 Channel(uint8) # 3.1 LQI(uint8) # 3.2 Timestamp Msec(uint32) # 3.3 Timestamp Usec(uint16) # 4. Vendor data struct contains: # 4.0 Receive error(uint8) if len(result.value) == 2 + length + 17: metadata = wpan_api.parse_fields( result.value[2 + length:2 + length + 17], "ccSt(CCLS)t(i)") timestamp_usec = timebase_usec + metadata[3][ 2] * 1000 + metadata[3][3] timestamp_sec = timebase_sec + timestamp_usec / 1000000 timestamp_usec = timestamp_usec % 1000000 if options.rssi: pkt = pkt[:-2] + chr(metadata[0] & 0xff) + chr(0x80) # Some old version NCP doesn't contain timestamp information in metadata else: timestamp = datetime.utcnow() - epoch timestamp_sec = timestamp.days * 24 * 60 * 60 + timestamp.seconds timestamp_usec = timestamp.microseconds if options.rssi: pkt = pkt[:-2] + chr(127) + chr(0x80) sys.stderr.write( "WARNING: failed to display RSSI, please update the NCP version\n" ) pkt = pcap.encode_frame(pkt, timestamp_sec, timestamp_usec) if options.hex: pkt = util.hexify_str(pkt) + "\n" sys.stdout.write(pkt) sys.stdout.flush() except KeyboardInterrupt: pass if wpan_api: wpan_api.stream.close()
def main(): """ Top-level main for sniffer host-side tool. """ (options, remaining_args) = parse_args() if options.debug: CONFIG.debug_set_level(options.debug) if options.use_host_timestamp: print('WARNING: Using host timestamp, may be inaccurate', file=sys.stderr) # Set default stream to pipe stream_type = 'p' stream_descriptor = "../../examples/apps/ncp/ot-ncp-ftd " + options.nodeid if options.uart: stream_type = 'u' stream_descriptor = options.uart elif options.socket: stream_type = 's' stream_descriptor = options.socket elif options.pipe: stream_type = 'p' stream_descriptor = options.pipe if options.nodeid: stream_descriptor += " " + str(options.nodeid) else: if len(remaining_args) > 0: stream_descriptor = " ".join(remaining_args) stream = StreamOpen(stream_type, stream_descriptor, False, options.baudrate, options.rtscts) if stream is None: exit() wpan_api = WpanApi(stream, options.nodeid) result = sniffer_init(wpan_api, options) if not result: sys.stderr.write("ERROR: failed to initialize sniffer\n") exit() else: sys.stderr.write("SUCCESS: sniffer initialized\nSniffing...\n") pcap = PcapCodec() hdr = pcap.encode_header( DLT_IEEE802_15_4_TAP if options.tap else DLT_IEEE802_15_4_WITHFCS) if options.hex: hdr = util.hexify_str(hdr) + "\n" if options.output: output = open(options.output, 'wb') elif hasattr(sys.stdout, 'buffer'): output = sys.stdout.buffer else: output = sys.stdout output.write(hdr) output.flush() if options.is_fifo: threading.Thread(target=check_fifo, args=(output, )).start() epoch = datetime(1970, 1, 1) timebase = datetime.utcnow() - epoch timebase_sec = timebase.days * 24 * 60 * 60 + timebase.seconds timebase_usec = timebase.microseconds try: tid = SPINEL.HEADER_ASYNC prop_id = SPINEL.PROP_STREAM_RAW while True: result = wpan_api.queue_wait_for_prop(prop_id, tid) if result and result.prop == prop_id: length = wpan_api.parse_S(result.value) pkt = result.value[2:2 + length] # metadata format (totally 19 bytes): # 0. RSSI(int8) # 1. Noise Floor(int8) # 2. Flags(uint16) # 3. PHY-specific data struct contains: # 3.0 Channel(uint8) # 3.1 LQI(uint8) # 3.2 Timestamp in microseconds(uint64) # 4. Vendor data struct contains: # 4.0 Receive error(uint8) if len(result.value) == 2 + length + 19: metadata = wpan_api.parse_fields( result.value[2 + length:2 + length + 19], "ccSt(CCX)t(i)") timestamp = metadata[3][2] timestamp_sec = timestamp / 1000000 timestamp_usec = timestamp % 1000000 # (deprecated) metadata format (totally 17 bytes): # 0. RSSI(int8) # 1. Noise Floor(int8) # 2. Flags(uint16) # 3. PHY-specific data struct contains: # 3.0 Channel(uint8) # 3.1 LQI(uint8) # 3.2 Timestamp Msec(uint32) # 3.3 Timestamp Usec(uint16) # 4. Vendor data struct contains: # 4.0 Receive error(uint8) elif len(result.value) == 2 + length + 17: metadata = wpan_api.parse_fields( result.value[2 + length:2 + length + 17], "ccSt(CCLS)t(i)") timestamp_usec = timebase_usec + metadata[3][ 2] * 1000 + metadata[3][3] timestamp_sec = timebase_sec + timestamp_usec / 1000000 timestamp_usec = timestamp_usec % 1000000 # Some old version NCP doesn't contain timestamp information in metadata else: timestamp = datetime.utcnow() - epoch timestamp_sec = timestamp.days * 24 * 60 * 60 + timestamp.seconds timestamp_usec = timestamp.microseconds if options.rssi: sys.stderr.write( "WARNING: failed to display RSSI, please update the NCP version\n" ) if options.use_host_timestamp: timestamp = round(time.time() * 1000000) timestamp_sec = timestamp // 1000000 timestamp_usec = timestamp % 1000000 pkt = pcap.encode_frame(pkt, int(timestamp_sec), timestamp_usec, options.rssi, options.crc, metadata) if options.hex: pkt = util.hexify_str(pkt) + "\n" output.write(pkt) output.flush() except KeyboardInterrupt: pass if wpan_api: wpan_api.stream.close() output.close()