Esempio n. 1
0
  def __init__(self):
    self.argparser = argparse.ArgumentParser(
      fromfile_prefix_chars="@",
      description="Test throughput over 2 serial D7 modems"
    )

    self.argparser.add_argument("-n", "--msg-count", help="number of messages to transmit", type=int, default=10)
    self.argparser.add_argument("-p", "--payload-size", help="number of bytes of (appl level) payload to transmit", type=int, default=50)
    self.argparser.add_argument("-sw", "--serial-transmitter", help="serial device /dev file transmitter node", default=None)
    self.argparser.add_argument("-sr", "--serial-receiver", help="serial device /dev file receiver node", default=None)
    self.argparser.add_argument("-r", "--rate", help="baudrate for serial device", type=int, default=115200)
    self.argparser.add_argument("-uid", "--unicast-uid", help="UID to use for unicast transmission, "
                                                              "when not using receiver "
                                                              "(in hexstring, for example 0xb57000009151d)", default=None)
    self.argparser.add_argument("-to", "--receiver-timeout", help="timeout for the receiver (in seconds)", type=int, default=10)
    self.argparser.add_argument("-v", "--verbose", help="verbose", default=False, action="store_true")
    self.config = self.argparser.parse_args()

    if self.config.serial_transmitter == None and self.config.serial_receiver ==  None:
      self.argparser.error("At least a transmitter or receiver is required.")

    if self.config.serial_receiver == None and self.config.unicast_uid == None:
      self.argparser.error("When running without receiver a --unicast-uid parameter is required.")

    if self.config.serial_transmitter == None:
      self.transmitter_modem = None
      print("Running without transmitter")
    else:
      self.transmitter_modem = Modem(self.config.serial_transmitter, self.config.rate, None, show_logging=self.config.verbose)
      access_profile = AccessProfile(
        scan_type_is_foreground=True,
        csma_ca_mode=CsmaCaMode.UNC,
        subnet=03,
        scan_automation_period=CT(0),
        subbands=[Subband(
          channel_header=ChannelHeader(channel_band=ChannelBand.BAND_433,
                                       channel_coding=ChannelCoding.PN9,
                                       channel_class=ChannelClass.NORMAL_RATE),
          channel_index_start=16,
          channel_index_end=16,
          eirp=10,
          ccao=0 # TODO
        )
        ]
      )

      print("Write Access Profile")
      write_ap_cmd = Command.create_with_write_file_action_system_file(file=AccessProfileFile(access_profile=access_profile, access_specifier=0))
      self.transmitter_modem.send_command(write_ap_cmd)

    if self.config.serial_receiver == None:
      self.receiver_modem = None
      print("Running without receiver")
    else:
      self.receiver_modem = Modem(self.config.serial_receiver, self.config.rate, self.receiver_cmd_callback, show_logging=self.config.verbose)
      self.receiver_modem.send_command(Command.create_with_write_file_action_system_file(DllConfigFile(active_access_class=2)))
      print("Receiver scanning on Access Class = 2")
Esempio n. 2
0
  def __init__(self):
    self.argparser = argparse.ArgumentParser(
      fromfile_prefix_chars="@",
      description="Test throughput over 2 serial D7 modems"
    )

    self.argparser.add_argument("-n", "--msg-count", help="number of messages to transmit", type=int, default=10)
    self.argparser.add_argument("-p", "--payload-size", help="number of bytes of (appl level) payload to transmit", type=int, default=50)
    self.argparser.add_argument("-sw", "--serial-transmitter", help="serial device /dev file transmitter node", default=None)
    self.argparser.add_argument("-sr", "--serial-receiver", help="serial device /dev file receiver node", default=None)
    self.argparser.add_argument("-r", "--rate", help="baudrate for serial device", type=int, default=115200)
    self.argparser.add_argument("-uid", "--unicast-uid", help="UID to use for unicast transmission, "
                                                              "when not using receiver "
                                                              "(in hexstring, for example 0xb57000009151d)", default=None)
    self.argparser.add_argument("-to", "--receiver-timeout", help="timeout for the receiver (in seconds)", type=int, default=10)
    self.argparser.add_argument("-v", "--verbose", help="verbose", default=False, action="store_true")
    self.config = self.argparser.parse_args()

    configure_default_logger(self.config.verbose)

    if self.config.serial_transmitter == None and self.config.serial_receiver == None:
      self.argparser.error("At least a transmitter or receiver is required.")

    if self.config.serial_receiver == None and self.config.unicast_uid == None:
      self.argparser.error("When running without receiver a --unicast-uid parameter is required.")

    if self.config.serial_transmitter == None:
      self.transmitter_modem = None
      print("Running without transmitter")
    else:
      self.transmitter_modem = Modem(self.config.serial_transmitter, self.config.rate, None)
      access_profile = AccessProfile(
        channel_header=ChannelHeader(channel_band=ChannelBand.BAND_868,
                                     channel_coding=ChannelCoding.PN9,
                                     channel_class=ChannelClass.NORMAL_RATE),
        sub_profiles=[SubProfile(subband_bitmap=0x01, scan_automation_period=CT(exp=0, mant=0)), SubProfile(), SubProfile(), SubProfile()],
        sub_bands=[SubBand(
          channel_index_start=0,
          channel_index_end=0,
          eirp=10,
          cca=86 # TODO
        )]
      )

      print("Write Access Profile")
      write_ap_cmd = Command.create_with_write_file_action_system_file(file=AccessProfileFile(access_profile=access_profile, access_specifier=0))
      self.transmitter_modem.execute_command(write_ap_cmd, timeout_seconds=1)

    if self.config.serial_receiver == None:
      self.receiver_modem = None
      print("Running without receiver")
    else:
      self.receiver_modem = Modem(self.config.serial_receiver, self.config.rate, self.receiver_cmd_callback)
      self.receiver_modem.execute_command(Command.create_with_write_file_action_system_file(DllConfigFile(active_access_class=0x01)), timeout_seconds=1)
      print("Receiver scanning on Access Class = 0x01")
