Какой протокол для команд, отправляемых через xbee.send()?

Я хотел бы использовать 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-накопитель?


person johndodo    schedule 11.08.2017    source источник


Ответы (1)


Как обычно, я нашел ответ вскоре после того, как спросил... Похоже, XBee ZB поддерживает два режима:

Цитировать:

Этот пример демонстрирует работу XBee в режиме AT. Режим 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).

Надеюсь, это поможет кому-то.

person johndodo    schedule 11.08.2017