Что такое MQTT и зачем он умному дому

Знакомимся с протоколом, на котором держится большинство умных домов.

MQTT — лёгкий протокол обмена сообщениями по модели «публикация/подписка»: устройства шлют сообщения в топики, а получают их через посредника — брокера.

Чем плох HTTP для умного дома

HTTP-запрос — это «спросил и получил ответ». Но умному дому нужно другое: датчик должен сам сообщать об изменении, а лампа — мгновенно получать команду, не опрашивая сервер каждую секунду. Постоянные HTTP-опросы тратят энергию и трафик. MQTT решает это: соединение держится открытым, и сообщения летят в обе стороны мгновенно и экономно.

Модель publish/subscribe

В центре стоит брокер — сервер-посредник. Устройства не общаются напрямую:

  Датчик --publish--> [ топик: home/temp ] --> БРОКЕР
                                                  |
                                                  +--subscribe--> Дисплей
                                                  +--subscribe--> Сервер
                                                  +--subscribe--> Телефон

Датчик публикует температуру в топик home/temp. Все, кто подписан на этот топик, мгновенно получают сообщение. Отправитель не знает и не заботится, кто слушает.

Топики — как папки

Топик — это иерархический путь, похожий на адрес:

ТопикСмысл
home/livingroom/tempтемпература в гостиной
home/kitchen/lightсвет на кухне
home/+/tempтемпература в любой комнате (+ — wildcard)
home/#всё про дом (# — всё ниже)

Разбор топика — на чистом Python

Логику маршрутизации сообщения по топику можно проверить в браузере:

def route(topic, payload):
    parts = topic.split("/")     # home/livingroom/light
    if len(parts) == 3 and parts[2] == "light":
        room = parts[1]
        action = "включить" if payload == "ON" else "выключить"
        return f"{action} свет в комнате '{room}'"
    return "неизвестная команда"

print(route("home/livingroom/light", "ON"))
print(route("home/kitchen/light", "OFF"))

Вывод:

включить свет в комнате 'livingroom'
выключить свет в комнате 'kitchen'

Как работает под капотом

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

Частые ошибки

  • Путать MQTT с прямой связью устройств. Всё идёт через брокер; без него обмена нет.
  • Считать, что publish гарантированно дойдёт. Уровень доставки задаёт параметр QoS; по умолчанию гарантий минимум.
  • Слишком общие топики. Подписка на # завалит устройство лишними сообщениями.

Итог

  • MQTT — лёгкий протокол publish/subscribe для интернета вещей.
  • Брокер — посредник; устройства публикуют в топики и подписываются на них.
  • Топики иерархичны; + и # — шаблоны подписки.
  • Постоянное соединение делает обмен мгновенным и экономным.
Проверьте себя
1. Какова роль брокера в MQTT?
AЭто датчик температуры
BСервер-посредник, который принимает публикации и рассылает их подписчикам
CВеб-страница управления
DWi-Fi-роутер
2. Что означает модель publish/subscribe?
AКаждый запрос требует ответа
BИздатель шлёт сообщение в топик, а получают его все подписчики этого топика
CУстройства соединяются напрямую
DСообщения хранятся вечно
3. Почему MQTT экономнее частых HTTP-опросов для умного дома?
AОн использует больше трафика
BДержит лёгкое постоянное соединение и шлёт компактные сообщения мгновенно
CОн работает без Wi-Fi
DОн не требует брокера