Каков протокол для команд, отправляемых через xbee.send()?
Я хотел бы использовать Digi XStick2 ZB
(подключен через USB и отображается как последовательный интерфейс /dev/ttyUSB0
) в качестве контроллера ZigBee для группы датчиков и исполнительных механизмов ZigBee (температура и влажность, контактный датчик, утечка воды, штепсельная вилка,...). Другими словами, я ищу способ настройки ячеистой сети и связи с датчиками / исполнительными механизмами.
Я нашел python xbee и написал простой скрипт на python для связи с флешкой:
#!/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 ответ
Как обычно, я нашел ответ вскоре после того, как спросил... Похоже, XBee ZB поддерживает два режима:
- Режим AT: https://eewiki.net/display/Wireless/XBee+AT+Mode+-+Transmit+and+Command+Mode+Example
- Режим API: https://eewiki.net/display/Wireless/XBee+API+Mode+-+Read+Remote+ADC+Example
Цитировать:
Этот пример демонстрирует работу 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
в этом случае).
Надеюсь, это поможет кому-то.