Esempio n. 3
0
def set_gps(GPS):
    characters = [0x80, 0x81]  # 0 = GPS off -> 0x30, 1 = GPS on -> 0x31
    cmd = Command.create_with_return_file_data_action(
        0x40, [0x0A, 0x32, characters[GPS], 0X0D], InterfaceType.D7ASP,
        D7Config(addressee=Addressee(access_class=0x11, id_type=IdType.NOID)))

    execute_rpc_command("<gateway ID>", cmd)
    debug("GPS was set to " + str(GPS) + " through RPC")
    push_to_tb({"gps": GPS})
    for i in range(0, 20):
        cmd = Command.create_with_return_file_data_action(
            0x40, [0x0A, 0x32, characters[GPS], 0X0D], InterfaceType.D7ASP,
            D7Config(
                addressee=Addressee(access_class=0x11, id_type=IdType.NOID)))
        time.sleep(0.5)
Esempio n. 4
0
def cleanup(sig, frame):
  cmd = Command()
  emFile.mode = EngineeringModeMode.ENGINEERING_MODE_MODE_OFF
  cmd.add_action(
    RegularAction(
      operation=WriteFileData(
        operand=Data(
          offset=Offset(id=emFile.id),
          data=list(emFile)
        )
      )
    )
  )
  modem.execute_command(cmd)
  sys.exit(0)
Esempio n. 5
0
  def test_create_with_write_file_header(self):
    file_header = FileHeader(
      permissions=FilePermissions(
        executeable=True,
        encrypted=False,
        user_readable=True,
        user_writeable=True,
        user_executeable=False,
        guest_readable=True,
        guest_executeable=False,
        guest_writeable=False
      ),
      properties=FileProperties(act_enabled=False, act_condition=ActionCondition.WRITE, storage_class=StorageClass.PERMANENT),
      alp_command_file_id=0x41,
      interface_file_id=0x42,
      file_size=1,
      allocated_size=1
    )

    c = Command.create_with_write_file_header(file_id=0x40, file_header=file_header)
    self.assertEqual(len(c.actions), 1)
    self.assertEqual(type(c.actions[0]), RegularAction)
    self.assertEqual(type(c.actions[0].operation), WriteFileHeader)
    self.assertEqual(type(c.actions[0].operand), FileHeaderOperand)
    self.assertEqual(c.actions[0].operand.file_id, 0x40)
    self.assertEqual(c.actions[0].operand.file_header, file_header)
Esempio n. 6
0
 def test_create_with_read_file_header(self):
   c = Command.create_with_read_file_header(file_id=0x40)
   self.assertEqual(len(c.actions), 1)
   self.assertEqual(type(c.actions[0]), RegularAction)
   self.assertEqual(type(c.actions[0].operation), ReadFileHeader)
   self.assertEqual(type(c.actions[0].operand), FileIdOperand)
   self.assertEqual(c.actions[0].operand.file_id, 0x40)
Esempio n. 7
0
    def start_transmitting(self, interface_configuration, payload):
        print(
            "Running throughput test with payload size {} and interface_configuration {}\n\nrunning ...\n"
            .format(len(payload), interface_configuration))

        if self.receiver_modem != None:
            self.received_commands = defaultdict(list)
            self.receiver_modem.start_reading()

        command = Command.create_with_return_file_data_action(
            file_id=0x40,
            data=payload,
            interface_type=InterfaceType.D7ASP,
            interface_configuration=interface_configuration)

        start = time.time()

        for i in range(self.config.msg_count):
            sys.stdout.write("{}/{}\r".format(i + 1, self.config.msg_count))
            sys.stdout.flush()
            self.transmitter_modem.d7asp_fifo_flush(command)

        end = time.time()
        print("transmitter: sending {} messages completed in: {} s".format(
            self.config.msg_count, end - start))
        print(
            "transmitter: throughput = {} bps with a payload size of {} bytes".
            format((self.config.msg_count * self.config.payload_size * 8) /
                   (end - start), self.config.payload_size))
Esempio n. 8
0
    def run(self):
        # cmd = Command.create_with_return_file_data_action(file_id, data, interface_type=InterfaceType.HOST,interface_configuration=None)
        cmd = Command.create_with_return_file_data_action(
            file_id=40,
            data=[0x31, 0x41, 0x45],
            interface_type=InterfaceType.D7ASP,
            interface_configuration=D7config(
                qos=QoS(resp_mod=ResponseMode.RESP_MODE_NO),
                addressee=Addressee(access_class=0x11, id_type=IdType.NOID)))
        # cmd = {0x32, 0xd7, 0x01, 0x00, 0x10, 0x01, 0x20, 0x01, 0x00}
        # cmd = {0x011}
        self.execute_rpc_command(self.config.device, cmd)
        print("Send 1")

        self.update_progress(0)
        sleep(1)
        self.update_progress(20)
        sleep(1)
        self.update_progress(40)
        sleep(1)
        self.update_progress(60)
        sleep(1)
        self.update_progress(80)
        sleep(1)
        self.update_progress(100)

        self.execute_rpc_command(self.config.device, cmd)
        print()
        print("Send 2")
Esempio n. 9
0
def on_read_local_system_file(data):
    cmd = Command.create_with_read_file_action_system_file(
        SystemFiles.files[SystemFileIds(int(data['system_file_id']))])
    logging.info("executing cmd: {}".format(cmd))
    modem.execute_command_async(cmd)

    return {'tag_id': cmd.tag_id}
