Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Как работает MQTT

⚠️ Для этого упражнения нужен сервер MQTT. Если вы участвуете в курсе Ferrous Systems, учётные данные для сервера, которым управляет Espressif, будут выданы на практикуме. Иначе можно использовать один из серверов, перечисленных на https://test.mosquitto.org/, или установить сервер локально.

Чтобы завершить вводный практикум, добавим на плату немного функциональности IoT. Наша цель — заставить плату отправлять обновления показаний датчиков в реальном времени, без постоянного опроса, как пришлось бы делать с HTTP-сервером, а также получать команды для изменения цвета светодиода платы.

Это можно смоделировать с помощью архитектуры «издатель–подписчик»: несколько клиентов публикуют сообщения в определённых каналах (топиках) и могут подписываться на эти топики, чтобы получать сообщения от других. Доставкой сообщений управляет брокер — в нашем случае это сервер MQTT.

Сообщения MQTT

Сообщение MQTT состоит из двух частей: топика и полезной нагрузки (payload).

Топик выполняет ту же роль, что и тема письма или ярлык на картотечном шкафу, а полезная нагрузка содержит собственно данные. Формат данных полезной нагрузки не определён, хотя JSON встречается часто.

🔎 Последняя версия стандарта MQTT (MQTT 5) поддерживает метаданные о типе содержимого. При отправке сообщения MQTT нужно задать параметр качества обслуживания (QoS), определяющий гарантии доставки:

  • не более одного раза;
  • не менее одного раза;
  • ровно один раз.

Для этого упражнения не важно, какой уровень качества вы выберете.

Топики MQTT

Топики MQTT — это строки в кодировке UTF-8, которые представляют иерархию, где уровни разделяются символом /. Ведущий слеш поддерживается, но не рекомендуется. Примеры топиков:

home/garage/temperature
beacons/bicycle/position
home/alarm/enable
home/front door/lock

Здесь датчик периодически публикует температуру в гараже, и она рассылается каждому подписчику, так же как маячок велосипеда публикует свои GPS-координаты. Топики alarm и lock служат приёмником команд для конкретных устройств. Однако ничто не мешает дополнительным подписчикам слушать эти команды, что может быть полезно для аудита.

🔎 Топики, которые начинаются с $, зарезервированы для внутренней статистики брокера. Обычно такой топик начинается с $SYS. Клиенты не могут публиковать сообщения в эти топики.

⚠️ Поскольку все участники практикума будут использовать один и тот же сервер MQTT, нужны меры, чтобы разные проекты не мешали друг другу. Заготовка упражнения генерирует уникальный случайный ID (в формате UUID v4) для каждой копии репозитория. Также можно сгенерировать свой UUID онлайн. Ваш UUID должен стоять в начале топиков сообщений, которыми обмениваются компьютер и плата, примерно по такому шаблону:

6188eec9-6d3a-4eac-996f-ac4ab13f312d/sensor_data/temperature
6188eec9-6d3a-4eac-996f-ac4ab13f312d/command/board_led

Подписка на топики

Клиент отправляет сообщения подписки, чтобы показать, что хочет получать определённые топики. Поддерживаются необязательные шаблоны (wildcards) — как для одного уровня иерархии, так и «для всего»:

  • home/garage/temperature — подписка только на этот конкретный топик;
  • home/# — символ решётки используется как многоуровневый шаблон и подписывает на все топики, которые начинаются с home/. Под него попадают home/garage/temperature, home/front door/lock и home/alarm/enable, но beacons/bicycle/position — нет. Многоуровневый шаблон должен стоять в конце строки подписки;
  • home/+/temperature — символ плюс служит одноуровневым шаблоном для подписки на home/garage/temperature, home/cellar/temperature и т. д.