Открыть сервис

MQTT

MQTT (Message Queuing Telemetry Transport) — это сетевой протокол прикладного уровня, работающий поверх стека TCP/IP и реализующий модель обмена сообщениями по схеме «издатель — подписчик» (publish-subscribe). Протокол разработан для передачи данных в условиях ограниченной пропускной способности каналов связи, высокой задержки и нестабильного соединения, что делает его одним из стандартов в индустрии Интернета вещей (IoT), промышленной автоматизации и системах телеметрии. Основными характеристиками MQTT являются минимальный размер заголовка (от 2 байт), поддержка трёх уровней качества обслуживания (QoS) и встроенный механизм сессий для сохранения состояния клиента.

История

Протокол MQTT был разработан в 1999 году Энди Стэнфорд-Кларком (IBM) и Арленом Ниппером (Arcom, ныне Eurotech). Первоначальная цель заключалась в создании лёгкого протокола для мониторинга нефтепроводов через спутниковые каналы связи — типичная задача телеметрии, где каждый байт трафика стоил дорого, а соединение могло прерываться. Название изначально расшифровывалось как «MQ Telemetry Transport» (MQ — от «message queue», хотя сам протокол не использует очереди в классическом понимании).

В 2010 году IBM передала спецификацию MQTT версии 3.1 в организацию OASIS (Organization for the Advancement of Structured Information Standards) для стандартизации. В 2014 году OASIS выпустила версию 3.1.1, а в 2016 году — версию 5.0, которая добавила расширенные возможности, такие как метаданные, улучшенное управление сессиями и поддержку запрос-ответ. В 2022 году MQTT был утверждён как международный стандарт ISO/IEC 20922.

Архитектура и принцип работы

Модель «издатель — подписчик»

В отличие от клиент-серверных протоколов (например, HTTP), MQTT использует асинхронную модель обмена. Ключевым элементом является брокер (сервер MQTT), который принимает сообщения от клиентов-издателей и распределяет их среди клиентов-подписчиков. Клиенты не общаются напрямую друг с другом — вся коммуникация проходит через брокера.

Темы (Topics)

Тема — это иерархическая строка, по которой маршрутизируются сообщения. Темы имеют структуру каталогов, разделённую слешем (/). Например:

Поддерживаются два wildcard-символа:

Уровни качества обслуживания (QoS)

MQTT определяет три уровня надёжности доставки сообщений:

УровеньНазваниеОписание
QoS 0«Не более одного раза» (At most once)Сообщение отправляется один раз без подтверждения получения. Возможна потеря или дублирование. Максимальная скорость, минимальная надёжность.
QoS 1«Как минимум один раз» (At least once)Сообщение отправляется до тех пор, пока брокер не подтвердит получение (PUBACK). Гарантирует доставку, но возможны дубликаты.
QoS 2«Ровно один раз» (Exactly once)Самый надёжный уровень, использующий четырёхстороннее рукопожатие (PUBLISH → PUBREC → PUBREL → PUBCOMP). Гарантирует, что сообщение будет доставлено ровно один раз, без дубликатов. Требует наибольших вычислительных и сетевых ресурсов.

Сессии и сохранение сообщений

Клиент может установить постоянную сессию (clean session = false), что позволяет брокеру хранить все подписки и неотправленные сообщения (с QoS > 0) для клиента, даже если он временно отключён. При повторном подключении клиент получит все накопленные сообщения. Временная сессия (clean session = true) удаляет все данные при отключении.

Последнее заветное сообщение (Last Will and Testament, LWT) — это сообщение, которое брокер публикует от имени клиента, если тот неожиданно отключается (например, из-за обрыва связи). LWT позволяет другим подписчикам узнать о сбое устройства.

Структура пакета

Заголовок фиксированного размера (Fixed Header) состоит из 2 байт:

Переменный заголовок (Variable Header) и полезная нагрузка (Payload) зависят от типа пакета. Например, для PUBLISH переменный заголовок содержит имя темы и идентификатор пакета (только для QoS > 0).

Версии протокола

MQTT 3.1.1 (OASIS Standard, 2014)

Наиболее распространённая версия. Включает базовые функции: три уровня QoS, LWT, постоянные сессии, аутентификацию по логину/паролю.

MQTT 5.0 (OASIS Standard, 2016)

Расширенная версия, обратно совместимая с 3.1.1 по базовому синтаксису. Добавлены:

MQTT-SN (MQTT for Sensor Networks)

Вариант протокола для сетей с очень малыми пакетами (например, ZigBee, LoRaWAN). Не требует TCP — работает поверх UDP или других транспортных протоколов. Использует сокращённые идентификаторы тем (Topic ID) вместо строк.

Брокеры MQTT

Для работы MQTT необходим брокер. Наиболее известные реализации:

Применение

Интернет вещей (IoT)

MQTT является де-факто стандартом для передачи данных с датчиков, контроллеров и исполнительных устройств. Примеры:

Мобильные приложения и push-уведомления

Некоторые сервисы используют MQTT для доставки уведомлений на мобильные устройства, так как протокол позволяет поддерживать постоянное соединение с минимальным расходом батареи (в отличие от HTTP-опросов).

Автомобильная телематика

Системы мониторинга транспорта (GPS-трекеры, датчики топлива, CAN-шина) передают данные через MQTT на диспетчерские серверы.

Системы управления зданиями (BMS)

Контроллеры HVAC (отопление, вентиляция, кондиционирование), освещения, доступа обмениваются данными через MQTT.

Безопасность

Базовый MQTT не шифрует данные и передаёт логин/пароль в открытом виде. Для обеспечения безопасности используются следующие методы:

Критика и ограничения

Интересные факты

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →