Мой скрипт отслеживает изменения состояния моего удаленного xbee. Для этого мне нужно отправить маршрутизатору длинный адрес назначения, который я получаю от координатора. Все работает хорошо, если я явно ввожу длинный адрес назначения, например:
addr = '\x00\x13\xA2\x00@\n!\x1C'
xbee.remote_at(dest_addr_long=addr, command=mycommand, frame_id='\x01')
и это дает мне желаемый вывод данных, который
{'status': '\x00', 'source_addr': '\x7fD', 'source_addr_long': '\x00\x13\xa2\x00@\n!\x1c', 'frame_id': '\x01', ' команда': 'D0', 'параметр': '\x05', 'id': 'remote_at_response'}
из которого я могу прочитать параметр для определения состояния xbee.
Проблема, с которой я сталкиваюсь, заключается в том, что я не знаю адрес заранее. Я получаю это, когда запускаю эту команду
mysourceaddrlong = repr(data['source_addr_long'])[1:-1]
addr = "\\".join([(i[0]+i[1:].upper()) for i in mysourceaddrlong.split('\\') if i])
addr = addr[1:] #remove the x in front
addr = r"\x"+addr #add \x to the front and save it as a raw string
print "Formatted addr: %s" % addr
Что выводит:
Форматированный адрес: \x00\x13\xA2\x00@\n!\x1C Этот форматированный адрес кажется мне точно таким же, но он не работает, когда я запускаю свою команду at следующим образом:
xbee.remote_at(dest_addr_long=addr, command=mycommand, frame_id='\x01')
я получаю сообщение об ошибке
ValueError: данные, предоставленные для «dest_addr_long», не имеют длины 8 байт.
Я включил весь скрипт ниже:
#! /usr/bin/python
import serial
import time
from xbee import XBee
ser = serial.Serial('/dev/ttyUSB0', 9600)
xbee = XBee(ser)
def print_data(data):
print data
mycommand = data['command']
mysourceaddrlong = repr(data['source_addr_long'])[1:-1]
addr = "\\".join([(i[0]+i[1:].upper()) for i in mysourceaddrlong.split('\\') if i])
print "incorrectly formatted addr: %s" % addr
addr = addr[1:] #remove the x in front
addr = r"\x"+addr #add \x to the front and save it as a raw string
print "formatted addr: %s" % addr
try:
xbee.remote_at(dest_addr_long=addr, command=mycommand, frame_id='\x01')
response = xbee.wait_read_frame()
myhexparameter = response['parameter']
myparameter = ord (myhexparameter)
if myparameter == 4:
print "Which means pin %s is OFF" % mycommand
if myparameter == 5:
print "Which means pin %s is ON" % mycommand
except KeyboardInterrupt:
pass
xbee = XBee(ser, callback=print_data)
while True:
try:
time.sleep(0.001)
except KeyboardInterrupt:
break
xbee.halt()
ser.close()