Esempio n. 10
0
 def test_simple_received_return_file_data_command(self):
     cmd = Command(
         generate_tag_request_action=False,
         actions=[
             RegularAction(operation=ReturnFileData(
                 operand=Data(data=list(bytearray("Hello world")),
                              offset=Offset(id=0x51)))),
             StatusAction(
                 status_operand_extension=StatusActionOperandExtensions.
                 INTERFACE_STATUS,
                 operation=InterfaceStatus(operand=InterfaceStatusOperand(
                     interface_id=0xD7,
                     interface_status=D7ASpStatus(channel_header=0,
                                                  channel_index=16,
                                                  rx_level=70,
                                                  link_budget=80,
                                                  target_rx_level=80,
                                                  nls=False,
                                                  missed=False,
                                                  retry=False,
                                                  unicast=False,
                                                  fifo_token=200,
                                                  seq_nr=0,
                                                  response_to=CT(mant=20),
                                                  addressee=Addressee()))))
         ])
     expected = [
         0x62,  # Interface Status action
         0xD7,  # D7ASP interface
         0,  # channel header
         16,
         0,  # channel_id
         70,  # rxlevel (- dBm)
         80,  # link budget
         80,  # target rx level
         0,  # status
         200,  # fifo token
         0,  # seq
         20,  # response timeout
         16,  # addressee ctrl (BCAST)
         0x20,  # action=32/ReturnFileData
         0x51,  # File ID
         0x00,  # offset
         0x0b,  # length
         0x48,
         0x65,
         0x6c,
         0x6c,
         0x6f,  # Hello
         0x20,
         0x77,
         0x6f,
         0x72,
         0x6c,
         0x64  # World
     ]
     bytes = bytearray(cmd)
     self.assertEqual(len(bytes), len(expected))
     for i in xrange(len(expected)):
         self.assertEqual(bytes[i], expected[i])
Esempio n. 11
0
def on_read_local_file(data):
    logging.info("read_local_file")
    cmd = Command.create_with_read_file_action(file_id=int(data['file_id']),
                                               offset=int(data['offset']),
                                               length=int(data['length']))

    modem.execute_command(cmd)
Esempio n. 12
0
  def start_transmitting(self, interface_configuration, payload):
    print("Running throughput test with payload size {} and interface_configuration {}\n\nrunning ...\n".format(len(payload), interface_configuration))

    if self.receiver_modem != None:
      self.received_commands = defaultdict(list)
      self.receiver_modem.start_reading()

    command = Command.create_with_return_file_data_action(
      file_id=0x40,
      data=payload,
      interface_type=InterfaceType.D7ASP,
      interface_configuration=interface_configuration
    )

    start = time.time()

    for i in range(self.config.msg_count):
      sys.stdout.write("{}/{}\r".format(i + 1, self.config.msg_count))
      sys.stdout.flush()
      self.transmitter_modem.d7asp_fifo_flush(command)

    end = time.time()
    print("transmitter: sending {} messages completed in: {} s".format(self.config.msg_count, end - start))
    print("transmitter: throughput = {} bps with a payload size of {} bytes".format(
      (self.config.msg_count * self.config.payload_size * 8) / (end - start), self.config.payload_size)
    )
Esempio n. 13
0
def execute_rpc_command(device_id, data):
    json_alp_cmd = Command.create_with_return_file_data_action(
        file_id=40,
        data=data,
        interface_type=InterfaceType.D7ASP,
        interface_configuration=D7config(
            qos=QoS(resp_mod=ResponseMode.RESP_MODE_NO),
            addressee=Addressee(access_class=0x11, id_type=IdType.NOID)))
    # we will do it by a manual POST to /api/plugins/rpc/oneway/ , which is the route specified
    # in the documentation
    cmd = {
        "method": "execute-alp-async",
        "params": jsonpickle.encode(json_alp_cmd),
        "timeout": 500
    }
    path_params = {'deviceId': device_id}
    query_params = {}
    header_params = {}
    header_params['Accept'] = api_client.select_header_accept(['*/*'])
    header_params['Content-Type'] = api_client.select_header_content_type(
        ['application/json'])

    # Authentication setting
    auth_settings = ['X-Authorization']
    return api_client.call_api('/api/plugins/rpc/oneway/{deviceId}',
                               'POST',
                               path_params,
                               query_params,
                               header_params,
                               body=cmd,
                               post_params=[],
                               files={},
                               response_type='DeferredResultResponseEntity',
                               auth_settings=auth_settings,
                               async=False)
Esempio n. 14
0
def execute_command(data):
  print("execute_command")
  print data

  interface_configuration = None
  interface_type = InterfaceType(int(data["interface"]))
  if interface_type == InterfaceType.D7ASP:
    id_type = IdType(int(data["id_type"]))
    id = int(data["id"])
    if id_type == IdType.NOID:
      id = None

    interface_configuration = Configuration(
      qos=QoS(resp_mod=ResponseMode(int(data["qos_response_mode"]))),
      addressee=Addressee(
        access_class=int(data["access_class"]),
        id_type=id_type,
        id=id
      )
    )

  cmd = Command.create_with_read_file_action(
    interface_type=interface_type,
    interface_configuration=interface_configuration,
    file_id=int(data["file_id"]),
    offset=int(data["offset"]),
    length=int(data["length"])
  )

  modem.send_command(cmd)
  return {'tag_id': cmd.tag_id}
def on_read_local_file(data):
    print("read_local_file")
    cmd = Command.create_with_read_file_action(file_id=int(data['file_id']),
                                               offset=int(data['offset']),
                                               length=int(data['length']))

    modem.send_command(cmd)
Esempio n. 16
0
def execute_command(data):
    logging.info("execute_command")
    logging.info(data)

    interface_configuration = None
    interface_type = InterfaceType(int(data["interface"]))
    if interface_type == InterfaceType.D7ASP:
        id_type = IdType[data["id_type"]]
        id = int(data["id"])
        if id_type == IdType.NOID:
            id = None
        if id_type == IdType.NBID:
            id = CT()  # TODO convert

        interface_configuration = Configuration(
            qos=QoS(resp_mod=ResponseMode[data["qos_response_mode"]]),
            addressee=Addressee(access_class=int(data["access_class"]),
                                id_type=id_type,
                                id=id))

    cmd = Command.create_with_read_file_action(
        interface_type=interface_type,
        interface_configuration=interface_configuration,
        file_id=int(data["file_id"]),
        offset=int(data["offset"]),
        length=int(data["length"]))

    logging.info("executing cmd: {}".format(cmd))
    modem.execute_command_async(cmd)
    return {
        'tag_id': cmd.tag_id,
        'interface': interface_type.name,
        'command_description': cmd.describe_actions()
    }
