Основы MQTT
Протокол Message Queuing Telemetry Transport (MQTT) используется уже многие годы, но сейчас он особенно актуален из‑за взрывного роста IoT: как пользовательские, так и промышленные устройства внедряют распределённые сети и edge‑вычисления, и устройства с постоянной передачей данных становятся частью повседневной жизни. Такой интенсивный рост заставляет искать способы эффективной передачи данных.
Что такое MQTT
Первую версию протокола в 1999 году разработали Энди Стэнфорд‑Кларк (IBM) и Арлен Ниппер (в то время работал в Eurotech, Inc.). Протокол использовали для мониторинга нефтепроводов в рамках SCADA. Целью было создать протокол, экономно расходующий полосу пропускания, лёгкий и с низким энергопотреблением, поскольку устройства подключались через спутниковую связь, которая в то время была чрезвычайно дорогой. В настоящее время большинство устройств используют версию 5.0.
Message Queuing Telemetry Transport (MQTT) — это лёгкий сетевой протокол на основе модели публикации/подписки, который передаёт сообщения между устройствами. Протокол обычно работает поверх TCP/IP; однако MQTT может поддерживаться любым сетевым протоколом, обеспечивающим упорядоченные, безпотерьные, двунаправленные соединения. Он разработан для подключений к удалённым точкам, где требуется «малый объём кода» или ограничена пропускная способность сети. Протокол является открытым стандартом OASIS и рекомендован ISO (ISO/IEC 20922).
С учётом условий эксплуатации протокол выполнен небольшим и лёгким. Он идеально подходит для устройств с низким энергопотреблением и ограниченным сроком службы батареи. Сейчас к ним относятся смартфоны, а также постоянно растущее количество датчиков и подключённых устройств.
Таким образом, MQTT стал протоколом для потоковой передачи данных между устройствами с ограниченной мощностью CPU и/или ресурсом батареи, а также для сетей с дорогой или низкой пропускной способностью, непредсказуемой стабильностью или высокой задержкой. Поэтому MQTT считается идеальным протоколом для IoT. Он построен на протоколе TCP/IP, но существует ветвь MQTT‑SN для работы по Bluetooth, UDP, ZigBee и в других IoT‑сетях, отличных от TCP/IP.
Как это работает
Модель публикации и подписки
В MQTT есть 2 основных понятия: MQTT Broker и MQTT client.
MQTT broker — это сервер, который получает все сообщения от клиентов и затем маршрутизирует их к соответствующим конечным клиентам. Проще говоря, брокер действует как почтовое отделение: MQTT не использует адрес получателя, а применяет строку темы, называемую «Topic», и любой, кто хочет получить копию сообщения, подписывается на эту тему. Несколько клиентов могут получать сообщение от одного брокера (возможность «один — многим»). Аналогично, несколько издателей могут публиковать темы для одного подписчика (многие — к одному).
MQTT client — это любое устройство (от микроконтроллера до полнофункционального сервера), которое использует MQTT‑библиотеку и подключается к MQTT broker по сети.
Клиент подключается к брокеру. Он может подписаться на любую «тему» сообщений у брокера. Это соединение может быть простым TCP/IP‑соединением или зашифрованным TLS‑соединением для передачи чувствительных сообщений.
Клиент публикует сообщения по теме, отправляя сообщение и тему брокеру.
Брокер затем перенаправляет сообщение всем клиентам, подписанным на эту тему.
Поскольку сообщения MQTT организованы по темам, разработчик приложения имеет гибкость указать, какие клиенты могут взаимодействовать с какими сообщениями. Например, датчики будут публиковать свои показания в теме «sensor_data» и подписываться на тему «config_change». Приложения обработки данных, сохраняющие показания датчиков в бэкенд‑базу данных, будут подписаны на тему «sensor_data». Административное консольное приложение может получать команды системного администратора для настройки конфигурации датчиков, таких как чувствительность и частота выборки, и публиковать эти изменения в теме «config_change».
Типы MQTT‑сообщений
MQTT‑сессия делится на четыре этапа: подключение, аутентификация, обмен данными и завершение. Клиент начинает с установления TCP/IP‑соединения с брокером, используя либо стандартный порт, либо пользовательский порт, заданный операторами брокера. При создании соединения важно учитывать, что сервер может возобновить старую сессию, если ему передан повторно используемый идентификатор клиента.
Стандартные порты: 1883 для незашифрованной связи и 8883 для зашифрованной связи с использованием Secure Sockets Layer (SSL)/Transport Layer Security (TLS). Во время SSL/TLS‑рукопожатия клиент проверяет сертификат сервера и аутентифицирует сервер. Клиент также может предоставить клиентский сертификат брокеру в ходе рукопожатия. Брокер может использовать его для аутентификации клиента. Хотя это и не является частью спецификации MQTT, для брокеров стало привычным поддерживать аутентификацию клиентов с помощью клиентских сертификатов SSL/TLS.
Поскольку MQTT нацелен на устройства с ограниченными ресурсами и IoT‑устройства, SSL/TLS не всегда может быть доступен и в некоторых случаях может быть нежелательным. В таких случаях аутентификация осуществляется в виде открытого текста имени пользователя и пароля, которые клиент отправляет серверу — как часть последовательности пакетов CONNECT/CONNACK. Кроме того, некоторые брокеры, особенно открытые broker'ы в интернете, могут принимать анонимных клиентов. В таких случаях имя пользователя и пароль просто остаются пустыми.
Формат MQTT‑сообщения
MQTT считается лёгким протоколом, потому что все его сообщения имеют малый объём кода. Пакет состоит из 2‑байтового фиксированного заголовка + переменного заголовка и полезной нагрузки. В этих первых 2 байтах фиксированный заголовок всегда присутствует во всех пакетах, а остальные два поля — переменный заголовок и полезная нагрузка — присутствуют не всегда.

