def _get_devices(br_serial): logging.info('Looking for devices...') ncps = [] brouter = kiserial.find_devices(has_br=True, has_snum=br_serial)[0] brouter = kiserial.KiSerial(brouter.port, debug=kiserial.KiDebug(1)) devices = kiserial.find_devices() for dev in devices: if not dev.snum in br_serial: ncps.append(kiserial.KiSerial(dev.port, debug=kiserial.KiDebug(1))) logging.info('%d devices found' % len(ncps)) return brouter, ncps
def __init__(self, port_name, serial_debug=kiserial.KiDebug(kiserial.KiDebug.KSH), debug=False, link_type_tap=False): self.debug = debug self.channel = 0 self.handlers = [] self.thread = None self.is_running = False self.init_ts = 0 self.usec = 0 self.link_type_tap = link_type_tap self.serial_dev = kiserial.KiSerial(port_name, debug=serial_debug) self.reset()
def enable_ncp(): '''Find the device and initialize the port''' global SERIAL_DEV # Find device and initialize port port = _find_device(db.get('ncp_serial')) if not port: return logging.info('Serial device is %s.', port) db.set('serial_device', port) SERIAL_DEV = kiserial.KiSerial(port, debug=kiserial.KiDebug( kiserial.KiDebug.NONE)) send_cmd('debug level none', debug_level=kiserial.KiDebug.NONE) # Save serial number serial = send_cmd('show snum')[0] db.set('ncp_serial', serial) # Update the NCP firmware if needed if kibra.__kinosver__ not in send_cmd('show swver')[-1]: logging.info('NCP needs a firmware update.') ncp_fw_update() enable_ncp() # No need to continue if NCP fw version is up to date else: logging.info('NCP firmware is up to date.') # Make sure we are running Thread v3 (1.2.0) if not kibra.__harness__ and 'Thread v3' not in send_cmd( 'show thver')[0]: send_cmd('clear') SERIAL_DEV.wait_for('status', 'none') send_cmd('config thver 3') # Enable ECM if not enabled if 'off' in send_cmd('show hwconfig')[3]: logging.info('Enabling CDC Ethernet and reseting device.') send_cmd('config hwmode 4') send_cmd('reset') time.sleep(3) del SERIAL_DEV enable_ncp()
def main(): '''Parse input and start threads''' parser = argparse.ArgumentParser( prog='KiTools', description='Serial interface to the KiNOS KBI, KSH, DFU and Sniffer', ) parser.add_argument('--version', action='version', version='%(prog)s ' + __version__) parser.add_argument('--port', required=False, type=str, help='serial port to use') parser.add_argument('--channel', required=False, type=int, choices=range(11, 27), help='sniffer channel (802.15.4)') parser.add_argument('--live', required=False, action='store_true', help='launch a Wireshark live capture') parser.add_argument( '--file', required=False, type=str, default=None, help= 'sniffer capture output file OR Wireshark path when used with --live') parser.add_argument( '--tap', required=False, action='store_true', default=False, help= 'capture format is DLT_IEEE802_15_4_TAP(283) instead DLT_IEEE802_15_4_WITHFCS(195)' ) parser.add_argument('--debug', required=False, type=int, choices=range(0, 5), default=0, help='show more program output') parser.add_argument( '--flashdfu', required=False, type=lambda x: kidfu.DfuFile(x), default=None, help= 'provide a DFU file to flash the Kirale devices by using DFU protocol') parser.add_argument( '--flashkbi', required=False, type=lambda x: kidfu.DfuFile(x), default=None, help= 'provide a DFU file to flash the Kirale devices by using KBI protocol') parser.add_argument('--snum', required=False, nargs='+', type=str, help='serial numbers to use with --flashdfu') args = parser.parse_args() # Configure output encoding if platform.system() not in 'Windows': if sys.version_info[:3] < (3, 0): sys.stdout = codecs.getwriter('utf-8')(sys.stdout) elif sys.version_info[:3] < (3, 7): sys.stdout = codecs.getwriter('utf-8')(sys.stdout.detach()) else: sys.stdout.reconfigure(encoding='utf-8') # Print logo colorama.deinit() colorama.init() print(colorama.Fore.BLUE + colorama.Style.BRIGHT + LOGO + colorama.Style.RESET_ALL) # Flash DFU file if provided if args.flashdfu: kifwu.dfu_find_and_flash(args.flashdfu, snum=args.snum) sys.exit('Program finished.') if args.flashkbi: kifwu.kbi_find_and_flash(args.flashkbi) sys.exit('Program finished.') # Configure serial port if not args.port: args.port = _get_device() # Threads threads = [] sniffer = None # Sniffer thread if kisniffer.KiSniffer.is_sniffer(args.port): if not args.channel: args.channel = get_sniffer_channel() sniffer = kisniffer.KiSniffer(port_name=args.port, debug=kiserial.KiDebug(args.debug), link_type_tap=args.tap) # Live capture if args.live: if not args.file: args.file = WS_PATH while not os.path.exists(args.file): args.file = kifwu.try_input( 'Enter a valid path for Wireshark: ') name = sniffer.config_pipe_handler() if name: if 'tshark' in args.file.lower(): wireshark_cmd = [args.file, '-i%s' % name] else: wireshark_cmd = [args.file, '-i%s' % name, '-k'] ws_process = subprocess.Popen(wireshark_cmd) else: sys.exit('System/OS not supported.') # File capture else: sniffer.config_file_handler(pcap_file=args.file) threads.append(Thread(target=capture, args=[sniffer, args.channel])) device = sniffer.serial_dev # Terminal thread else: device = kiserial.KiSerialTh(port_name=args.port) if not device.is_valid(): sys.exit('No valid Kirale serial devices found.') device.debug = kiserial.KiDebug(kiserial.KiDebug.LOGS, args.debug) threads.append(Thread(target=port_loop, args=[device])) threads.append(Thread(target=check_port, args=[device])) for thread in threads: thread.daemon = True thread.start() while True: try: sleep(0.5) # Not to keep the processor busy for thread in threads: if not thread.is_alive(): sys.exit('Program finished.') except (KeyboardInterrupt, EOFError): if sniffer: sniffer.close() else: device.close() if args.live: ws_process.kill() ws_process.wait() sys.exit('\nProgram finished by user.')