Сразу скажу, чего вы в этой статье не найдете:
Ворнинг для дизайнеров: в посте есть картинка, лучше не смотрите на нее. От необходимости писать подобный ворнинг для программистов я себя избавил, избежав соблазна опубликовать Python-скрипты и thml-код страницы, показанной на картинке (шаблон генерился в Word).
Предполагается, что вы сами-с-усами, способны найти нужную информацию в интернете и обладаете нужными знаниями. Задача статьи – достаточно крупными штрихами описать способ интеграции XBee и Ethernet/Wi-Fi роутера, привести простенький пример работающей системы, указать направления дальнейшего развития.
Поехали.
Я всегда думал, что XBee/Zigbee /Прочее-bee – это такой беспроводной удлинитель UART-a. Поэтому мне всегда было непонятно – почему же оно такое дорогое. Но тут товарищ дал мне два модуля XBee на «поиграться», я притащил их домой, немедленно угробил один из них при перепрошивке, обратился в саппорт Digi (производителя XBee: www.digi.com), несмотря на высокий уровень поддержки умудрился неправильно выполнить инструкции, закрыл кейс и, собственно остался с «горелой» железячкой на руках, которую надо было как-то возвращать. Как всегда пришлось копаться, разбираться, материться и биться головой об стол. В результате многодневных плясок с бубном я узнал, что:
В общем все хорошо, есть у нас сеть датчиков и исполнителей, все сообщения между ними роутятся, друг с другом они общаются через роутеры, координатор сидит сверху и за всем этим наблюдает. Проблема в том, что у нас, человеков, нет точки входа в эту сеть. Простейшее решение: USB-UART конвертер, включаем комп, запускаем терминал или специальную программу (например программу от digi: X-CTU или другие, типа XBee-Operator, или вообще сами пишем скрипты на питоне, на сайте digi.com есть подключаемые модули для работы с XBee). Плохо то, что если мы хотим иметь информацию о состоянии датчиков в удобоваримом виде всегда и отовсюду, то комп, даже с запущенным веб-сервером, выпяченным в интернет – не самое изящное решение.
Более изящное решение – использовать постоянно включенный и смотрящий напрямую в инет роутер. Подойдет любой роутер, имеющий УАРТ и к консоли которого есть доступ. Я использую старый добрый ASUS wl500gP с прошивкой от Олега (wl500g.info), более модно сейчас использовать TP-Link, DLink и прочие махонькие коробочки, жрущие на порядок меньше энергии и на которых можно распаять UART и вкорячить туда Open-WRT прошивку. Как это делать – в гугл. Вот пример: wiki.openwrt.org/ru/toh/tp-link/tl-mr3420. Интересуют пункты Установка и Последовательный порт.
ВАЖНО: XBee – это 3,3В устройство. Если подать на него 5В, оно запечется.
Берем XBee, подключаем к USB-UART переходнику, втыкаем в комп, запускаем X-CTU, прошиваем нужной прошивкой. Простейший вариант – ZB24 Coordinator AT (да, к этому моменту уже надо знать, чем отличаются прошивки для XBee, какая роль устройства нужна и т.д. Нужно почитать в инете, начать неплохо отсюда: The Unofficial XBee FAQ (version 1.3) (англ) или с книжки Robert Faludi — Building Wireless Sensor Networks with ZigBee, XBee, Arduino, and Processing. Отсоединяем XBee от переходника и от компа, и подключаем к последовательному порту роутера.
Проверяем работоспособность. Запускаем minicom, подключаемся к порту, на котором висит XBee на скорости, на которую настроен XBee (у меня –D/dev/ttyS1 –S115200). Входим в режим АТ-команд: нажимаем три раза «+» (и больше ничего!). Через секунду XBee должна ответить “OK”,, что значит, что она вошла в режим команд. Из режима можно выйти, введя команду ATCN<ввод> или подождав 10 секунд. В принципе на этом все, можно уже с этим портом делать все, что угодно. Например, прописать в автозагрузку ser2net, и замапить /dev/ttyS1 на TCP-порт, например 2000. После этого с любой машины в сети можно подключиться к роутеру телнетом или поставить софт на машине, которая замапит обратно удаленный ТСП-порт на локальный сериал.
У меня на роутере стоит Python-интерпретатор. Раз в час cron дергает несколько скриптов. Один из скриптов открывает последовательный порт, на котором висит XBee и отправляет запрос на удаленное устройство (которое стоит в ванной на стояке): ‘gv’. Устройство отвечает строками: ‘hw25.054cw0.000\r\n’ и ‘v8.72\r\n’, что значит, что счетчик горячей воды накрутил 25.054 кубометра воды, холодный накрутил 0 кубометров (конечно, он же не подключен), и что напряжение батареи 8,72 вольта. Скрипт берет эти значения и пишет их в файл. Другой скрипт, который cron дергает раз в пять минут, пакует эти значения в html-шаблон и сохраняет как index.html в папке /opt/share/www/. На роутере также поднят lighttpd, который при обращении на адрес роутера отдает эту статическую страницу. Таким образом я и моя жена можем в любой момент узнать показания водосчетчиков не вставая с дивана.
![](https://webcf.waybackmachine.org/web/20221202031922im_/https://habrastorage.org/r/w780q1/storage2/5ed/87c/8f5/5ed87c8f52a6a1a693f4c746f3215b68.jpg)
Да что угодно.
• Напоминать о том, что цветы не политы (мерять влажность земли в горшках и паниковать, когда земля высохнет)
• Кормить животных, будучи в отъезде
• Выключать свет, открывать дверь, топить баню, закрывать окна и прочее прочее прочее. Все ограничивается только фантазией.
Ну, самое, наверное, очевидное – сделать динамический опрос датчиков. То есть прописать питон как fast-cgi модуль в lighttpd и напрямую обращаться к скриптам из браузера
Дальше, у digi есть софт iDigi Dia – фактически консоль управления. Используя его, можно отдавать команды XBee датчикам, заливать на них удаленно прошивки, ресеттить их и т.д.
У digi также есть клауд (http://www.idigi.com/). То есть можно связать отдельаные датчики или целые сети с клаудом, где будет крутиться управляющий софт и иметь к нему доступ отовсюду.
Есть еще куча коннекторов (http://www.idigi.com/idigiconnector/) — в общем раздолье для человека с головой и навыками
Есть софт, написанный сторонними разработчиками. Например XIG (xig.googlecode.com) – Xbee Internet Gateway. Это транслятор web<->xbee. Например, он может при поступлении данных о состоянии датчика прикрутить эти данные хвостом к get-запросу и отправить этот запрос на удаленный сервер. Или по запросу от XBee скачать информацию с определенного сайта.
В общем, много чего можно. Подключение четырех проводков от роутера к XBee – это всего лишь первый шаг к Internet of Things. Но даже этот первый шажок сделать очень интересно.
- Подробного описания протокола Zigbee
- Подробного описания трансиверов XBee
- Теории и практических рекомендаций по построению mesh drop-in сетей
- Инструкций по работе с Linux
- Инструкций по перепрошивке роутеров и по работе с прошивками от Олега и Open-WRT
Ворнинг для дизайнеров: в посте есть картинка, лучше не смотрите на нее. От необходимости писать подобный ворнинг для программистов я себя избавил, избежав соблазна опубликовать Python-скрипты и thml-код страницы, показанной на картинке (шаблон генерился в Word).
Предполагается, что вы сами-с-усами, способны найти нужную информацию в интернете и обладаете нужными знаниями. Задача статьи – достаточно крупными штрихами описать способ интеграции XBee и Ethernet/Wi-Fi роутера, привести простенький пример работающей системы, указать направления дальнейшего развития.
Поехали.
XBee
Я всегда думал, что XBee/Zigbee /Прочее-bee – это такой беспроводной удлинитель UART-a. Поэтому мне всегда было непонятно – почему же оно такое дорогое. Но тут товарищ дал мне два модуля XBee на «поиграться», я притащил их домой, немедленно угробил один из них при перепрошивке, обратился в саппорт Digi (производителя XBee: www.digi.com), несмотря на высокий уровень поддержки умудрился неправильно выполнить инструкции, закрыл кейс и, собственно остался с «горелой» железячкой на руках, которую надо было как-то возвращать. Как всегда пришлось копаться, разбираться, материться и биться головой об стол. В результате многодневных плясок с бубном я узнал, что:
- Zigbee – это протокол такой. Для маломощных беспроводных меш-сетей
- XBee – это бренд, беспроводные модули для коммуникации с использованием разных протоколов (Zigbee, Wi-Fi, BlueTooth и т.д.)
- У меня в руках оказались милливатные модули XBee Pro (Series 2, ZB-функциональность)
- XBee может не только прокидывать УАРТ (в «прозрачном» или «АПИ» режимах), у него также есть GPIO/аналоговые входы, что позволяет удаленно дергать ногами (их пять, что ли) или считывать значения на ногах – в терминологии Arduino digitalRead(т.е. HIGH/LOW) и analogRead(т.е. АЦП – напряжение на ноге). Т.е. к определенным образом настроенной XBEE можно подключить питание и датчик (например, датчик температуры), и она будет сама или по запросу слать значение напряжения координатору
- В Zigbee-сетях устройства могут выполнять одну из следующих ролей:
- Координатор – может быть только один в сети, никогда не спит – главный по палате
- Роутер – может быть много в сети, никогда не спит, служит узловой точкой и может выполнять функции оконечного устройства
- Оконечное устройство – чаще всего кормится от автономного источника питания, в этом случае львиную долю времени дрыхнет, периодически просыпаясь и пингуя своего хозяина (роутера или координатора) и проверяя, нет ли для него сообщений. Может выполнять мелкую работу навроде той, что описана в предыдущем пункте, т.е. дергать ногами или семплить входы.
- XBee реально сложно убить, если не превышать максимальные значения по напряжению. В нее встроен бутлоадер и если что-то пошло не так, можно комбинацией из трех пальцев войти в режим бутлоадера и вернуть модуль в дефолтное состояние или прошить нужную прошивку
В общем все хорошо, есть у нас сеть датчиков и исполнителей, все сообщения между ними роутятся, друг с другом они общаются через роутеры, координатор сидит сверху и за всем этим наблюдает. Проблема в том, что у нас, человеков, нет точки входа в эту сеть. Простейшее решение: USB-UART конвертер, включаем комп, запускаем терминал или специальную программу (например программу от digi: X-CTU или другие, типа XBee-Operator, или вообще сами пишем скрипты на питоне, на сайте digi.com есть подключаемые модули для работы с XBee). Плохо то, что если мы хотим иметь информацию о состоянии датчиков в удобоваримом виде всегда и отовсюду, то комп, даже с запущенным веб-сервером, выпяченным в интернет – не самое изящное решение.
Роутер
Более изящное решение – использовать постоянно включенный и смотрящий напрямую в инет роутер. Подойдет любой роутер, имеющий УАРТ и к консоли которого есть доступ. Я использую старый добрый ASUS wl500gP с прошивкой от Олега (wl500g.info), более модно сейчас использовать TP-Link, DLink и прочие махонькие коробочки, жрущие на порядок меньше энергии и на которых можно распаять UART и вкорячить туда Open-WRT прошивку. Как это делать – в гугл. Вот пример: wiki.openwrt.org/ru/toh/tp-link/tl-mr3420. Интересуют пункты Установка и Последовательный порт.
Собираем
ВАЖНО: XBee – это 3,3В устройство. Если подать на него 5В, оно запечется.
Берем XBee, подключаем к USB-UART переходнику, втыкаем в комп, запускаем X-CTU, прошиваем нужной прошивкой. Простейший вариант – ZB24 Coordinator AT (да, к этому моменту уже надо знать, чем отличаются прошивки для XBee, какая роль устройства нужна и т.д. Нужно почитать в инете, начать неплохо отсюда: The Unofficial XBee FAQ (version 1.3) (англ) или с книжки Robert Faludi — Building Wireless Sensor Networks with ZigBee, XBee, Arduino, and Processing. Отсоединяем XBee от переходника и от компа, и подключаем к последовательному порту роутера.
XBee | Router |
VDD (pin 1) | +3,3V |
VSS (pin 10) | GND |
DOUT (pin 2) | RX |
DIN (pin 3) | TX |
Проверяем работоспособность. Запускаем minicom, подключаемся к порту, на котором висит XBee на скорости, на которую настроен XBee (у меня –D/dev/ttyS1 –S115200). Входим в режим АТ-команд: нажимаем три раза «+» (и больше ничего!). Через секунду XBee должна ответить “OK”,, что значит, что она вошла в режим команд. Из режима можно выйти, введя команду ATCN<ввод> или подождав 10 секунд. В принципе на этом все, можно уже с этим портом делать все, что угодно. Например, прописать в автозагрузку ser2net, и замапить /dev/ttyS1 на TCP-порт, например 2000. После этого с любой машины в сети можно подключиться к роутеру телнетом или поставить софт на машине, которая замапит обратно удаленный ТСП-порт на локальный сериал.
Пример
У меня на роутере стоит Python-интерпретатор. Раз в час cron дергает несколько скриптов. Один из скриптов открывает последовательный порт, на котором висит XBee и отправляет запрос на удаленное устройство (которое стоит в ванной на стояке): ‘gv’. Устройство отвечает строками: ‘hw25.054cw0.000\r\n’ и ‘v8.72\r\n’, что значит, что счетчик горячей воды накрутил 25.054 кубометра воды, холодный накрутил 0 кубометров (конечно, он же не подключен), и что напряжение батареи 8,72 вольта. Скрипт берет эти значения и пишет их в файл. Другой скрипт, который cron дергает раз в пять минут, пакует эти значения в html-шаблон и сохраняет как index.html в папке /opt/share/www/. На роутере также поднят lighttpd, который при обращении на адрес роутера отдает эту статическую страницу. Таким образом я и моя жена можем в любой момент узнать показания водосчетчиков не вставая с дивана.
![](https://webcf.waybackmachine.org/web/20221202031922/https://habrastorage.org/storage2/5ed/87c/8f5/5ed87c8f52a6a1a693f4c746f3215b68.jpg)
Что еще можно делать
Да что угодно.
• Напоминать о том, что цветы не политы (мерять влажность земли в горшках и паниковать, когда земля высохнет)
• Кормить животных, будучи в отъезде
• Выключать свет, открывать дверь, топить баню, закрывать окна и прочее прочее прочее. Все ограничивается только фантазией.
Что дальше?
Ну, самое, наверное, очевидное – сделать динамический опрос датчиков. То есть прописать питон как fast-cgi модуль в lighttpd и напрямую обращаться к скриптам из браузера
Дальше, у digi есть софт iDigi Dia – фактически консоль управления. Используя его, можно отдавать команды XBee датчикам, заливать на них удаленно прошивки, ресеттить их и т.д.
У digi также есть клауд (http://www.idigi.com/). То есть можно связать отдельаные датчики или целые сети с клаудом, где будет крутиться управляющий софт и иметь к нему доступ отовсюду.
Есть еще куча коннекторов (http://www.idigi.com/idigiconnector/) — в общем раздолье для человека с головой и навыками
Есть софт, написанный сторонними разработчиками. Например XIG (xig.googlecode.com) – Xbee Internet Gateway. Это транслятор web<->xbee. Например, он может при поступлении данных о состоянии датчика прикрутить эти данные хвостом к get-запросу и отправить этот запрос на удаленный сервер. Или по запросу от XBee скачать информацию с определенного сайта.
В общем, много чего можно. Подключение четырех проводков от роутера к XBee – это всего лишь первый шаг к Internet of Things. Но даже этот первый шажок сделать очень интересно.