我想使用Digi XStick2 ZB
(通过USB连接并在/dev/ttyUSB0
上作为串行接口连接)作为ZigBee控制器用于一堆ZigBee传感器和执行器(温度和湿度,接触传感器,水)泄漏,电源插头,...)。换句话说,我正在寻找配置网状网络和与传感器/执行器通信的方法。
我找到python xbee并编写了一个简单的python脚本来与USB记忆棒进行通信:
#!/usr/bin/python
import serial
import time
from xbee import ZigBee
def print_data(data):
print "Data received:", data
serial_port=serial.Serial('/dev/ttyUSB0', 9600)
zbee = ZigBee(serial_port, callback=print_data)
print "Sending some command"
zbee.send("at", frame='A', command='MY', parameter=None)
print "Waiting..."
while True:
try:
time.sleep(0.001)
except KeyboardInterrupt:
break
zbee.halt()
serial_port.close()
它有效,我对我的命令得到了一些回应:
$ ./test.py
Sending some command
Waiting...
Data received: {'status': '\x00', 'frame_id': '\x01', 'parameter': '\x00\x00', 'command': 'MY', 'id': 'at_response'}
但是我找不到任何关于所用协议的信息(即我可以发送的消息的内容) - 我可以使用一些命令参考或协议定义吗?
或者,是否有更简单的方法(更高级别的库?)通过USB记忆棒控制传感器?
答案 0 :(得分:0)
像往常一样,我在问完后不久就找到了答案......我看起来像XBee ZB支持两种模式:
引用:
此示例演示了AT模式下的XBee操作。 AT模式是 与“透明”模式同义。在AT模式下,任何数据都会发送到 XBee模块立即发送到标识的远程模块 目标地址在内存中。当模块处于AT模式时,它可以 由用户或主机微控制器首先放置 模块处于命令模式,然后发送预定义的AT命令 通过UART端口。当您不需要时,此模式非常有用 经常更改目标地址,或者您有一个非常简单的地址 网络,或简单的点对点通信。对于更大的网络 涉及节点与多个目标通信,API模式更多 有用。在API模式下,而不是串行发送AT命令,数据 组装的数据包包括目标地址。 API模式 允许您更快地更改目标地址,因为 不需要输入命令模式。如果,API模式也很有用 用户需要更改远程模块的配置。这个 项目侧重于AT模式操作。
文章包含两种模式的文档链接:https://eewiki.net/download/attachments/24313921/XBee_ZB_User_Guide.pdf?version=1&modificationDate=1380318639117&api=v2
现在是一个简短的工作示例:
#!/usr/bin/python
import serial
import time
from xbee import ZigBee
def print_data(data):
print "Data received:", data
serial_port=serial.Serial('/dev/ttyUSB0', 9600)
xbee = ZigBee(serial_port, callback=print_data)
xbee.send("at", frame='A', command='SH', parameter=None)
xbee.send("at", frame='A', command='SL', parameter=None)
while True:
try:
time.sleep(0.001)
except KeyboardInterrupt:
break
xbee.halt()
serial_port.close()
输出:
Data received: {'status': '\x00', 'frame_id': '\x01', 'parameter': '\x00\x01\x02\x03', 'command': 'SH', 'id': 'at_response'}
Data received: {'status': '\x00', 'frame_id': '\x01', 'parameter': '\x04\x05\x07\x07', 'command': 'SL', 'id': 'at_response'}
这将检索控制器的序列号(在这种情况下为01020304050607
)。
希望它有所帮助。