Из двух байт фиксированного заголовка первый байт — это поле управления. Это 8‑битное поле управления делится на два 4‑битных поля. Первые 4 старших бита (MSB) — поле типа команды. Этот тип определяет действие, которое будет выполнено: клиент хочет подписаться на тему, новое сообщение публикуется для подписчиков и т. д.
Следующие 4 бита — это биты флагов управления, и они используются командой PUBLISH; для остальных команд они зарезервированы и имеют значение 0.
Второй байт фиксированного заголовка содержит остаточную длину, которая равна длине переменного заголовка + длине полезной нагрузки.
Переменный заголовок присутствует не во всех MQTT‑пакетах. Некоторые команды или сообщения MQTT используют это поле для передачи дополнительной информации или флагов, которые различаются в зависимости от типа пакета. Идентификатор пакета встречается в большинстве типов пакетов.
В итоге пакет может содержать полезную нагрузку. Даже полезная нагрузка является необязательной и варьируется в зависимости от типа пакета. Это поле обычно содержит передаваемые данные. Например, для пакетов CONNECT полезная нагрузка — это идентификатор клиента и «username and password», если они присутствуют. А для пакета PUBLISH это сообщение, которое нужно опубликовать.
Качество обслуживания (Quality of Service)
QoS относится к соглашению между отправителем сообщения и получателем сообщения. Это ключевая функция в MQTT, дающая клиенту возможность выбирать между тремя уровнями обслуживания.
Три различных уровня QoS определяют, как протокол MQTT управляет содержимым. Хотя более высокие уровни QoS более надёжны, они требуют большей задержки и пропускной способности, поэтому подписчики могут указывать наивысший уровень QoS, который они хотят получать.
Простейший уровень QoS — это обслуживание без подтверждений. Этот уровень QoS использует последовательность пакетов PUBLISH; издатель отправляет сообщение брокеру один раз, а брокер передаёт сообщение подписчикам один раз. Нет механизма для гарантии корректного получения сообщения, и брокер не сохраняет сообщение. Этот уровень QoS также называют «не более одного раза», QoS0 или «fire and forget» (отправил и забыл).
Второй уровень QoS — обслуживание с подтверждением. Этот уровень QoS использует последовательность пакетов PUBLISH/PUBACK между издателем и его брокером, а также между брокером и подписчиками. Пакет подтверждения удостоверяет, что содержимое получено, а механизм повторной отправки направит оригинальное содержимое снова, если подтверждение не будет получено своевременно. Это может привести к тому, что подписчик получит несколько копий одного и того же сообщения. Этот уровень QoS также называют «по крайней мере один раз» или QoS1.
Третий уровень QoS — гарантированное обслуживание. Этот уровень QoS доставляет сообщение с помощью двух пар пакетов. Первая пара называется PUBLISH/PUBREC, а вторая — PUBREL/PUBCOMP. Две пары обеспечивают, что независимо от числа повторных отправок сообщение будет доставлено только один раз. Этот уровень QoS также называют «ровно один раз» или QoS2.

