Что такое MQTT?
MQTT или Message Queue Telemetry Transport – это легкий открытый протокол обмена данными, работающий поверх TCP/IP, созданный для унификации обмена данных между устройствами M2M (Машинно-Машинное взаимодействие) и IIoT (Промышленный Интернет вещей).
Идеален для использования в контроллерах и датчиках где требуется небольшой размер кода и есть ограничения по пропускной способности канала.
Особенности протокола MQTT
Основные особенности протокола MQTT:
- Асинхронный протокол
- Компактные сообщения
- Работа в условиях нестабильной связи на линии передачи данных
- Поддержка нескольких уровней качества обслуживания (QoS)
- Легкая интеграция новых устройств
Протокол MQTT работает на прикладном уровне поверх TCP/IP и использует по умолчанию 1883 порт (8883 при подключении через SSL). Также, возможна работа через Winsocket
Обмен сообщениями в протоколе MQTT осуществляется между клиентом (client), который может быть издателем или подписчиком (publisher/subscriber) сообщений, и брокером (broker) сообщений (например, открытое ПО Mosquitto MQTT).
Издатель отправляет данные на MQTT брокер, указывая в сообщении определенную тему, топик (topic). Подписчики могут получать разные данные от множества издателей в зависимости от подписки на соответствующие топики.
Устройства MQTT используют определенные типы сообщений для взаимодействия с брокером, ниже представлены основные:
- Connect – установить соединение с брокером
- Disconnect – разорвать соединение с брокером
- Publish – опубликовать данные в топик на брокере
- Subscribe – подписаться на топик на брокере
- Unsubscribe – отписаться от топика
Топики представляют собой иерархическую структуру, похожую на путь в файловой системе. Например:
myhome/kitchen/temperature
myhome/kitchen/light
Все устройства, которые заинтересованы в получении обновлений информации по всему, например, что происходит на кухне, могут подписаться на топик myhome/kitchen/# (#-специальный символ, аналогичный "*" в файловых системах)
Датчик температуры публикует свои измерения в топик /myhome/kitchen/temperature
Выключатель - в топик /myhome/kitchen/light
Преимущества использования MQTT для устройств
- Является стандартом де-факто для современных облачных систем IoT (см обзор). Данный протокол поддерживается абсолютно всеми современными облачными и On Premises системами IoT
- Развитая экосистема opensource решений автоматизации и диспетчеризации, в том числе: HomeAssistant, OpenHab, Wiren Board, Node Red - (см. Обзор) - это позволяет оконечным устройствам легко использовать уже имеющееся ПО без необходимости разрабатывать Web- интерфейсы, мобильные приложения, Rule-engines и пр.
- ПО MQTT брокера, также, доступно в открытом исходном коде и портировано под основные ОС (https://mosquitto.org/)
- Поддержка данного протокола устройством позволяет использовать его совместно с большим кол-вом уже существующего ПО и легко интегрировать новые устройства
- Библиотеки для реализации клиентской части данного протокола, также, доступны в исходном коде и могут быть легко интегрированы в ваш проект
Недостатки и особенности реализации MQTT
Протокол хорошо специфицирует такие операции как подписка на информацию (топик) и публикацию информации в топик, но сам формат данных оставляет на усмотрение приложений IoT
Это привело к тому, что разные системы используют разные форматы данных и оказываются, на деле, несовместимы между собой
Например, популярные OpenSource системы управления УД: OpenHab, HomeAssistant и IOBroker поддерживают MQTT. Но при этом напрямую, не совместимы.
На мой взгляд, самая обширная и продуманная реализация MQTT из этих трех систем, у HomeAssistant. По крайней мере, она подразумевает разумную иерархию топиков. И поддерживает аж три формата взаимодействия, включая JSon. Также, описывает формат управления для типовых устройств Умного дома, таких как освещение, термостат и пр.
Отдельно стоит упомянуть MQTT Autodiscovery - механизм, при помощи которого HomeAssistant может одним кликом добавлять новые устройства, которые особым образом анонсируют себя на шине MQTT
Начиная с версии 2.4, OpenHab, также, анонсировал новый драйвер MQTT, в том числе, с поддержкой конвенции homie и AutoDiscovery
К сожалению, мои эксперименты с новым драйвером, проведенные некоторое время назад, показали, что он нестабилен. (если ситуация изменилась - обязательно отпишитесь в комментариях)
Старый драйвер стабилен, но достаточно примитивен. Подразумевает использование в качестве MQTT Payload простых команд: "ON", "OFF", цифровые значения датчиков, разделенные запятыми. Можно прикрутить JSon, но настройка этого крайне неудобна. Также, плоская как блин структура Item-ов OpenHab все еще крайне натянуто ложится на иерархическую структуру мира. Дальнейшие эксперименты я не проводил, так как постепенно перешел на HomeAssistant
IOBroker имеет более-менее продуманную структуру топиков, но вот беда, его авторам понадобилось зачем-то доработать сам брокер, отступив от стандарта.
Доработка заключается в том, что MQTT брокер, входящий в состав IOBroker-а не отправляет информацию обратно тому клиенту, который ее направил, даже если он в явном виде подписался на данный топик.
Сделано это, вероятно, для того, чтобы избежать закольцовывания сообщений между клиентом и брокером. Хотя разумная архитектура, а именно, разнесение командных топиков, через которые происходит управление устройствами, и статусных - это те, в которых устройства уведомляют брокер (и всех, кому это интересно) о смене своего состояния - решают данную проблему.
Можно спорить о том, полезная доработка или нет, но она уже привела к тому, что те устройства, которые делаются под IOBroker в принципе, не работают со стандарным Mosquitto, так как не заботятся о правильной архитектуре топиков, уповая на "костыль", внедренный в IOBroker. Любое отступление от стандартов - это всегда плохо.
MQTT в контроллере LightHub
В своем контроллере LightHub, я уже несколько раз усовершенствовал интерфейс, отвечающий за интерпретацию MQTT. Описание текущего интерфейса приведено здесь
Сейчас частично поддерживается конвенция homie, которая определяет рациональную и унифицированную иерархию MQTT топиков устройства, а также, публикует служебную информацию, при помощи которой, системы управления смогут автоматически настраиваться на те устройства, которыми управляет контроллер.
Также, контроллер может работать одновременно с системами OpenHab, HomeAssistant и IOBroker. Также, участники сообщества адаптировали контроллер под Domotics.
Данные особенности, тем не менее, не мешают использовать MQTT для межмашинного взаимодействия уже сегодня.
Конвертация форматов может производиться специально разработанным клиентом, подписывающимся на сообщения одного формата и публикующих их в другом формате в другие топики. У меня, например, ранее с такой конвертацией прекрасно справлялся NodeRed, не требуя ни строчки кода.
В статье использованы материалы из Wikipedia и IPC2u