Основы MQTT
Протокол публикация/подписка, обеспечивающий легковесную связь устройств Интернета вещей. Охватывает настройку брокера MQTT, форматы сообщений, уровни QoS и варианты использования в телематике.
Протокол телеметрической передачи с очередями сообщений (MQTT) используется уже много лет, но сейчас он особенно актуален из-за взрывного роста Интернета вещей: и потребительские, и промышленные устройства внедряют распределенные сети и пограничные вычисления, а устройства с постоянной передачей данных становятся частью повседневной жизни. Такой интенсивный рост заставляет искать способы эффективно передавать данные.
Что такое MQTT
Энди Стэнфорд-Кларк (IBM) и Арлен Ниппер (в то время работавший в Eurotech, Inc.) создали первую версию протокола в 1999 году. Он использовался для мониторинга нефтепроводов в рамках SCADA. Целью было создать протокол, экономный по полосе пропускания, легковесный и потребляющий мало энергии батареи, поскольку устройства подключались через спутниковый канал, который в то время был чрезвычайно дорогим. В настоящее время большинство устройств используют версию 5.0.
Протокол телеметрической передачи с очередями сообщений (MQTT) — это легковесный сетевой протокол с моделью публикации-подписки, который передает сообщения между устройствами. Обычно протокол работает поверх TCP/IP; однако MQTT может поддерживать любой сетевой протокол, обеспечивающий упорядоченные, без потерь, двунаправленные соединения. Он предназначен для соединений с удаленными местами, где требуется «малый объем кода» или ограничена пропускная способность сети. Это открытый стандарт OASIS и рекомендация ISO (ISO/IEC 20922).
С учетом условий эксплуатации протокол сделан компактным и легким. Он идеально подходит для устройств с низким энергопотреблением и ограниченным сроком службы батареи. Сегодня к ним относятся смартфоны, а также постоянно растущее число датчиков и внешнего оборудования.
Таким образом, MQTT стал протоколом для потоковой передачи данных между устройствами с ограниченной вычислительной мощностью и/или сроком службы батареи, а также для сетей с дорогой или низкой пропускной способностью, непредсказуемой стабильностью или высокой задержкой. Поэтому MQTT известен как идеальный протокол для Интернета вещей. Он построен на протоколе TCP/IP, но существует ветвь MQTT-SN для работы по Bluetooth, UDP, ZigBee и в других сетях Интернета вещей, отличных от TCP/IP.
Как это работает
Модель публикации и подписки
В MQTT есть 2 основных понятия: MQTT-брокер и MQTT-клиент.
MQTT-брокер — это сервер, который получает все сообщения от клиентов, а затем направляет их соответствующим клиентам-получателям. Проще говоря, брокер действует как почтовое отделение: MQTT не использует адрес предполагаемого получателя, а использует строку темы под названием «Topic», и любой, кто хочет получить копию этого сообщения, подпишется на эту тему. Несколько клиентов могут получить сообщение от одного брокера (схема «один ко многим»). Аналогично, несколько издателей могут публиковать темы для одного подписчика (схема «многие к одному»).
MQTT-клиент — это любое устройство (от микроконтроллера до полнофункционального сервера), которое использует библиотеку MQTT и подключается к MQTT-брокеру по сети.
Клиент подключается к брокеру. Он может подписаться на любую тему сообщения в брокере. Это соединение может быть обычным TCP/IP-соединением или зашифрованным TLS-соединением для конфиденциальных сообщений.
Клиент публикует сообщения по теме, отправляя сообщение и тему брокеру.
Затем брокер пересылает сообщение всем клиентам, подписанным на эту тему.
Поскольку сообщения MQTT организованы по темам, разработчик приложения может гибко задавать, какие клиенты могут взаимодействовать только с определенными сообщениями. Например, датчики будут публиковать свои показания в теме «sensor_data» и подписываться на тему «config_change». Приложения для обработки данных, которые сохраняют Данные датчиков в серверную базу данных, будут подписываться на тему «sensor_data». Приложение административной консоли может получать Команды системного администратора для настройки конфигурации датчиков, например чувствительности и частоты выборки, и публиковать эти изменения в тему «config_change».
Типы сообщений MQTT
Сеанс MQTT делится на четыре этапа: подключение, аутентификация, обмен данными и завершение. Клиент начинает с создания соединения TCP/IP с брокером, используя либо стандартный порт, либо пользовательский порт, определенный операторами брокера. При создании соединения важно учитывать, что сервер может продолжить старый сеанс, если ему предоставлен повторно использованный идентификатор клиента.
Стандартные порты — 1883 для незашифрованной связи и 8883 для зашифрованной связи с использованием SSL/TLS (уровень защищенных сокетов/безопасность транспортного уровня). Во время рукопожатия SSL/TLS клиент проверяет сертификат сервера и аутентифицирует сервер. Клиент также может предоставить брокеру клиентский сертификат во время рукопожатия. Брокер может использовать его для аутентификации клиента. Хотя это не является непосредственно частью спецификации MQTT, стало общепринятым, что брокеры поддерживают аутентификацию клиентов с помощью клиентских сертификатов SSL/TLS.
Поскольку протокол MQTT стремится быть протоколом для устройств с ограниченными ресурсами и устройств Интернета вещей, SSL/TLS не всегда может быть вариантом и, в некоторых случаях, может быть нежелателен. В таких случаях аутентификация представляется в виде имени пользователя и пароля в открытом виде, которые клиент отправляет серверу, — это является частью последовательности пакетов CONNECT/CONNACK. Кроме того, некоторые брокеры, особенно открытые брокеры, опубликованные в интернете, принимают анонимных клиентов. В таких случаях имя пользователя и пароль просто остаются пустыми.
Формат сообщений MQTT
MQTT считается легковесным протоколом, поскольку все его сообщения имеют небольшой объем кода. Пакет состоит из фиксированного заголовка длиной 2 байта + переменного заголовка и полезной нагрузки. В этих первых 2 байтах фиксированный заголовок всегда присутствует во всех пакетах, а два других элемента — переменный заголовок и полезная нагрузка — присутствуют не всегда.

