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")
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")
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)
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)
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)
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)
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))
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")
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}
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])
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)
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) )
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)
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)
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() }
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)
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)
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)
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)
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]
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)
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)
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]
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)
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)
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
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
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)
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)
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)
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)
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)
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)
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
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)
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
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
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)
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)
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)
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}
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)
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:
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)
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']))]) )
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