首页 文章

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

提问于
浏览
0

我想使用 Digi XStick2 ZB (通过USB连接并在 /dev/ttyUSB0 上作为串行接口连接)作为ZigBee控制器用于一堆ZigBee传感器和 Actuator (温度和湿度,接触传感器,漏水,电源插头......) . 换句话说,我正在寻找配置网状网络和与传感器/ Actuator 通信的方法 .

我找到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

    像往常一样,我在询问后不久就找到了答案......我看起来像XBee ZB支持两种模式:

    报价:

    此示例演示了AT模式下的XBee操作 . AT模式与“透明”模式同义 . 在AT模式下,发送到XBee模块的任何数据都会立即发送到内存中目标地址标识的远程模块 . 当模块处于AT模式时,可以由用户或主机微控制器配置,首先将模块置于命令模式,然后通过UART端口发送预定义的AT命令 . 当您不需要经常更改目标地址,或者您拥有非常简单的网络或简单的点对点通信时,此模式非常有用 . 对于涉及节点与多个目标通信的大型网络,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 ) .

    希望它可以帮助某人 .

相关问题