Из двухбайтового фиксированного заголовка первый байт является полем управления. Это 8-битное поле управления разделено на два 4-битных поля. Первые 4 старших бита MSB — это поле типа команды. Этот тип определяет действие, которое будет выполнено: клиент хочет подписаться на тему, публикуется новое сообщение для подписчиков и т. д.
Следующие 4 бита — это биты флагов управления, и они используются командой publish; для остальных команд они зарезервированы, а значение равно 0.
Второй байт фиксированного заголовка содержит оставшуюся длину, то есть длину переменного заголовка + длину полезной нагрузки.
Переменный заголовок присутствует не во всех пакетах MQTT. Некоторые команды или сообщения MQTT используют это поле для предоставления дополнительной информации или флагов, и они различаются в зависимости от типа пакета. Идентификатор пакета присутствует в большинстве типов пакетов.
В конце пакет может содержать полезную нагрузку. Даже полезная нагрузка необязательна и зависит от типа пакета. Обычно это поле содержит данные, которые передаются. Например, для пакетов CONNECT полезная нагрузка — это идентификатор клиента и «имя пользователя и пароль», если они присутствуют. А для пакета PUBLISH это сообщение, которое должно быть опубликовано.
Качество обслуживания
QoS относится к соглашению между отправителем сообщения и его получателем. Это ключевая функция MQTT, которая дает клиенту возможность выбирать между тремя уровнями обслуживания.
Три различных уровня QoS определяют, как содержимое управляется протоколом MQTT. Хотя более высокие уровни QoS надежнее, они требуют большей задержки и большей пропускной способности, поэтому подписывающиеся клиенты могут указать самый высокий уровень QoS, который они хотели бы получать.
Самый простой уровень QoS — это служба без подтверждения. Этот уровень QoS использует последовательность пакетов PUBLISH; издатель один раз отправляет сообщение брокеру, и брокер один раз передает сообщение подписчикам. Нет механизма, который гарантировал бы корректное получение сообщения, и брокер не сохраняет сообщение. Этот уровень QoS также может называться «не более одного раза», QoS0 или «отправил и забыл».
Второй уровень 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 не поддерживает потоковую передачу видео.
Проблемы с задержкой.
Охрана не встроена. MQTT не шифруется. Вместо этого для шифрования используется TLS/SSL (безопасность транспортного уровня/уровень защищенных сокетов).
Централизованный брокер может стать точкой отказа, поскольку соединения клиентов с брокерами открыты постоянно.
Он не поддерживает такие расширенные функции, как управление потоком.
Где можно использовать MQTT
Поскольку приложения Интернета вещей сейчас внедряются в огромных масштабах, MQTT вышел на первый план как открытый, простой и масштабируемый способ развертывания распределенных вычислений и функций Интернета вещей для более широкой пользовательской базы как на потребительском, так и на промышленном рынках.
Управление транспортом. Организации используют MQTT для создания более умных систем управления транспортом, которые улучшают оптимизацию автопарка, безопасность водителя и снижают расходы на топливо. Новые виды транспорта с использованием дронов также меняют то, как мы перевозим грузы. Связь между мобильным устройством, используемым оператором, телеметрической информацией напрямую от транспортного средства и интеграцией в серверные системы планирования и маршрутизации обеспечивает видимость, необходимую для улучшения общей работы автопарка.
Данные датчиков окружающей среды. MQTT поддерживает модель доставки сообщений «не более одного раза». В сетях с частичным покрытием территории или высокой задержкой это означает, что информация может быть потеряна или продублирована. В районах, где удаленные датчики записывают и передают данные с заданными интервалами, это не является проблемой, поскольку новые показания поступают регулярно. Датчики в удаленных условиях обычно являются маломощными устройствами, что делает MQTT идеальным решением для датчиков Интернета вещей с относительно низким приоритетом передачи данных.
Данные о состоянии машины: чтобы быстро реагировать на возникающие проблемы и предотвращать простои. Например, для ветровой электростанции необходимо гарантированно доставлять текущие показатели производительности местным командам еще до того, как эта информация попадет в центр обработки данных. В таких ситуациях доставка сообщений «не менее одного раза» гарантирует, что соответствующие флаги будут своевременно замечены нужными специалистами, даже если они придут дубликатами. Это важно для межмашинной связи с более высоким приоритетом.
Биллинговые системы: есть еще более приоритетные и точные сообщения, которые нужно обрабатывать корректно. В бизнес-ситуациях, где дублирование записей недопустимо, включая биллинговые системы, полезен флаг 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: выберите Подключение → Телеметрический сервер → Настройки адреса MQTT-брокера и укажите хост: mqtt.eu.navixy.com для сервера ЕС и mqtt.us.navixy.com для сервера США, порт 1883.
И добавьте пользователя по умолчанию в Безопасность MQTT -> Авторизация

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