MQTT или Message Queue Telemetry Transport – это легкий, компактный и открытый протокол обмена данными созданный для передачи данных на удалённых локациях, где требуется небольшой размер кода и есть ограничения по пропускной способности канала. Вышеперечисленные достоинства позволяют применять его в системах M2M (Машинно-Машинное взаимодействие) и IIoT (Промышленный Интернет вещей).
Также существует версия протокола MQTT-SN (MQTT for Sensor Networks), ранее известная как MQTT-S, которая предназначена для встраиваемых беспроводных устройств без поддержки TCP/IP сетей, например, Zigbee.
Основные особенности протокола MQTT:
- Асинхронный протокол;
- Компактные сообщения;
- Работа в условиях нестабильной связи на линии передачи данных;
- Поддержка нескольких уровней качества обслуживания (QoS);
- Легкая интеграция новых устройств;
Протокол MQTT работает на прикладном уровне поверх TCP/IP (рисунок 3.1) и использует по умолчанию 1883 порт (8883 при подключении через SSL).
*Рисунок 3.1 – Протокол MQTT в файле "Формулы и диаграмы"*
Обмен сообщениями в протоколе MQTT осуществляется между клиентом (client), который может быть издателем или подписчиком (publisher/subscriber) сообщений, и брокером (broker) сообщений (например, Mosquitto MQTT).
Издатель отправляет данные на MQTT брокер, указывая в сообщении определенную тему, топик (topic). Подписчики могут получать разные данные от множества издателей в зависимости от подписки на соответствующие топики.
Устройства MQTT используют определенные типы сообщений для взаимодействия с брокером, ниже представлены основные:
- Connect – установить соединение с брокером;
- Disconnect – разорвать соединение с брокером;
- Publish – опубликовать данные в топик на брокере;
- Subscribe – подписаться на топик на брокере;
- Unsubscribe – отписаться от топика;
*Рисунок 3.2 - Схема простого взаимодействия между подписчиком, издателем и брокером в файле "Формулы и диаграмы"*
Брокер является основным элементом системы "издатель-подписчик". Он отвечает за прием всех сообщений, их фильтрацию, принятие решения о том, кому интересны эти сообщения, и, в конечном итоге, за пересылку сообщений всем клиентам-подписчикам.
Среди серверных реализаций брокера можно выделить IBM WebSphere MQ; открытое ПО Mosquitto; решение, основанное на облачном сервисе Eurotech Everywhere Device Cloud; легко масштабируемый и высокопроизводительный открытый сервер emqttd, последняя версия (0,17) позволяет обслуживать 1,3 миллиона соединений; брокер HiveMQ, обеспечивающий корпоративную безопасность и максимальную масштабируемость.
Mosquitto - это брокер сообщений с открытым исходным кодом (лицензированный EPL / EDL), который реализует протоколы MQTT версий 3.1 и 3.1.1. Mosquitto легок и подходит для использования на всех устройствах от одноплатных компьютеров с низким энергопотреблением до полных серверов.
Протокол MQTT обеспечивает легкий метод осуществления обмена сообщениями с использованием модели публикации / подписки. Это делает его пригодным для обмена сообщениями через Интернет, например, с датчиками малой мощности или мобильными устройствами, такими как телефоны, встроенные компьютеры или микроконтроллеры.
Проект Mosquitto также предоставляет библиотеку C для реализации клиентов MQTT и очень популярных клиентов MQTT командной строки mosquitto_pub и mosquitto_sub.
Начать работу с Amazon MQ легко. Запустить брокер сообщений можно за считаные минуты в Консоли управления AWS или с помощью интерфейса командной строки (CLI).
Amazon MQ обеспечивает стартовую настройку и выполнение текущих административных задач: обновление версий ПО и компонентов безопасности, обнаружение сбоев и восстановление. Сервис интегрирован с Amazon CloudWatch, что позволяет отслеживать текущие метрики и создавать уведомления о потенциальных проблемах. К примеру, можно вести мониторинг глубины очереди или создавать предупреждения в случае сбоев в доставке сообщений.
Топики представляют собой символы с кодировкой UTF-8. Иерархическая структура топиков имеет формат «дерева», что упрощает их организацию и доступ к данным. Топики состоят из одного или нескольких уровней, которые разделены между собой символом «/».
Пример топика в который датчик температуры, расположенный в спальной комнате публикует данные брокеру:
/home/living-space/living-room1/temperature
Подписчик может так же получать данные сразу с нескольких топиков, для этого существуют wildcard. Они бывают двух типов: одноуровневые и многоуровневые. Для более простого понимания рассмотрим в примерах каждый из них:
- Одноуровневый wildcard. Для его использования применяется символ «+»
К примеру, нам необходимо получить данные о температуры во всех спальных комнатах:
/home/living-space/+/temperature
В результате получаем данные с топиков:
/home/living-space/living-room1/temperature
/home/living-space/living-room2/temperature
/home/living-space/living-room3/temperature
- Многоуровневый wildcard. Для его использования применяется символ «#»
К примеру, чтобы получить данные с различных датчиков всех спален в доме:
/home/living-space/#
В результате получаем данные с топиков:
/home/living-space/living-room1/temperature
/home/living-space/living-room1/light1
/home/living-space/living-room1/light2
/home/living-space/living-room1/humidity
/home/living-space/living-room2/temperature
/home/living-space/living-room2/light1
Сообщения MQTT содержат обязательный заголовок фиксированной длины (2 байта) и необязательный заголовок переменной длины конкретного сообщения и полезную нагрузку сообщения.
Необязательные поля обычно усложняют обработку протокола. Однако MQTT оптимизирован для сетей с ограниченной пропускной способностью и ненадежных сетей (как правило, беспроводных сетей), поэтому дополнительные поля используются для максимально возможного сокращения объема передачи данных.
MQTT использует сетевой порядок байтов и битов
*Рисунок 3.3 – Формат сообщения MQTT в файле "Формулы и диаграмы"*
DUP - флаг дубликата сообщения. Указывает получателю, что это сообщение, возможно, уже было получено.
QOS - указывает уровень гарантии доставки сообщения PUBLISH.
0 - Доставка не более одного раза, без гарантий, «Отправь и забудь».
1 - Доставка как минимум один раз, подтвержденная доставка.
2 - Доставка ровно один раз
Retain - указывает серверу сохранить последнее полученное сообщение PUBLISH и доставить его в качестве первого сообщения.
*Рисунок 3.4 – Перечень команд MQTT в файле "Формулы и диаграмы"*
Рассмотрим более детально процесс установления соединения, посылки и приема сообщений (см. рис. 3.5).
*Рисунок 3.5 – Сценарий установления соединения и обмена сообщениями. в файле "Формулы и диаграмы"*
Установление соединения начинается с передачи от клиента брокеру сообщения CONNECT, в котором указываются:
- ClientId – уникальный идентификатор для каждого клиента, подключающегося к брокеру;
- CleanSession – флаг удаления сохраненных сообщений из предыдущих сессий для данного клиента;
- Username/Password – имя пользователя и пароль для идентификации и авторизации клиента.
- KeepAlive – временной интервал, регулирующий передачу ping-запро-сов и ping-ответов для контроля отключения одной из сторон.
Брокер в ответ посылает клиенту сообщение CONACK, состоящее из:
- Session Present Flag – указывает существуют ли для данного клиента действующие сессии от предыдущих подключений;
- Connect Аcknowledge Flag – сообщает клиенту об успешном подключении или о каких-либо ошибках.
После того, как клиент MQTT подключен к брокеру, он может публиковать сообщения. Публикация происходит путем отправки брокеру от клиента сообщения PUBLISH, где указываются:
- Topic Name – название темы, к которой относится данное сообщение. Данное поле является обязательным, так как MQTT-брокер принимает решение о пересылке того или иного сообщения клиенту, исходя из тем, на которые клиент подписан;
- Специальные флаги – QoS, DUP и RETAIN.
- Полезная нагрузка, где передаются сами данные.
Таким образом, после получения сообщения PUBLISH брокер отправляет подтверждение приема публикации (если это задано QoS) и пересылает полученное сообщение всем клиентам, которые подписаны на данную тему.
Чтобы получать сообщения с необходимыми данными, MQTT-клиент должен сначала подписаться на их получение с помощью сообщения SUBSCRIBE. Данное сообщение состоит из двух частей:
- Packet Identifier – необходимо для QoS 1 и QoS 2;
- List of Subscriptions – названия тем, на которые клиент хочет подписаться, и необходимое значение QoS.
Стоит отметить, что в протоколе MQTT принята иерархическая структура построения тем, поэтому для удобства применяются wildcard-символы, благодаря которым подписчик может подписаться на все подтемы данной темы (символ #) либо темы определенного уровня (символ +).
В ответ на сообщение SUBSCRIBE брокер отправляет клиенту подтверждение SUBACK, в котором сообщает о результате подписки (успешная или нет).
Также клиент может отписаться от темы, которая больше не представляет для него интереса, отправив брокеру сообщение UNSUBSCRIBE, в котором будет указана данная тема.
Брокер подтверждает отказ от информации по этой теме сообщением UNSUBACK.
Дата | Выполнено, % |
---|---|
2020-05-21 20:03:25 | 10 |
2020-05-14 13:24:06 | 70 |
2020-05-14 14:21:43 | 100 |