Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
ropox
7 лет назад

MQTT

Что же такое Mqtt и зачем оно понадобилось моему умному дому. Все на самом деле очень просто. Mqtt это средство общения для устройств. Что то вроде WhatsApp, в мире интернета вещей. Протокол общения Mqtt очень прост и легковесный. Сообщения пересылаются в виде простого текста, практически без всяких ограничений. Библиотек для Mqtt очень много, практически под любую платформу и язык программирования и это стандарт де факто если требуется общение двух и более устройств. Mqtt был предложен еще в прошлом веке :) и стандартизирован.

Как это работает. Собственно все очень просто. Любой mqtt клиент может создать сообщение с любым топиком. Топик это строка, обычно сформированная как URI. К примеру в умном доме могут быть полезны следующие топики:

smarthome/kitchen/light
smarthome/kitchen/fan
smarthome/kitchen/temperature
smarthome/livingroom/light
smarthome/livingroom/tv

В тексте сообщения можно послать все, что угодно. “on”, “off”, “true”, “ready”, “42”, {“state”:”off”}. Это дело клиента как он интерпретирует сообщение.

Аналогично любой клиент может подписаться на любой топик. Как только сообщение с таким же топиком будет создано, все клиенты подписанные на этот топик получат это сообщение. Клиенты могут подписаться на целую группу топиков указав заполнитель.

К примеру подписавшись на "smarthome/#" клиент будет получать все сообщения вашего умного дома. Или подписавшись на "smarthome/+/light" клиент будет получать сообщения от всех ламп освещения, неважно в какой комнате они находятся. К примеру если вы хотите организовать логирование всех значений и строить графики, то это очень удобный инструмент.

Топики не нужно как то заранее определять, прописывать в конфигурационные файлы и тп.. Можно задавать любое имя, а mqtt сервер (или как обычно говорят mqtt брокер, те. посредник), сам создаст этот топик если понадобится.

Еще один момент касается создания сообщений. Во всех реализациях помимо топика и текста сообщения нужно указать, будет ли топик персистентным, то-есть сохраняться в mqtt брокере при потере соединения. Персистентные топики бывают необходимы, когда требуется гарантированная доставка сообщения, даже если подписчик временно отключился. В этом случае сообщение с приоритетами 1 и 2 будет дожидаться подписчика на сервере, пока тот снова не подключится к брокеру. В моем умном доме мне пока не пришлось этим пользоваться. Также при создании топика нужно указать приоритет сообщения. Так как мне лично приоритет не важен, я создаю все сообщения с приоритетом 1. У меня относительно не так много устройств, потому пока это не важно.

Ну а теперь немного практики. У меня все работает на banana pi под управлением debian. В качестве Mqtt брокера я использую стандартный для таких случаев debian пакет mosquitto. Он есть в дистрибутиве и установить его можно aptitude.

sudo apt-get install mosquitto

Я у себя лично конфигурацией не занимался, мне было достаточно конфигурации по умолчанию. Проверить конфигурацию можно в папке /etc/mosquitto. По умолчанию mosquitto слушает на порту 1883. По идее, после установки дебиан сам запустит mosquitto, но можно проконтролировать запустив его вручную.

sudo /etc/init.d/mosquitto start

Проверить работу mqtt брокера можно mosquitto_sub командой.

mosquitto_sub -v -t "zway/#"

Где -v значит распечатывать дополнительно к сообщению имя топика, -t "zway/#" это на какой топик подписаться. В данном случае я подписался на все топики в которые пишет Z-Way сервер.

Вот пример вывода на экран после того как я пощелкал выключателями.

Вывод

Я живу в Германии, потому все обозвал по немецки. Как видно, я пощелкал выключателем управляющим лампой в игровой зоне (“switchGameZoneTisch”) - выключил и включил. Потом я попросил Алексу включить и выключить свет в зале (“dimmerWohnzinmmerLampe”). Так как диммер яркость увеличивает плавно, видно, что диммер успел послать два сообщения с уровнем яркости 11 и 30. Ну еще попутно срабатывал датчик движения “zway/sensorGameZoneBewegungsmelder” пока я маячил перед ним.

Кстати интересный момент. Видно, что сначала было сообщение “on” в топик “zway/dimmerWohnzimmerLampe/command”. Почему было передано “on” в топик с дополнительным уровнем “/command”, а все значения были посланы лампой в топик “zway/dimmerWohnzimmerLampe”? Дело в том, что если я подпишу диммер на топик “zway/dimmerWohnzimmerLampe”, чтобы принимать команды и состояние диммера буду слать в этот же топик, то получится бесконечный цикл. У меня так один раз случилось. Была веселая стробоскопическая дискотека. Поэтому для получения команд я подписываюсь на топик с дополнительным уровнем “/command”, а значения пишу с топиком уровнем выше.

Почему я назвал свои устройства так а не иначе. Это старый программистский трюк, называется “naming convention”. Когда есть система по которой называются устройства, то легко реконструировать имя устройства, даже если не помнишь как оно называется точно. Это многократно уменьшает риск опечатки и как следствие появление непонятных проблем. “zway/” в начале, значит, что устройство подключено к Z-Way серверу. Так как в начале у меня был только zway сервер я выбрал этот префикс. Потом идет имя устройства. Начинается с типа устройства “switch”, “dimmer”, sensor”. Потому комната, и в конце назначение. Ну и плюс “/command” для управляющего топика.

Какую систему именования вы себе придумаете не важно, лишь бы была, иначе может получиться большая путаница. Можно создавать топики как в первом примере smarthome/{место}/{имя устройства}. Это как вам удобнее.

Для платформы android кстати имеется много бесплатных mqtt клиентов, которые позволяют создавать пульты управления для умного дома. Можно к примеру сделать набор кнопок, каждую кнопку привязать к своему топику и назначить сообщение, которое будет посылаться по нажатию кнопки. Приложения в массе своей неказисты, но дело свое делают. Если установили Mqtt брокер, можно поиграться посылая сообщения с такого клиента.

Позже я напишу на примере NodeMCU как общаться по Mqtt. Или напишу про Node-RED и почему я его использую.

13
52.948 GOLOS
На Golos с February 2017
Комментарии (0)
Сортировать по:
Сначала старые