Esempio n. 17
0
 def test_create_with_read_file_action(self):
   c = Command.create_with_read_file_action(file_id=1, length=10)
   self.assertEqual(len(c.actions), 1)
   self.assertEqual(type(c.actions[0]), RegularAction)
   self.assertEqual(type(c.actions[0].operation), ReadFileData)
   self.assertEqual(type(c.actions[0].operand), DataRequest)
   self.assertEqual(c.actions[0].operand.offset.id, 1)
   self.assertEqual(c.actions[0].operand.offset.offset.value, 0)
   self.assertEqual(c.actions[0].operand.length.value, 10)
Esempio n. 18
0
def on_read_local_file(data):
  print("read_local_file")
  cmd = Command.create_with_read_file_action(
    file_id=int(data['file_id']),
    offset=int(data['offset']),
    length=int(data['length'])
  )

  modem.send_command(cmd)
Esempio n. 19
0
 def test_create_with_read_file_action(self):
   c = Command.create_with_read_file_action(file_id=1, length=10)
   self.assertEqual(len(c.actions), 1)
   self.assertEqual(type(c.actions[0]), RegularAction)
   self.assertEqual(type(c.actions[0].operation), ReadFileData)
   self.assertEqual(type(c.actions[0].operand), DataRequest)
   self.assertEqual(c.actions[0].operand.offset.id, 1)
   self.assertEqual(c.actions[0].operand.offset.size, 1)
   self.assertEqual(c.actions[0].operand.offset.offset, 0)
   self.assertEqual(c.actions[0].operand.length, 10)
Esempio n. 20
0
 def send(self):
     cmd = Command.create_with_return_file_data_action(
         file_id=0x40,
         data=map(ord, list(self.command)),
         interface_type=InterfaceType.D7ASP,
         interface_configuration=Configuration(
             qos=QoS(resp_mod=QoS.RESP_MODE_NO),
             addressee=Addressee(access_class=0, id_type=IdType.BCAST)))
     self.modem.d7asp_fifo_flush(alp_command=cmd)
     self.add("me: " + self.command, curses.A_REVERSE)
Esempio n. 21
0
 def read_uid(self):
   self.send_command(Command.create_with_read_file_action_system_file(UidFile()))
   while True: # TODO timeout
     commands, info = self.read()
     for command in commands:
       for action in command.actions:
         if type(action) is RegularAction \
             and type(action.operation) is ReturnFileData \
             and action.operand.offset.id == SystemFileIds.UID:
           return struct.unpack(">Q", bytearray(action.operand.data))[0]
Esempio n. 22
0
 def test_create_with_return_file_data_action(self):
   data = [ 1 ]
   c = Command.create_with_return_file_data_action(file_id=0x40, data=data)
   self.assertEqual(len(c.actions), 1)
   self.assertEqual(type(c.actions[0]), RegularAction)
   self.assertEqual(type(c.actions[0].operation), ReturnFileData)
   self.assertEqual(type(c.actions[0].operand), Data)
   self.assertEqual(c.actions[0].operand.offset.id, 0x40)
   self.assertEqual(c.actions[0].operand.offset.offset.value, 0)
   self.assertEqual(c.actions[0].operand.length.value, 1)
   self.assertEqual(c.actions[0].operand.data, data)
Esempio n. 23
0
 def test_create_with_write_file_action(self):
   data = [0, 1, 2, 3, 4, 5]
   c = Command.create_with_write_file_action(file_id=1, data=data)
   self.assertEqual(len(c.actions), 1)
   self.assertEqual(type(c.actions[0]), RegularAction)
   self.assertEqual(type(c.actions[0].operation), WriteFileData)
   self.assertEqual(type(c.actions[0].operand), Data)
   self.assertEqual(c.actions[0].operand.offset.id, 1)
   self.assertEqual(c.actions[0].operand.offset.offset.value, 0)
   self.assertEqual(c.actions[0].operand.length.value, 6)
   self.assertEqual(c.actions[0].operand.data, data)
Esempio n. 24
0
 def read_uid(self):
     self.send_command(
         Command.create_with_read_file_action_system_file(UidFile()))
     while True:  # TODO timeout
         commands, info = self.read()
         for command in commands:
             for action in command.actions:
                 if type(action) is RegularAction \
                     and type(action.operation) is ReturnFileData \
                     and action.operand.offset.id == SystemFileIds.UID:
                     return struct.unpack(">Q",
                                          bytearray(action.operand.data))[0]
Esempio n. 25
0
 def test_create_with_return_file_data_action(self):
   data = [ 1 ]
   c = Command.create_with_return_file_data_action(file_id=0x40, data=data)
   self.assertEqual(len(c.actions), 1)
   self.assertEqual(type(c.actions[0]), RegularAction)
   self.assertEqual(type(c.actions[0].operation), ReturnFileData)
   self.assertEqual(type(c.actions[0].operand), Data)
   self.assertEqual(c.actions[0].operand.offset.id, 0x40)
   self.assertEqual(c.actions[0].operand.offset.size, 1)
   self.assertEqual(c.actions[0].operand.offset.offset, 0)
   self.assertEqual(c.actions[0].operand.length, 1)
   self.assertEqual(c.actions[0].operand.data, data)
Esempio n. 26
0
 def test_create_with_write_file_action(self):
   data = [0, 1, 2, 3, 4, 5]
   c = Command.create_with_write_file_action(file_id=1, data=data)
   self.assertEqual(len(c.actions), 1)
   self.assertEqual(type(c.actions[0]), RegularAction)
   self.assertEqual(type(c.actions[0].operation), WriteFileData)
   self.assertEqual(type(c.actions[0].operand), Data)
   self.assertEqual(c.actions[0].operand.offset.id, 1)
   self.assertEqual(c.actions[0].operand.offset.size, 1)
   self.assertEqual(c.actions[0].operand.offset.offset, 0)
   self.assertEqual(c.actions[0].operand.length, 6)
   self.assertEqual(c.actions[0].operand.data, data)
Esempio n. 27
0
    def parse(self, s, cmd_length):
        actions = []
        if cmd_length != 0:
            alp_bytes_parsed = 0
            while alp_bytes_parsed < cmd_length:
                startpos = s.bytepos
                action = self.parse_alp_action(s)
                actions.append(action)
                alp_bytes_parsed = alp_bytes_parsed + (s.bytepos - startpos)

        cmd = Command(actions=actions, generate_tag_request_action=False)
        return cmd
Esempio n. 28
0
    def connect(self):
        if self.connected:
            return

        read_modem_info_action = Command.create_with_read_file_action_system_file(
            UidFile())
        read_modem_info_action.add_action(
            RegularAction(operation=ReadFileData(operand=DataRequest(
                offset=Offset(id=FirmwareVersionFile().id, offset=Length(
                    0)),  # TODO offset size
                length=FirmwareVersionFile().length))))

        if self.skip_alp_parsing:
            self.log.info(
                "Running in skip_alp_parsing mode, not checking if we can receive the modem's UID"
            )
            self.connected = True
            self.execute_command_async(read_modem_info_action)
            return True

        resp_cmd = self.execute_command(read_modem_info_action,
                                        timeout_seconds=10)

        if len(resp_cmd) == 0:
            self.log.warning("Timed out reading node information")
            return False

        for action in resp_cmd[0].actions:
            if type(action) is RegularAction and type(
                    action.operation) is ReturnFileData:
                if action.operand.offset.id == SystemFileIds.UID.value:
                    self.uid = '{:x}'.format(
                        struct.unpack(">Q",
                                      str(bytearray(action.operand.data)))[0])
                if action.operand.offset.id == SystemFileIds.FIRMWARE_VERSION.value:
                    self.firmware_version = FirmwareVersionFile.parse(
                        ConstBitStream(bytearray(action.operand.data)))

        if self.uid and self.firmware_version:
            self.connected = True

        if self.connected:
            self.log.info(
                "connected to {}, node UID {} running D7AP v{}, application \"{}\" with git sha1 {}"
                .format(self.config["device"], self.uid,
                        self.firmware_version.d7ap_version,
                        self.firmware_version.application_name,
                        self.firmware_version.git_sha1))
            return True
        else:
            return False
Esempio n. 29
0
 def send(self):
   cmd = Command.create_with_return_file_data_action(
     file_id=0x40,
     data=map(ord, list(self.command)),
     interface_type=InterfaceType.D7ASP,
     interface_configuration=Configuration(
       qos=QoS(resp_mod=QoS.RESP_MODE_NO),
       addressee=Addressee(
         access_class=0,
         id_type=IdType.BCAST
       )
     )
   )
   self.modem.d7asp_fifo_flush(alp_command=cmd)
   self.add("me: " + self.command, curses.A_REVERSE)
Esempio n. 30
0
 def test_create_with_write_file_action_d7asp(self):
   data = [0, 1, 2, 3, 4, 5]
   c = Command.create_with_write_file_action(file_id=1, data=data, interface_type=InterfaceType.D7ASP)
   self.assertEqual(len(c.actions), 2)
   self.assertEqual(type(c.actions[0]), RegularAction)
   self.assertEqual(type(c.actions[0].operation), Forward)
   self.assertEqual(type(c.actions[0].operand), InterfaceConfiguration)
   self.assertEqual(c.actions[0].operand.interface_id.value, 0xD7)
   self.assertEqual(type(c.actions[0].operand.interface_configuration), Configuration)
   # TODO configuration properties
   self.assertEqual(type(c.actions[1].operation), WriteFileData)
   self.assertEqual(type(c.actions[1].operand), Data)
   self.assertEqual(c.actions[1].operand.offset.id, 1)
   self.assertEqual(c.actions[1].operand.offset.offset.value, 0)
   self.assertEqual(c.actions[1].operand.length.value, 6)
   self.assertEqual(c.actions[1].operand.data, data)
Esempio n. 31
0
 def test_create_with_return_file_data_action_d7asp(self):
   data = [1]
   c = Command.create_with_return_file_data_action(file_id=0x40, data=data, interface_type=InterfaceType.D7ASP)
   self.assertEqual(len(c.actions), 2)
   self.assertEqual(type(c.actions[0]), RegularAction)
   self.assertEqual(type(c.actions[0].operation), Forward)
   self.assertEqual(type(c.actions[0].operand), InterfaceConfiguration)
   self.assertEqual(c.actions[0].operand.interface_id.value, 0xD7)
   self.assertEqual(type(c.actions[0].operand.interface_configuration), Configuration)
   self.assertEqual(type(c.actions[1]), RegularAction)
   self.assertEqual(type(c.actions[1].operation), ReturnFileData)
   self.assertEqual(type(c.actions[1].operand), Data)
   self.assertEqual(c.actions[1].operand.offset.id, 0x40)
   self.assertEqual(c.actions[1].operand.offset.offset.value, 0)
   self.assertEqual(c.actions[1].operand.length.value, 1)
   self.assertEqual(c.actions[1].operand.data, data)
Esempio n. 32
0
 def test_create_with_read_file_action_d7asp(self):
   c = Command.create_with_read_file_action(file_id=1, length=10, interface_type=InterfaceType.D7ASP)
   self.assertEqual(len(c.actions), 2)
   self.assertEqual(type(c.actions[0]), RegularAction)
   self.assertEqual(type(c.actions[0].operation), Forward)
   self.assertEqual(type(c.actions[0].operand), InterfaceConfiguration)
   self.assertEqual(c.actions[0].operand.interface_id.value, 0xD7)
   self.assertEqual(type(c.actions[0].operand.interface_configuration), Configuration)
   # TODO configuration properties
   self.assertEqual(type(c.actions[1].operation), ReadFileData)
   self.assertEqual(type(c.actions[1].operand), DataRequest)
   self.assertEqual(type(c.actions[1]), RegularAction)
   self.assertEqual(type(c.actions[1].operation), ReadFileData)
   self.assertEqual(type(c.actions[1].operand), DataRequest)
   self.assertEqual(c.actions[1].operand.offset.id, 1)
   self.assertEqual(c.actions[1].operand.offset.offset.value, 0)
   self.assertEqual(c.actions[1].operand.length.value, 10)
