MQTT: protocole IoT
Comment fonctionne la publication/l'abonnement, le courtier, les sujets et la QoS. Pour la maison intelligente, les appareils IoT, les capteurs alimentés par batterie.
Qu'est-ce que MQTT
MQTT (Message Queuing Telemetry Transport) — лёгкий протокол обмена сообщениями по модели publish/subscribe. Создан в 1999 для спутниковых систем, сейчас стандарт для IoT и умного дома. Устройства подключаются к брокеру (Mosquitto, HiveMQ, EMQX) и публикуют/подписываются на топики.
Преимущества MQTT:
- Лёгкий: 2 байта заголовка, минимальный трафик. Подходит для слабых устройств и медленных сетей (LoRa, GPRS, спутник).
- Энергоэффективный: датчики на батарейках живут годы.
- Надёжный: 3 уровня QoS, retain, persistent sessions, Last Will.
- Стандарт: ISO/IEC 20922 (2016). Клиенты для всех ЯП.
- Локальный: работает без облака, в вашей сети.
architecture de publication/abonnement
Компоненты
- Брокер (broker) — центральный сервер (Mosquitto, HiveMQ, EMQX). Принимает сообщения и рассылает подписчикам.
- Publisher (издатель) — клиент, который отправляет сообщения. Пример: датчик температуры.
- Subscriber (подписчик) — клиент, который получает сообщения по подписке. Пример: Home Assistant, мобильное приложение.
Принцип работы
- Датчик температуры подключается к брокеру
192.168.1.10:1883. - Публикует:
home/livingroom/temperature → 23.5. - Брокер сохраняет значение (если retain=1) и рассылает всем подписчикам на этот топик.
- Home Assistant подписан на
home/+/temperature— получает 23.5, обновляет дашборд. - Мобильное приложение тоже подписано — тоже получает.
Клиенты не знают друг о друге. Publisher не знает, кто получает его сообщения. Subscriber не знает, кто публикует. Только брокер знает всё.
Преимущества перед request/response (HTTP)
- Низкий overhead (2 байта vs сотни байт HTTP).
- Push-нотификации без polling.
- Легко добавлять новых подписчиков (не нужно менять publisher).
- Один publisher → тысячи подписчиков (масштабируется).
Sujets
Топики — иерархические строки через слэш:
home/livingroom/temperature
home/livingroom/humidity
home/kitchen/temperature
sensors/+/value
devices/+/status
# (все топики)
Wildcards (только в подписке)
+— один уровень:sensors/+/valueматчитsensors/temp1/value, но НЕsensors/temp1/extra/value.#— все подуровни (только в конце):home/#матчитhome/livingroom/temperature,home/kitchen/sensor/extra.
Лучшие практики
- Используйте иерархию:
<application>/<device>/<sensor>. - Не начинайте топики с
$— зарезервировано для брокера (статистика, $SYS/broker/version). - Избегайте пробелов и спецсимволов в топиках.
- Не делайте слишком глубокую вложенность (> 5 уровней).
Niveaux de QoS
| QoS | Название | Гарантия | Handshake | Когда использовать |
|---|---|---|---|---|
| 0 | At most once | Может потеряться | Нет | Телеметрия (температура раз в минуту) |
| 1 | At least once | Может прийти дважды | PUBACK | Команды, уведомления |
| 2 | Exactly once | Ровно один раз | 4-этапный (PUBREC, PUBREL, PUBCOMP) | Критичные команды (открыть сейф) |
QoS 0 — At most once
Publisher → Broker: PUBLISH (topic, payload)
# Без подтверждения. Если потерялось — никто не узнает.
Быстро, дёшево. Подходит для телеметрии.
QoS 1 — At least once
Publisher → Broker: PUBLISH (qos=1)
Broker → Publisher: PUBACK
# Если PUBACK не пришёл — Publisher повторяет. Может прийти дубликат.
Идемпотентность на клиенте (проверять message ID).
QoS 2 — Exactly once
Publisher → Broker: PUBLISH (qos=2)
Broker → Publisher: PUBREC
Publisher → Broker: PUBREL
Broker → Publisher: PUBCOMP
4-этапный handshake. Медленно, но гарантия. Редко используется (overhead большой).
Conserver, dernière volonté, session persistante
Retain flag
Если Publisher ставит retain=1, брокер сохраняет последнее сообщение. Новый подписчик на этот топик сразу получает последнее значение. Используется для состояний: температура, статус устройства.
mosquitto_pub -t home/livingroom/temperature -m 23.5 -r
Last Will and Testament (LWT)
Клиент при подключении указывает LWT: топик и сообщение. Если клиент неожиданно отключается (без DISCONNECT) — брокер публикует LWT от его имени. Используется для: уведомления «устройство оффлайн».
Persistent Session
Если clean_session=false — брокер запоминает подписки и недоставленные сообщения для клиента. Когда клиент переподключается — получает пропущенное. Полезно для ненадёжных сетей.
Pourquoi MQTT dans une maison intelligente
Zigbee2MQTT, Z-Wave JS, KNX-шлюз все умеют публиковать события в MQTT. Home Assistant подписан на топики и реагирует.
Без MQTT пришлось бы делать отдельный интеграционный код для каждого протокола. С MQTT — все устройства "говорят" на одном языке.
Пример: автоматизация в Home Assistant
automation:
- trigger:
platform: mqtt
topic: home/livingroom/motion
payload: "on"
action:
- service: light.turn_on
target: entity_id: light.livingroom
Courtiers populaires
| Брокер | Язык | Размер | Для кого |
|---|---|---|---|
| Eclipse Mosquitto | C | Лёгкий | DIY умный дом |
| EMQX | Erlang | Enterprise | Production, миллионы клиентов |
| HiveMQ | Java | Enterprise | Production, платный |
| AWS IoT Core | — | Облако | AWS-проекты |
| Azure IoT Hub | — | Облако | Azure-проекты |
Для умного дома: Mosquitto на Raspberry Pi. Запуск через Docker:
docker run -d --name mosquitto -p 1883:1883 -p 9001:9001 eclipse-mosquitto
С MQTT-Explorer (GUI) можно посмотреть все топики в реальном времени — очень полезно для отладки.
FAQ
Что такое MQTT? MQTT (Message Queuing Telemetry Transport) — это лёгкий протокол обмена сообщениями по модели publish/subscribe. Создан в 1999 для спутниковых систем, сейчас стандарт для IoT и умного дома. Устройства подключаются к брокеру (Mosquitto, HiveMQ, EMQX) и публикуют/подписываются на топики. Очень экономичный: 2 байта на сообщение, минимум энергопотребления. Идеален для датчиков на батарейках.
Как работает publish/subscribe? Архитектура: 1) Брокер (центральный сервер) — Mosquitto, HiveMQ, EMQX. 2) Клиенты (publisher) публикуют сообщения в топики: 'home/livingroom/temperature', '23.5'. 3) Брокер рассылает сообщения всем подписчикам (subscriber) на этот топик. Клиент не знает, кто получает его сообщения. Подписчик не знает, кто публикует. Брокер знает всё.
Какие бывают уровни QoS в MQTT? QoS 0 — At most once: сообщение отправляется без подтверждения. Может потеряться. Самый быстрый. QoS 1 — At least once: с подтверждением PUBACK. Может прийти дважды (идемпотентность на клиенте). QoS 2 — Exactly once: 4-этапный handshake. Гарантирует ровно одну доставку. Самый медленный. Для датчиков температуры — QoS 0 (потеря 1 из 100 сообщений не критична). Для команд (открыть дверь) — QoS 1 или 2.
Что такое топики в MQTT? Топики — это иерархические строки через '/': 'home/livingroom/temperature', 'sensors/+/value', 'devices/+/status'. Подписка на 'sensors/+/value' получит сообщения от 'sensors/temp1/value', 'sensors/temp2/value'. Wildcards: '+' — один уровень, '#' — все подуровни (только в конце). Топики не создаются заранее — определяются в момент публикации.
Зачем MQTT в умном доме? Zigbee2MQTT, Z-Wave JS, KNX-шлюз все умеют публиковать события в MQTT. Home Assistant подписан на эти топики и реагирует (включает свет, шлёт уведомления). Без MQTT пришлось бы делать отдельный интеграционный код для каждого протокола. С MQTT — все устройства 'говорят' на одном языке. Плюс: локальный (без облака), лёгкий (подходит для слабых устройств), стандарт (есть клиенты для всех ЯП).
Какие MQTT-брокеры популярны? Eclipse Mosquitto — лёгкий, open source, написан на C. Для DIY умного дома. EMQX — enterprise, написан на Erlang, поддерживает миллионы клиентов. HiveMQ — коммерческий, Java, для production. AWS IoT Core / Azure IoT Hub / Google Cloud IoT — облачные. Для умного дома в РФ: Mosquitto на Raspberry Pi — самый популярный вариант. Запуск: docker run -d -p 1883:1883 eclipse-mosquitto.
👉 Спроектировать умный дом → — добавьте MQTT-устройства, экспортируйте в PDF/DXF.