Преимущества и недостатки
Преимущества:
MQTT не зависит от типа пакета. Полезная нагрузка протокола MQTT может нести любой тип данных, таких как бинарные данные, ASCII‑текст и т. д. Принимающая сторона должна интерпретировать и декодировать данные в соответствии с форматом, используемым отправителем.
Использует пакеты малого размера и может применяться в приложениях с низкой пропускной способностью.
Обеспечивает снижение потребления батареи.
Это надёжный протокол, поскольку он использует опции QoS для обеспечения гарантированной доставки.
Благодаря модели публикации/подписки он масштабируем.
Обеспечивает развязанную архитектуру, поскольку легко разъединять устройство и сервер. Идеально подходит для распределённых коммуникаций один‑ко‑многим и раздельных приложений.
Устройство‑издатель может отправлять данные на сервер в любое время независимо от своего состояния.
Оснащён функцией LWT (Last Will and Testament) для уведомления заинтересованных сторон о ненормальном отключении клиента.
Опирается на TCP/IP для базовых задач связи.
Разработан для доставки сообщений по шаблонам «не более одного раза», «по крайней мере один раз» и «ровно один раз».
Недостатки:
MQTT не поддерживает видеопотоковую передачу.
Проблемы с задержками (latency).
Безопасность не встроена. MQTT не шифруется. Вместо этого для шифрования безопасности используется TLS/SSL (Transport Layer Security/Secure Sockets Layer).
Централизованный брокер может быть точкой отказа, так как соединения клиентов с брокером остаются открытыми всё время.
Не поддерживает расширенные функции, такие как управление потоком (flow control).
Где можно использовать MQTT
Поскольку приложения IoT сейчас реализуются в огромных масштабах, MQTT оказался в центре внимания как открытый, простой и масштабируемый способ развёртывания распределённых вычислений и функциональности IoT для широкой аудитории — как на потребительском, так и на промышленном рынках.
Управление парком транспортных средств. Организации используют MQTT для создания более интеллектуальных систем управления парком, которые улучшают оптимизацию парка, безопасность водителей и снижают расходы на топливо. Новые виды транспорта с использованием дронов также меняют способы перемещения грузов. Связь между мобильным устройством оператора, телеметрической информацией непосредственно от транспортного средства и интеграцией в бэкенд‑системы планирования и маршрутизации обеспечивает видимость, необходимую для улучшения общей работы парка.
Данные экологических сенсоров. MQTT поддерживает модель доставки сообщений «не более одного раза». В сетях с частичным покрытием территории или высокой задержкой это означает, что информация может быть утеряна или продублирована. В областях, где удалённые датчики записывают и передают данные с заданными интервалами, это не является проблемой, поскольку новые показания поступают регулярно. Датчики в удалённых средах обычно являются энергоэффективными устройствами, что делает MQTT идеальным решением для IoT‑датчиков с относительно низким приоритетом передачи данных.
Данные о состоянии машин: для оперативного реагирования на возникающие проблемы и предотвращения простоя. Например, для ветровой электростанции требуется гарантированная доставка текущих показателей работы местным бригадам ещё до того, как эта информация попадёт в центр обработки данных. В таких ситуациях доставка сообщений «по крайней мере один раз» гарантирует, что соответствующие сигналы будут замечены нужными специалистами своевременно, даже если они придут в виде дубликатов. Это важно для машинного взаимодействия с повышенным приоритетом.
Биллинг‑системы: существуют ещё более приоритетные и точные сообщения, которые необходимо обработать корректно. В бизнес‑сценариях, где недопустимо дублирование записей, в том числе в биллинг‑системах, полезен флаг QoS «ровно один раз». Это устраняет дублирование или потерю пакетов в системах выставления счетов, снижает количество аномалий и ненужных противоречий в расчётах.
Текстовые мессенджеры для обмена в реальном времени, использующие низкое потребление данных и энергии MQTT. Например, Facebook использует MQTT для своего приложения Messenger не только потому, что протокол экономит батарею при обмене сообщениями между мобильными телефонами, но и потому, что протокол позволяет доставлять сообщения эффективно за миллисекунды, несмотря на нестабильное интернет‑соединение по всему миру.
Устройства MQTT, поддерживаемые Navixy
Xirgo Global FMS500 Light MQTT (IOTM
Xirgo Global FMS500 Light+ MQTT (IOTM)
Xirgo Global FMS500 StCAN MQTT (IOTM)
BCE FMS500 Light MQTT (IOTM)
BCE FMS500 Light+ MQTT (IOTM)
BCE FMS500 StCAN MQTT (IOTM)
GlobalmatiX xTCU
Как настроить MQTT‑устройства для работы с Navixy
Настройка MQTT‑устройств Xirgo и BCE
Чтобы настроить устройство Xirgo или BCE для работы с MQTT:
Внутри FMSET: выберите Connectivity → Telemetry server → MQTT broker address settings) укажите хост: mqtt.eu.navixy.com для EU‑сервера и mqtt.us.navixy.com для US‑сервера, порт 1883.
И добавьте пользователя по умолчанию в MQTT Security -> Authorization

Настройка MQTT‑устройства Globalmatix
Чтобы настроить устройство Globalmatix для работы с MQTT:
Укажите сервер http://mqtt.navixy.com порт 1883 для EU и http://mqtt.us.navixy.com порт 1883 для US
User/password - globalmatix/secretword
Тема Topic globalmatix/in
Чтобы настроить устройство Globalmatix для работы с MQTTS:
Укажите сервер http://mqtt.navixy.com порт 8883 для EU и http://mqtt.us.navixy.com порт 8883 для US
User/password - globalmatix/secretword
Тема Topic globalmatix/in
Последнее обновление
Это было полезно?