Esempio n. 33
0
 def test_create_with_return_file_data_action_d7asp(self):
   data = [1]
   c = Command.create_with_return_file_data_action(file_id=0x40, data=data, interface_type=InterfaceType.D7ASP)
   self.assertEqual(len(c.actions), 2)
   self.assertEqual(type(c.actions[0]), RegularAction)
   self.assertEqual(type(c.actions[0].operation), Forward)
   self.assertEqual(type(c.actions[0].operand), InterfaceConfiguration)
   self.assertEqual(c.actions[0].operand.interface_id, 0xD7)
   self.assertEqual(type(c.actions[0].operand.interface_configuration), Configuration)
   self.assertEqual(type(c.actions[1]), RegularAction)
   self.assertEqual(type(c.actions[1].operation), ReturnFileData)
   self.assertEqual(type(c.actions[1].operand), Data)
   self.assertEqual(c.actions[1].operand.offset.id, 0x40)
   self.assertEqual(c.actions[1].operand.offset.size, 1)
   self.assertEqual(c.actions[1].operand.offset.offset, 0)
   self.assertEqual(c.actions[1].operand.length, 1)
   self.assertEqual(c.actions[1].operand.data, data)
Esempio n. 34
0
 def test_create_with_write_file_action_d7asp(self):
   data = [0, 1, 2, 3, 4, 5]
   c = Command.create_with_write_file_action(file_id=1, data=data, interface_type=InterfaceType.D7ASP)
   self.assertEqual(len(c.actions), 2)
   self.assertEqual(type(c.actions[0]), RegularAction)
   self.assertEqual(type(c.actions[0].operation), Forward)
   self.assertEqual(type(c.actions[0].operand), InterfaceConfiguration)
   self.assertEqual(c.actions[0].operand.interface_id, 0xD7)
   self.assertEqual(type(c.actions[0].operand.interface_configuration), Configuration)
   # TODO configuration properties
   self.assertEqual(type(c.actions[1].operation), WriteFileData)
   self.assertEqual(type(c.actions[1].operand), Data)
   self.assertEqual(c.actions[1].operand.offset.id, 1)
   self.assertEqual(c.actions[1].operand.offset.size, 1)
   self.assertEqual(c.actions[1].operand.offset.offset, 0)
   self.assertEqual(c.actions[1].operand.length, 6)
   self.assertEqual(c.actions[1].operand.data, data)
Esempio n. 35
0
    def _connect_serial_modem(self):
        self.dev = serial.Serial(
            port=self.config["device"],
            baudrate=self.config["baudrate"],
            timeout=None,
            parity=serial.PARITY_NONE,
            stopbits=serial.STOPBITS_ONE,
            bytesize=serial.EIGHTBITS,
            xonxoff=False,
            rtscts=False,
            dsrdtr=False,
            exclusive=True,
        )

        self.dev.flush()  # ignore possible buffered data
        self.start_reading()
        read_modem_info_action = Command.create_with_read_file_action_system_file(
            UidFile())
        read_modem_info_action.add_action(
            RegularAction(operation=ReadFileData(operand=DataRequest(
                offset=Offset(id=FirmwareVersionFile().id, offset=Length(
                    0)),  # TODO offset size
                length=FirmwareVersionFile().length))))

        resp_cmd = self.execute_command(read_modem_info_action,
                                        timeout_seconds=60)

        if len(resp_cmd) == 0:
            self.log.warning("Timed out reading node information")
            return False

        for action in resp_cmd[0].actions:
            if type(action) is RegularAction and type(
                    action.operation) is ReturnFileData:
                if action.operand.offset.id == SystemFileIds.UID.value:
                    self.uid = '{:x}'.format(
                        struct.unpack(">Q", bytearray(action.operand.data))[0])
                if action.operand.offset.id == SystemFileIds.FIRMWARE_VERSION.value:
                    self.firmware_version = FirmwareVersionFile.parse(
                        ConstBitStream(bytearray(action.operand.data)))

        if self.uid and self.firmware_version:
            return True

        return False
Esempio n. 36
0
 def test_create_with_read_file_action_d7asp(self):
   c = Command.create_with_read_file_action(file_id=1, length=10, interface_type=InterfaceType.D7ASP)
   self.assertEqual(len(c.actions), 2)
   self.assertEqual(type(c.actions[0]), RegularAction)
   self.assertEqual(type(c.actions[0].operation), Forward)
   self.assertEqual(type(c.actions[0].operand), InterfaceConfiguration)
   self.assertEqual(c.actions[0].operand.interface_id, 0xD7)
   self.assertEqual(type(c.actions[0].operand.interface_configuration), Configuration)
   # TODO configuration properties
   self.assertEqual(type(c.actions[1].operation), ReadFileData)
   self.assertEqual(type(c.actions[1].operand), DataRequest)
   self.assertEqual(type(c.actions[1]), RegularAction)
   self.assertEqual(type(c.actions[1].operation), ReadFileData)
   self.assertEqual(type(c.actions[1].operand), DataRequest)
   self.assertEqual(c.actions[1].operand.offset.id, 1)
   self.assertEqual(c.actions[1].operand.offset.size, 1)
   self.assertEqual(c.actions[1].operand.offset.offset, 0)
   self.assertEqual(c.actions[1].operand.length, 10)
Esempio n. 37
0
    def _connect_serial_modem(self):
        self.dev = serial.Serial(
            port=self.config["device"],
            baudrate=self.config["baudrate"],
            timeout=0.5,
        )

        read_modem_info_action = Command.create_with_read_file_action_system_file(
            UidFile())
        read_modem_info_action.add_action(
            RegularAction(operation=ReadFileData(operand=DataRequest(
                offset=Offset(id=FirmwareVersionFile().id,
                              offset=0),  # TODO offset size
                length=FirmwareVersionFile().length))))

        self.send_command(read_modem_info_action)

        # read thread not yet running here, read sync
        start_time = datetime.now()
        timeout = False
        while not timeout:
            commands, info = self.read()
            for command in commands:
                for action in command.actions:
                    if type(action) is RegularAction and type(
                            action.operation) is ReturnFileData:
                        if action.operand.offset.id == SystemFileIds.UID.value:
                            self.uid = '{:x}'.format(
                                struct.unpack(">Q",
                                              bytearray(
                                                  action.operand.data))[0])
                        if action.operand.offset.id == SystemFileIds.FIRMWARE_VERSION.value:
                            self.firmware_version = FirmwareVersionFile.parse(
                                ConstBitStream(bytearray(action.operand.data)))

                if self.uid and self.firmware_version:
                    return True

            if (datetime.now() - start_time).total_seconds() > 2:
                timeout = True
                self.log("Timed out reading node information")

        return False
Esempio n. 38
0
  def _connect_serial_modem(self):
    self.dev = serial.Serial(
      port     = self.config["device"],
      baudrate = self.config["baudrate"],
      timeout  = 0.5,
    )

    read_modem_info_action = Command.create_with_read_file_action_system_file(UidFile())
    read_modem_info_action.add_action(
      RegularAction(
        operation=ReadFileData(
          operand=DataRequest(
            offset=Offset(id=FirmwareVersionFile().id, offset=0),  # TODO offset size
            length=FirmwareVersionFile().length
          )
        )
      )
    )

    self.send_command(read_modem_info_action)

    # read thread not yet running here, read sync
    start_time = datetime.now()
    timeout = False
    while not timeout:
      commands, info = self.read()
      for command in commands:
        for action in command.actions:
          if type(action) is RegularAction and type(action.operation) is ReturnFileData:
              if action.operand.offset.id == SystemFileIds.UID.value:
                self.uid = struct.unpack(">Q", bytearray(action.operand.data))[0]
              if action.operand.offset.id == SystemFileIds.FIRMWARE_VERSION.value:
                self.firmware_version = FirmwareVersionFile.parse(ConstBitStream(bytearray(action.operand.data)))

        if self.uid and self.firmware_version:
          return True

      if (datetime.now() - start_time).total_seconds() > 2:
        timeout = True
        self.log("Timed out reading node information")

    return False
Esempio n. 39
0
    def run(self):
        # cmd = Command.create_with_return_file_data_action(file_id, data, interface_type=InterfaceType.HOST,interface_configuration=None)
        cmd = Command.create_with_return_file_data_action(file_id=40, data=[0x03],
                                                          interface_type=InterfaceType.D7ASP,
                                                          interface_configuration=D7config(
                                                              qos=QoS(resp_mod=ResponseMode.RESP_MODE_NO),
                                                              addressee=Addressee(access_class=0x11,
                                                                                  id_type=IdType.NOID)))
        #cmd = {0x32, 0xd7, 0x01, 0x00, 0x10, 0x01, 0x20, 0x01, 0x00}
        # cmd = {0x011}

        for x in range(5):
            print("Alert {} to node".format(x))
            try:
                ThingsBoard.execute_rpc_command(self.config.gateway1,
                                                [0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31])
            except:
                print("Gateway {} not reached.".format(self.config.gateway1))
            sleep(0.5)
            try:
                ThingsBoard.execute_rpc_command(self.config.gateway2,
                                                [0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31])
            except:
                print("Gateway {} not reached.".format(self.config.gateway2))
            sleep(0.5)
            try:
                ThingsBoard.execute_rpc_command(self.config.gateway3,
                                                [0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31])
            except:
                print("Gateway {} not reached.".format(self.config.gateway3))
            sleep(0.5)
            try:
                ThingsBoard.execute_rpc_command(self.config.gateway4,
                                                [0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31])
            except:
                print("Gateway {} not reached.".format(self.config.gateway4))
            sleep(1)
Esempio n. 40
0
    def start(self):
        self.received_commands = defaultdict(list)
        payload = range(self.config.payload_size)

        if self.receiver_modem != None:
            addressee_id = int(self.receiver_modem.uid, 16)
        else:
            addressee_id = int(self.config.unicast_uid, 16)

        if self.transmitter_modem != None:

            print(
                "\n==> broadcast, with QoS, transmitter active access class = 0x01 ===="
            )
            self.transmitter_modem.send_command(
                Command.create_with_write_file_action_system_file(
                    DllConfigFile(active_access_class=0x01)))
            interface_configuration = Configuration(
                qos=QoS(resp_mod=ResponseMode.RESP_MODE_ANY),
                addressee=Addressee(
                    access_class=0x01,
                    id_type=IdType.NBID,
                    id=CT(exp=0, mant=1)  # we expect one responder
                ))

            self.start_transmitting(
                interface_configuration=interface_configuration,
                payload=payload)
            self.wait_for_receiver(payload)

            print(
                "\n==> broadcast, no QoS, transmitter active access class = 0x01 ===="
            )
            self.transmitter_modem.send_command(
                Command.create_with_write_file_action_system_file(
                    DllConfigFile(active_access_class=0x01)))
            interface_configuration = Configuration(
                qos=QoS(resp_mod=ResponseMode.RESP_MODE_NO),
                addressee=Addressee(access_class=0x01, id_type=IdType.NOID))

            self.start_transmitting(
                interface_configuration=interface_configuration,
                payload=payload)
            self.wait_for_receiver(payload)

            print(
                "\n==> unicast, with QoS, transmitter active access class = 0x01"
            )
            interface_configuration = Configuration(
                qos=QoS(resp_mod=ResponseMode.RESP_MODE_ANY),
                addressee=Addressee(access_class=0x01,
                                    id_type=IdType.UID,
                                    id=addressee_id))

            self.start_transmitting(
                interface_configuration=interface_configuration,
                payload=payload)
            self.wait_for_receiver(payload)

            print(
                "\n==> unicast, no QoS, transmitter active access class = 0x01"
            )
            interface_configuration = Configuration(
                qos=QoS(resp_mod=ResponseMode.RESP_MODE_NO),
                addressee=Addressee(access_class=0x01,
                                    id_type=IdType.UID,
                                    id=addressee_id))

            self.start_transmitting(
                interface_configuration=interface_configuration,
                payload=payload)
            self.wait_for_receiver(payload)
        else:
            # receive only
            self.receiver_modem.start_reading()
            self.wait_for_receiver(payload)
Esempio n. 41
0
                                id_type=IdType.UID,
                                access_class=0x01,
                                id=CT(mant=3, exp=0)))))

# LORAWAN OTAA Example
# interface_file = InterfaceConfigurationFile(
#     interface_configuration=InterfaceConfiguration(
#         interface_id=InterfaceType.LORAWAN_OTAA,
#         interface_configuration=LoRaWANInterfaceConfigurationOTAA(
#             adr_enabled=True,
#             request_ack=True,
#             app_port=2,
#             data_rate=0,
#             device_eui=[0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07],
#             app_eui=[0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01],
#             app_key=[0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F]
#         )
#     )
# )

