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 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 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_simple_received_return_file_data_command_with_tag_request(self): cmd = Command( tag_id=25, 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_id=ChannelID( channel_header=ChannelHeader( channel_band=ChannelBand.BAND_433, channel_class=ChannelClass.LO_RATE, channel_coding=ChannelCoding.PN9), 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 = [ 0xB4, # tag request with send response bit set 25, # tag ID 0x62, # Interface Status action 0xD7, # D7ASP interface 32, # channel header 0, 16, # channel_id 70, # rxlevel (- dBm) 80, # link budget 80, # target rx level 0, # status 200, # fifo token 0, # seq 20, # response timeout 0x10, # addressee ctrl (NOID) 0, # access class 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])
config.timeout = 255 emFile = EngineeringModeFile(mode=mode, flags=0, timeout=config.timeout, channel_id=ch, eirp=config.eirp) stop = False signal.signal(signal.SIGINT, cleanup) print(list(emFile)) if not config.not_exe: modem = Modem(config.device, config.rate, unsolicited_response_received_callback=received_command_callback, rebooted_callback=rebooted_callback) modem.connect() cmd = Command() if config.forward: cmd.add_forward_action( interface_type=InterfaceType.D7ASP, interface_configuration=Configuration( qos=QoS(resp_mod=ResponseMode.RESP_MODE_PREFERRED, retry_mod=RetryMode.RETRY_MODE_NO), addressee=Addressee( access_class=0x11, id_type=IdType.NBID, id=CT.compress(2) ) ) ) if (config.factory_gaussian != 0xFF) or (config.factory_paramp != 0xFF):
argparser.add_argument("-t", "--temperature", help="temperature threshold value (in degrees C)", type=float, default=0) config = argparser.parse_args() configure_default_logger(config.verbose) modem = Modem(config.device, config.rate, unsolicited_response_received_callback=received_command_callback) modem.connect() # command to be executed as an action: first do an arithmetic comparison of the sensor value with the supplied value... query_sensor_file_cmd = Command(generate_tag_request_action=False) query_sensor_file_cmd.add_action( RegularAction(operation=BreakQuery(operand=QueryOperand( type=QueryType.ARITH_COMP_WITH_VALUE, mask_present=False, params=ArithQueryParams(signed_data_type=False, comp_type=ArithComparisonType.GREATER_THAN), compare_length=Length(2), compare_value=[ ord(b) for b in struct.pack(">H", int(config.temperature * 10)) ], file_a_offset=Offset(id=0x40, offset=Length(0)))))) # ...if the query succeeds, read the file query_sensor_file_cmd.add_action( RegularAction(operation=ReadFileData(