Как работает 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и т. д.