modem.execute_command(alp_command=Command.create_with_write_file_action(
    file_id=config.file_id,
    data=list(interface_file),
))

try:
    while True:
        pass
except KeyboardInterrupt:
    sys.exit(0)
Esempio n. 42
0
def on_write_local_system_file(data):
  file = jsonpickle.decode(json.dumps(data))
  cmd = Command.create_with_write_file_action_system_file(file)
  logging.info("executing cmd: {}".format(cmd))
  modem.execute_command_async(cmd)
  return {'tag_id': cmd.tag_id}
Esempio n. 43
0
argparser = argparse.ArgumentParser()
argparser.add_argument("-d", "--device", help="serial device /dev file modem",
                            default="/dev/ttyUSB0")
argparser.add_argument("-r", "--rate", help="baudrate for serial device", type=int, default=115200)
argparser.add_argument("-v", "--verbose", help="verbose", default=False, action="store_true")
config = argparser.parse_args()

configure_default_logger(config.verbose)

modem = Modem(config.device, config.rate, unsolicited_response_received_callback=received_command_callback)
modem.connect()
logging.info("Executing query...")
modem.execute_command_async(
  alp_command=Command.create_with_read_file_action(
    file_id=0x40,
    length=8,
    interface_type=InterfaceType.D7ASP,
    interface_configuration=Configuration(
      qos=QoS(resp_mod=ResponseMode.RESP_MODE_ALL),
      addressee=Addressee(
        access_class=0x11,
        id_type=IdType.NOID
      )
    )
  )
)

while True:
  sleep(5)
Esempio n. 44
0
argparser.add_argument("-s", "--serial", help="serial device /dev file", 
                       default="/dev/tty.usbserial-FTGCT0HY")
argparser.add_argument("-b", "--baudrate", help="baudrate for serial device", 
                       type=int, default=115200)

config = argparser.parse_args()

modem = Modem(config.serial, config.baudrate, show_logging=False)

cmd = Command.create_with_return_file_data_action(
    file_id=0x40,
    data=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    interface_type=InterfaceType.D7ASP,
    interface_configuration=Configuration(
      qos=QoS(resp_mod=QoS.RESP_MODE_NO),
      addressee=Addressee(
        access_class=0,
        id_type=IdType.BCAST
      )
    )
  )

last_message = 0

sent = 0
received = 0

def stats():
	print "sent", sent, "received", received

while True:
Esempio n. 45
0
  def start(self):
    self.received_commands = defaultdict(list)
    payload = range(self.config.payload_size)

    if self.receiver_modem != None:
      addressee_id = self.receiver_modem.uid
    else:
      addressee_id = int(self.config.unicast_uid, 16)

    if self.transmitter_modem != None:

      print("\n==> broadcast, with QoS, transmitter active access class = 0 ====")
      self.transmitter_modem.send_command(Command.create_with_write_file_action_system_file(DllConfigFile(active_access_class=0)))
      interface_configuration = Configuration(
        qos=QoS(resp_mod=ResponseMode.RESP_MODE_ANY),
        addressee=Addressee(
          access_class=2,
          id_type=IdType.NOID
        )
      )

      self.start_transmitting(interface_configuration=interface_configuration, payload=payload)
      self.wait_for_receiver(payload)

      print("\n==> broadcast, no QoS, transmitter active access class = 0 ====")
      self.transmitter_modem.send_command(Command.create_with_write_file_action_system_file(DllConfigFile(active_access_class=0)))
      interface_configuration = Configuration(
        qos=QoS(resp_mod=ResponseMode.RESP_MODE_NO),
        addressee=Addressee(
          access_class=2,
          id_type=IdType.NOID
        )
      )

      self.start_transmitting(interface_configuration=interface_configuration, payload=payload)
      self.wait_for_receiver(payload)

      print("\n==> unicast, with QoS, transmitter active access class = 0")
      interface_configuration = Configuration(
        qos=QoS(resp_mod=ResponseMode.RESP_MODE_ANY),
        addressee=Addressee(
          access_class=2,
          id_type=IdType.UID,
          id=addressee_id
        )
      )

      self.start_transmitting(interface_configuration=interface_configuration, payload=payload)
      self.wait_for_receiver(payload)

      print("\n==> unicast, no QoS, transmitter active access class = 0")
      interface_configuration = Configuration(
        qos=QoS(resp_mod=ResponseMode.RESP_MODE_NO),
        addressee=Addressee(
          access_class=2,
          id_type=IdType.UID,
          id=addressee_id
        )
      )

      self.start_transmitting(interface_configuration=interface_configuration, payload=payload)
      self.wait_for_receiver(payload)
    else:
      # receive only
      self.receiver_modem.start_reading()
      self.wait_for_receiver(payload)
Esempio n. 46
0
def on_read_local_system_file(data):
  print("read local system file")
  modem.send_command(
    Command.create_with_read_file_action_system_file(SystemFiles.files[SystemFileIds(int(data['system_file_id']))])
  )
Esempio n. 47
0

def received_command_callback(cmd):
  print cmd

argparser = argparse.ArgumentParser()
argparser.add_argument("-d", "--device", help="serial device /dev file modem",
                            default="/dev/ttyUSB0")
argparser.add_argument("-r", "--rate", help="baudrate for serial device", type=int, default=115200)
argparser.add_argument("-v", "--verbose", help="verbose", default=False, action="store_true")
config = argparser.parse_args()

modem = Modem(config.device, config.rate, receive_callback=received_command_callback, show_logging=config.verbose)
modem.d7asp_fifo_flush(
  alp_command=Command.create_with_read_file_action_system_file(
    file=UidFile(),
    interface_type=InterfaceType.D7ASP,
    interface_configuration=Configuration(
      qos=QoS(resp_mod=ResponseMode.RESP_MODE_ALL),
      addressee=Addressee(
        access_class=0,
        id_type=IdType.NOID
      )
    )
  )
)

modem.start_reading()
while True:
  pass