MQTT — способ обмена сообщениями
MQTT использует модель publish/subscribe. Устройства и сервисы не обязаны обращаться друг к другу напрямую: они публикуют сообщения в брокер и подписываются на нужные топики.
Брокер — центральная точка обмена. Если он недоступен, связь между клиентами прекращается, даже когда сами датчики и исполнительные устройства продолжают работать автономно.
Топики и структура
Структуру топиков нужно проектировать заранее. Хорошая схема отражает объект, помещение, устройство и назначение сообщения, например состояние, команду или диагностику.
Нельзя смешивать команду и подтверждённое состояние в одном топике. Иначе интерфейс может показать желаемое значение до фактического выполнения команды.
QoS
- QoS 0 — сообщение отправляется без подтверждения. Подходит для частой телеметрии, потеря отдельного значения которой допустима.
- QoS 1 — доставка как минимум один раз. Получатель должен быть готов к повтору сообщения.
- QoS 2 — доставка ровно один раз на уровне MQTT, но требует больше обменов и применяется реже.
QoS не заменяет идемпотентность бизнес-логики. Повтор команды не должен приводить к повторному опасному действию.
Retained-сообщения
Retained позволяет новому подписчику сразу получить последнее сохранённое значение топика. Это удобно для состояния, но опасно для одноразовых команд. Сохранённая команда может повторно попасть новому клиенту после перезапуска.
Для команд обычно используют отдельные топики без retained, а для подтверждённого состояния — retained с понятной политикой очистки.
Last Will и доступность
Last Will сообщает, что клиент неожиданно отключился. Вместе с сообщением online после успешного подключения это позволяет различать реальное состояние устройства и устаревшие данные.
Безопасность
- Отдельные учётные данные для устройств и сервисов.
- ACL с разрешением только необходимых топиков.
- TLS для недоверенных сетей и удалённых подключений.
- Запрет анонимного доступа.
- Сегментация IoT-сети.
- Ограничение размера сообщений и частоты публикаций.
- Не размещать пароли и токены внутри открытых топиков.
Надёжность
Брокер, DNS, сеть и питание становятся частью критической инфраструктуры. Для объекта нужно предусмотреть резервное питание, резервное копирование конфигурации и мониторинг диска. Критические функции желательно дублировать локальной логикой устройства или контроллера, чтобы потеря MQTT не создавала аварию.
