Протокол MQTT
MQTT (Message Queuing Telemetry Transport) — это сетевой протокол прикладного уровня, работающий поверх стека TCP/IP и реализующий модель обмена сообщениями по схеме «издатель-подписчик» (publish-subscribe). Протокол разработан для обеспечения лёгкого, надёжного и экономичного обмена данными в условиях ограниченной пропускной способности каналов связи, высокой задержки или нестабильного соединения. MQTT ориентирован на использование в системах Интернета вещей (IoT), M2M-коммуникациях (machine-to-machine), промышленной автоматизации и мобильных приложениях.
История
Протокол MQTT был разработан в 1999 году Энди Стэнфорд-Кларком (Andy Stanford-Clark) из IBM и Арленом Ниппером (Arlen Nipper) из компании Eurotech. Первоначальной целью было создание протокола для мониторинга нефтепроводов через спутниковую связь, которая отличалась высокой стоимостью и низкой пропускной способностью. Требовался минимальный размер служебных данных и низкое энергопотребление устройств.
В 2010 году IBM передала спецификацию протокола в организацию OASIS (Organization for the Advancement of Structured Information Standards) для стандартизации. В 2014 году была опубликована версия MQTT 3.1.1, ставшая международным стандартом OASIS. В 2019 году вышла версия MQTT 5.0, которая расширила функциональность протокола, добавив поддержку метаданных, улучшенное управление сессиями и более гибкие механизмы обработки ошибок.
Наибольшее распространение MQTT получил в индустрии IoT, где используется для сбора данных с датчиков, управления исполнительными механизмами и обмена сообщениями между устройствами. В России протокол применяется в системах «умного дома», промышленной телеметрии, логистике и мониторинге транспорта.
Архитектура и принцип работы
Модель «издатель-подписчик»
MQTT использует асимметричную архитектуру, в которой все сообщения проходят через центральный узел — брокер (broker). Устройства-клиенты делятся на две роли:
- Издатели (publishers) — отправляют сообщения на определённые темы (topics).
- Подписчики (subscribers) — получают сообщения по темам, на которые они подписались.
Брокер принимает сообщения от издателей и рассылает их всем подписчикам, которые подписались на соответствующие темы. Это позволяет развязать отправителей и получателей во времени и пространстве: издатель не знает, кто и когда получит его сообщение, а подписчик не знает, кто его отправил.
Темы (Topics)
Тема — это иерархическая строка, определяющая канал обмена сообщениями. Темы имеют структуру, разделённую слешами (например, home/kitchen/temperature). MQTT поддерживает два типа масок для подписки:
- Одноуровневый wildcard
+— заменяет один уровень иерархии (например,home/+/temperatureподписывается на температуру во всех комнатах). - Многоуровневый wildcard
#— заменяет все последующие уровни (например,home/#подписывается на все темы, начинающиеся сhome/).
Качество обслуживания (QoS)
MQTT определяет три уровня качества обслуживания (Quality of Service), которые гарантируют доставку сообщений:
- QoS 0 (At most once) — сообщение доставляется не более одного раза, без подтверждения получения. Самый быстрый, но ненадёжный режим.
- QoS 1 (At least once) — сообщение доставляется как минимум один раз, с подтверждением от получателя. Возможны дубликаты.
- QoS 2 (Exactly once) — сообщение доставляется ровно один раз, с четырёхсторонним рукопожатием. Самый надёжный, но медленный режим.
Сессии и постоянные подписки
MQTT поддерживает долгоживущие сессии. Клиент может создать постоянную сессию на брокере, указав уникальный идентификатор. В этом случае брокер сохраняет все подписки и неотправленные сообщения (с QoS 1 или 2) для данного клиента, даже если он временно отключается. При повторном подключении клиент получает все накопленные сообщения.
Последняя воля (Last Will and Testament)
Клиент может при подключении указать сообщение «последней воли» (will message). Если брокер обнаруживает, что клиент неожиданно отключился (например, из-за потери соединения), он публикует это сообщение от имени клиента. Это позволяет другим устройствам узнать о сбое.
Версии протокола
MQTT 3.1.1 (2014)
Базовая стабильная версия, ставшая стандартом OASIS. Поддерживает все основные функции: темы, QoS 0–2, постоянные сессии, последнюю волю. Минимальный размер заголовка — 2 байта. Максимальный размер полезной нагрузки — 256 МБ.
MQTT 5.0 (2019)
Значительное обновление, добавившее:
- Пользовательские свойства — возможность добавлять произвольные пары «ключ-значение» в заголовки сообщений.
- Улучшенное управление сессиями — поддержка приостановки и возобновления сессий.
- Коды причин — более детальная информация об ошибках (например, «тема не разрешена», «пакет слишком велик»).
- Поддержка общих подписок — возможность подписаться на тему с указанием идентификатора группы подписчиков.
- Потоковый контроль — ограничение скорости отправки сообщений.
Применение
Интернет вещей (IoT)
MQTT является стандартом де-факто для IoT-платформ. Протокол используется для сбора данных с датчиков температуры, влажности, давления, вибрации, а также для управления исполнительными устройствами (реле, клапаны, двигатели). Примеры российских IoT-платформ, поддерживающих MQTT: «Стриж», «Wiren Board», «Jeti».
Промышленная автоматизация
В промышленности MQTT применяется для интеграции программируемых логических контроллеров (ПЛК), частотных преобразователей и сенсоров в единую систему мониторинга. Протокол поддерживается многими промышленными шлюзами и SCADA-системами.
Умный дом
В системах «умного дома» MQTT используется для обмена сообщениями между контроллерами, датчиками и исполнительными устройствами. Популярные платформы: Home Assistant, OpenHAB, MajorDoMo.
Мобильные приложения
MQTT применяется для push-уведомлений, чатов и обмена данными в реальном времени в мобильных приложениях, где важна экономия трафика и энергии.
Логистика и транспорт
Протокол используется для мониторинга местоположения, состояния грузов и параметров работы транспортных средств (скорость, расход топлива, температура в рефрижераторах).
Безопасность
Шифрование
MQTT не имеет встроенного шифрования, но стандартной практикой является использование поверх TCP-соединения протокола TLS (Transport Layer Security). Это обеспечивает защиту от перехвата и подмены данных. Рекомендуется использовать TLS версии 1.2 или 1.3.
Аутентификация
Брокеры MQTT поддерживают несколько способов аутентификации клиентов:
- Имя пользователя и пароль — передаются в незашифрованном виде (без TLS) или в зашифрованном (с TLS).
- Сертификаты X.509 — клиент предоставляет сертификат, подписанный доверенным центром.
- Токены — использование JWT (JSON Web Token) или других токенов.
Авторизация
Брокеры могут ограничивать доступ клиентов к определённым темам на основе правил. Например, клиент с ролью «датчик» может только публиковать сообщения в тему sensors/#, но не подписываться на actuators/#.
Уязвимости
Основные угрозы для MQTT:
- Атаки типа «отказ в обслуживании» (DoS) — злоумышленник может перегрузить брокера большим количеством подключений или сообщений.
- Перехват трафика — при отсутствии TLS данные передаются в открытом виде.
- Несанкционированное подключение — при слабой аутентификации злоумышленник может подключиться к брокеру.
Для защиты рекомендуется использовать брандмауэры, ограничивать количество подключений с одного IP-адреса, применять TLS и регулярно обновлять программное обеспечение брокера.
Реализации
Брокеры
- Eclipse Mosquitto — один из самых популярных открытых брокеров, написан на C. Поддерживает MQTT 3.1.1 и 5.0, TLS, аутентификацию, плагины.
- EMQX — масштабируемый брокер на Erlang/OTP, поддерживает кластеризацию, миллионы одновременных подключений, MQTT 5.0.
- VerneMQ — высокопроизводительный брокер на Erlang, ориентированный на отказоустойчивость.
- HiveMQ — коммерческий брокер на Java с поддержкой корпоративных функций (мониторинг, интеграция с Kafka).
- RabbitMQ — универсальный брокер сообщений, поддерживающий MQTT через плагин.
Клиентские библиотеки
- Paho (Eclipse) — библиотеки для C, C++, Java, Python, JavaScript, Go, Swift. Наиболее распространённые.
- MQTT.js — библиотека для Node.js и браузеров.
- paho-mqtt — библиотека для Python.
- Eclipse Paho C — для встраиваемых систем.
Сравнение с другими протоколами
| Характеристика | MQTT | HTTP | CoAP | AMQP |
|---|---|---|---|---|
| Модель обмена | Издатель-подписчик | Запрос-ответ | Запрос-ответ / Публикация-подписка | Очередь сообщений / Публикация-подписка |
| Размер заголовка | 2–14 байт | 200–800 байт | 4 байта | 8–16 байт |
| Транспорт | TCP | TCP | UDP | TCP |
| QoS | 3 уровня | Нет | 2 уровня | 3 уровня |
| Энергопотребление | Низкое | Высокое | Очень низкое | Среднее |
| Типичное применение | IoT, M2M | Веб | IoT (ограниченные устройства) | Корпоративные системы |
Интересные факты
- MQTT изначально назывался «MQ Telemetry Transport», где «MQ» означало «Message Queue» (очередь сообщений), хотя протокол не использует очереди в классическом понимании.
- Минимальный размер пакета MQTT составляет 2 байта (CONNECT без полезной нагрузки).
- Протокол используется в проекте Facebook (продукт Meta, признанной экстремистской и запрещённой в РФ) Messenger для push-уведомлений.
- В России MQTT активно применяется в системах мониторинга нефтегазового оборудования, где важна экономия трафика спутниковой связи.
- Версия MQTT-SN (Sensor Networks) адаптирована для работы поверх UDP и ZigBee.
Источники
- OASIS Standard MQTT Version 3.1.1 (2014)
- OASIS Standard MQTT Version 5.0 (2019)
- Andrew Banks, Rahul Gupta. «MQTT Version 3.1.1 Plus Errata 01» (OASIS, 2015)
- Eclipse Paho Documentation
- EMQX Documentation
- «MQTT Essentials» — HiveMQ Blog
- «Understanding MQTT» — IBM DeveloperWorks
- «Протокол MQTT: обзор и применение» — журнал «Современные технологии автоматизации» (Россия, 2020)
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →