通过xbee.send()发送的命令的协议是什么?

时间:2017-08-11 11:09:46

标签: python xbee zigbee mesh-network

我想使用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记忆棒控制传感器?

1 个答案:

答案 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)。

希望它有所帮助。