예제 #1
0
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
예제 #2
0
 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()
예제 #3
0
파일: ksh.py 프로젝트: simonlingoogle/KiBRA
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()
예제 #4
0
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.')