我无法让python-xbee库从我的远程路由器接收响应 . 他们是联系在一起的 . 本地Xbee是协调器API,远程是Router AT .
它似乎不是连接问题,因为我可以使用XCTU发送和接收远程数据包而不会出现问题 . 我正在使用Series 2 Xbees .
我添加了一个类来帮助解析序列响应 . 它打印出本地'at'命令的罚款,但所有'remote_at'命令都挂起,没有打印响应 . 我可以发出remote_at命令(无需等待响应)并由远程XBee正确处理 . 发出远程命令挂起在wait_read_frame() . 我试过等了几分钟,但它只是卡住了 .
我正在尝试查询D1输入引脚并恢复其状态(高 \x05
,低 \x04
或关闭 \x00
)
这是我用来调试的代码 . 我究竟做错了什么?
from xbee import XBee
import time
from serial import Serial
PORT = '/dev/ttyAMA0'
myRouter = 'a big long hex string...'
def message_received(data):
print data
class TappedSerial(Serial):
def __init__(self, *args, **kwargs):
super(TappedSerial, self).__init__(*args, **kwargs)
def read(self, *args, **kwargs):
data = super(Serial, self).read(*args, **kwargs)
print ("read: ", repr(data))
return data
def write(self, data, **kwargs):
print("wrote: ", repr(data))
return super(Serial, self).write(data, **kwargs)
def main():
tapped_ser = TappedSerial(port=PORT, baudrate=9600)
xbee = XBee(tapped_ser) #, callback=message_received)
try:
xbee.remote_at(dest_addr_long=myRouter, command='D1', options='\x00')
response = xbee.wait_read_frame()
print(response)
except KeyboardInterrupt:
pass
finally:
tapped_ser.close()
print("exiting program")
if __name__ == '__main__':
main()
2 回答
我注意到设置库的两件事:
在我签出的版本中,在base.py第74行中,如果设置了回调,则启动后台线程的代码被注释掉 . 既然你有读取请求,我认为这不是你的问题,而是保留以防万一其他人带着类似的问题来到这里 . 您可以手动调用xbee.start()以使线程运行 .
我发现在这种情况下启用python日志比tappedSerial更有用 - 我通过在顶部添加以下内容来启用日志记录:
这显示我在我的ND响应中添加了4个字节,因为我没有设置为3而不是0.我将发送一个拉取请求,如果已定义,则将DD值附加到参数,由长度关闭4确定 .
答:您需要在数据包中包含frame_id . 来自John Foster的XBee Cookbook:
将frame_id添加到数据包会得到响应 . 任何任意字符(0除外)都有效 .