🌐 This article is in Russian. Read via Google Translate →

What is MQTT

MQTT (Message Queuing Telemetry Transport) — лёгкий протокол обмена сообщениями по модели publish/subscribe. Создан в 1999 для спутниковых систем, сейчас стандарт для IoT и умного дома. Устройства подключаются к брокеру (Mosquitto, HiveMQ, EMQX) и публикуют/подписываются на топики.

Преимущества MQTT:

publish/subscribe architecture

Компоненты

Принцип работы

  1. Датчик температуры подключается к брокеру 192.168.1.10:1883.
  2. Публикует: home/livingroom/temperature → 23.5.
  3. Брокер сохраняет значение (если retain=1) и рассылает всем подписчикам на этот топик.
  4. Home Assistant подписан на home/+/temperature — получает 23.5, обновляет дашборд.
  5. Мобильное приложение тоже подписано — тоже получает.

Клиенты не знают друг о друге. Publisher не знает, кто получает его сообщения. Subscriber не знает, кто публикует. Только брокер знает всё.

Преимущества перед request/response (HTTP)

Topics

Топики — иерархические строки через слэш:

home/livingroom/temperature
home/livingroom/humidity
home/kitchen/temperature
sensors/+/value
devices/+/status
# (все топики)

Wildcards (только в подписке)

Лучшие практики

QoS levels

QoSНазваниеГарантияHandshakeКогда использовать
0At most onceМожет потерятьсяНетТелеметрия (температура раз в минуту)
1At least onceМожет прийти дваждыPUBACKКоманды, уведомления
2Exactly 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 большой).

Retain, Last Will, Persistent Session

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 — брокер запоминает подписки и недоставленные сообщения для клиента. Когда клиент переподключается — получает пропущенное. Полезно для ненадёжных сетей.

Why MQTT in a smart home

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

Popular brokers

БрокерЯзыкРазмерДля кого
Eclipse MosquittoCЛёгкийDIY умный дом
EMQXErlangEnterpriseProduction, миллионы клиентов
HiveMQJavaEnterpriseProduction, платный
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.