Тема MQTT
MQTT (Message Queuing Telemetry Transport) — это сетевой протокол прикладного уровня, работающий поверх стека TCP/IP и реализующий модель обмена сообщениями по принципу «издатель-подписчик» (publish-subscribe). Протокол разработан для обеспечения лёгкого, надёжного и экономичного обмена данными в условиях ограниченной пропускной способности каналов связи, высокой задержки и нестабильного соединения. MQTT является одним из основных протоколов для Интернета вещей (IoT) и машинно-машинного взаимодействия (M2M).
История
Протокол MQTT был разработан в 1999 году компанией IBM (США) совместно с компанией Arcom (ныне Eurotech). Первоначальное название — MQTT — расшифровывалось как «MQ Telemetry Transport», где «MQ» отсылало к продукту IBM MQSeries (Message Queue). Первая спецификация протокола (версия 3.1) была опубликована в 2010 году.
В 2013 году IBM передала права на развитие протокола некоммерческой организации OASIS (Organization for the Advancement of Structured Information Standards). В 2014 году OASIS выпустила версию 3.1.1, которая стала международным стандартом. В 2018 году опубликована версия 5.0, которая внесла значительные улучшения, включая расширенные возможности для обработки ошибок, метаданные сообщений и улучшенную масштабируемость.
Архитектура и принцип работы
Модель «издатель-подписчик»
В отличие от традиционной модели «клиент-сервер» (например, HTTP), где клиент напрямую запрашивает данные у сервера, MQTT использует модель «издатель-подписчик». В этой модели клиенты (устройства) не общаются друг с другом напрямую. Вместо этого они общаются через центральный узел — брокер (MQTT broker).
- Издатель (Publisher): отправляет сообщения брокеру, присваивая им определённую тему (topic).
- Подписчик (Subscriber): подписывается на одну или несколько тем у брокера. Когда брокер получает сообщение по теме, на которую подписан клиент, он пересылает это сообщение подписчику.
- Брокер (Broker): центральный сервер, который принимает сообщения от издателей и распределяет их подписчикам. Брокер отвечает за фильтрацию сообщений по темам, управление сессиями и обеспечение качества обслуживания (QoS).
Темы (Topics)
Тема — это иерархическая строка, которая определяет, о чём сообщение. Темы имеют структуру, аналогичную файловой системе, и используют символ «/» для разделения уровней. Например:
home/kitchen/temperaturefactory/machine1/statussensor/+/temperature(символ «+» — однозначный подстановочный знак, заменяющий один уровень)sensor/#(символ «#» — многозначный подстановочный знак, заменяющий все последующие уровни)
Подстановочные знаки позволяют подписываться на целые группы тем, что упрощает настройку подписок.
Качество обслуживания (QoS)
MQTT определяет три уровня качества обслуживания (QoS), которые гарантируют доставку сообщений:
- QoS 0 (At most once): сообщение доставляется не более одного раза, без подтверждения получения. Это самый быстрый, но ненадёжный уровень. Подходит для данных, потеря которых некритична (например, показания температуры, обновляемые раз в минуту).
- QoS 1 (At least once): сообщение доставляется как минимум один раз. Брокер подтверждает получение, но если подтверждение потеряно, издатель может отправить сообщение повторно, что приводит к дублированию. Подходит для данных, где важна доставка, но допустимы дубликаты (например, команды включения света).
- QoS 2 (Exactly once): сообщение доставляется ровно один раз. Это самый надёжный, но и самый медленный уровень, требующий четырёхэтапного рукопожатия. Подходит для критически важных данных, где дублирование недопустимо (например, финансовые транзакции, медицинские сигналы).
Сообщения
Сообщение MQTT состоит из фиксированного заголовка (содержит тип сообщения, флаги, длину), переменного заголовка (содержит идентификатор пакета, свойства в версии 5.0) и полезной нагрузки (payload). Полезная нагрузка может быть произвольным набором байтов (текст, JSON, бинарные данные). Максимальный размер полезной нагрузки в стандартной реализации не ограничен, но на практике ограничивается настройками брокера.
Версии протокола
MQTT 3.1.1
- Базовая версия, ставшая стандартом OASIS.
- Поддерживает три уровня QoS, механизм «последняя воля и завещание» (Last Will and Testament, LWT), сессии с сохранением состояния.
- Минимальный размер заголовка — 2 байта.
MQTT 5.0
- Расширенная версия, опубликованная в 2018 году.
- Добавлены:
- Пользовательские свойства (User Properties) — произвольные пары «ключ-значение» в заголовке сообщения.
- Коды причин (Reason Codes) — более детальная информация об ошибках.
- Улучшенное управление сессиями — возможность указать время жизни сессии.
- Поддержка потока (Flow Control) — ограничение количества сообщений, отправляемых клиентом.
- Общая подписка (Shared Subscription) — позволяет нескольким подписчикам балансировать нагрузку, получая сообщения по очереди.
- Обратно совместима с версией 3.1.1 (клиенты и брокеры могут договариваться о версии протокола).
Применение
MQTT широко используется в различных областях, где требуется лёгкий и надёжный обмен данными:
- Интернет вещей (IoT): датчики, исполнительные устройства, умные дома, промышленные контроллеры. Например, датчик температуры может публиковать показания в тему
sensor/temperature, а система управления отоплением — подписываться на эту тему. - Промышленная автоматизация (M2M): обмен данными между станками, роботами, системами управления производством.
- Автомобильная промышленность: телематика, мониторинг состояния автомобиля, обновление ПО по воздуху (OTA).
- Мобильные приложения: push-уведомления, чаты (например, Facebook Messenger (принадлежит компании Meta, признанной экстремистской и запрещённой в РФ) использовал модифицированную версию MQTT).
- Энергетика: мониторинг солнечных панелей, ветрогенераторов, интеллектуальные счётчики.
- Логистика: отслеживание грузов, контроль температуры в рефрижераторах.
Преимущества и недостатки
Преимущества
- Лёгкость и экономичность: минимальный размер заголовка (2 байта) и низкая служебная нагрузка.
- Асинхронность: издатель и подписчик не зависят друг от друга, что позволяет работать в условиях нестабильной связи.
- Масштабируемость: один брокер может обслуживать тысячи и миллионы клиентов.
- Поддержка нестабильных сетей: механизмы QoS, сессий и «последней воли» позволяют восстанавливать соединение без потери данных.
- Открытость и стандартизация: протокол является открытым стандартом OASIS, что обеспечивает совместимость реализаций от разных производителей.
Недостатки
- Зависимость от брокера: брокер является единой точкой отказа (Single Point of Failure). Для повышения надёжности используются кластеризация и резервирование.
- Отсутствие встроенной безопасности: протокол не шифрует данные по умолчанию. Для обеспечения безопасности обычно используется шифрование на транспортном уровне (TLS/SSL) или аутентификация (логин/пароль, сертификаты).
- Ограниченная поддержка бинарных данных: хотя протокол может передавать любые байты, для сложных структур данных требуется дополнительная сериализация (например, JSON, Protocol Buffers).
- Сложность настройки QoS 2: реализация точной однократной доставки требует дополнительных вычислительных ресурсов и может замедлять обмен.
Реализации
Существует множество реализаций MQTT для различных языков программирования и платформ:
- Брокеры: Mosquitto (Eclipse Foundation), EMQX (EMQ), HiveMQ (HiveMQ GmbH), RabbitMQ (VMware, с плагином MQTT), VerneMQ (Octavo Labs).
- Клиентские библиотеки: Paho (Eclipse Foundation, для C, C++, Python, Java, JavaScript, Go), MQTT.js (JavaScript/Node.js), Eclipse Paho MQTT C++ Client, paho-mqtt (Python).
- Встроенные системы: библиотеки для ESP8266, ESP32, Arduino, Raspberry Pi.
Интересные факты
- Протокол MQTT изначально разрабатывался для мониторинга нефтепроводов, где требовалась экономия трафика и надёжность в условиях плохой связи.
- Facebook (продукт Meta, признанной экстремистской и запрещённой в РФ) Messenger (принадлежит компании Meta, признанной экстремистской и запрещённой в РФ) использовал модифицированную версию MQTT для push-уведомлений, что позволило снизить нагрузку на серверы и уменьшить время доставки сообщений.
- В 2022 году протокол MQTT вошёл в список стандартов, рекомендованных для использования в системах «Умный город» в России (ГОСТ Р 59886-2021).
Источники
- OASIS Standard. MQTT Version 3.1.1. 2014.
- OASIS Standard. MQTT Version 5.0. 2018.
- Andrew Banks, Rahul Gupta. MQTT Version 3.1.1. OASIS, 2014.
- IBM. MQTT: The Standard for IoT Messaging. 2019.
- ГОСТ Р 59886-2021. «Информационные технологии. Интернет вещей. Протокол MQTT. Основные положения». 2021.
- Eclipse Foundation. Eclipse Paho MQTT Client Library Documentation. 2023.
- EMQ. EMQX: The Most Scalable MQTT Broker for IoT. 2023.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →