MQTT: язык умных устройств

MQTT — главный протокол современного IoT. Лёгкий, двусторонний и идеален для тысяч устройств, шепчущих в сеть.

MQTT придумали для нефтяных труб со слабой связью. Сегодня на нём работают умные дома: он экономный, надёжный и устроен на красивой идее «публикуй и подписывайся».

MQTT (Message Queuing Telemetry Transport) — лёгкий протокол обмена сообщениями по модели publish/subscribe (публикация/подписка). Его ключевая фишка: устройства не общаются напрямую. В центре стоит брокер — сервер-посредник. Одни устройства публикуют сообщения, другие подписываются на них, а брокер доставляет каждое сообщение всем подписчикам.

Сообщения раскладываются по темам (topics) — это как адреса вроде home/livingroom/temperature. Датчик публикует значение в эту тему, а приложение на телефоне, подписанное на неё, тут же получает обновление. Никто не знает друг о друге напрямую — всех связывает брокер.

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

   [Датчик] --publish--> home/temp ---+
                                      |
                                 [ БРОКЕР ]
                                      |
   [Телефон] <--subscribe-- home/temp +
   [Лог]     <--subscribe-- home/#    +

   publish = отправить в тему
   subscribe = подписаться на тему

Темы образуют иерархию через слэши. В подписках можно использовать подстановочные знаки: + заменяет один уровень, # — все оставшиеся. Например, подписка home/+/temperature ловит температуру из любой комнаты, а home/# — вообще всё про дом. Разберём логику сопоставления тем в коде — запусти «Посчитай сам ▶».

# MQTT topic matching: подходит ли тема под подписку с + и #
def topic_matches(subscription, topic):
    sub = subscription.split("/")
    top = topic.split("/")
    for i, part in enumerate(sub):
        if part == "#":          # # ловит весь остаток
            return True
        if i >= len(top):
            return False
        if part == "+":          # + ловит ровно один уровень
            continue
        if part != top[i]:
            return False
    return len(sub) == len(top)

tests = [
    ("home/livingroom/temp", "home/livingroom/temp"),
    ("home/+/temp",          "home/kitchen/temp"),
    ("home/+/temp",          "home/kitchen/humidity"),
    ("home/#",               "home/kitchen/temp/raw"),
    ("home/+/temp",          "office/kitchen/temp"),
]
for sub, top in tests:
    ok = topic_matches(sub, top)
    print(f"{'СОВПАЛО ' if ok else 'нет     '} sub={sub:22} topic={top}")

Эта врезка — упрощённая копия логики, которую брокер выполняет для каждого сообщения, решая, кому его доставить. Ещё у MQTT есть уровни качества доставки QoS (0 — «отправил и забыл», 1 — «хотя бы раз», 2 — «ровно один раз») и «последняя воля» (Last Will) — сообщение, которое брокер пошлёт, если устройство внезапно отвалится. Всё это делает MQTT надёжным даже на плохой связи.

Почему MQTT победил HTTP в IoT? Он держит одно постоянное соединение (не открывает новое на каждое сообщение), сообщения крошечные, обмен двусторонний (брокер сам толкает команды устройству), а одно сообщение легко раздать сотням подписчиков. Идеально для умного дома.

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

  • Хаос в именах тем. Без продуманной иерархии (дом/комната/датчик) система быстро превращается в кашу.
  • Везде ставить QoS 2. Высокий QoS дороже; для телеметрии часто хватает QoS 0 или 1.
  • Забыть про безопасность брокера. Открытый брокер без логина/пароля и TLS — дыра в системе.

Best practices

  • Проектируй понятную иерархию тем заранее: home/room/device/metric.
  • Используй retained-сообщения, чтобы новый подписчик сразу узнал последнее состояние.
  • Защищай брокер логином, паролем и TLS; не оставляй его в открытом интернете без защиты.

Где это встречается

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

Красота модели publish/subscribe — в развязке. Датчику всё равно, кто читает его данные: один подписчик или сто, приложение или база — он просто публикует в тему. Новое устройство добавляется без переделки старых: подписался на нужную тему — и сразу в системе. Эта гибкость и делает MQTT идеальным для растущих систем, где устройства приходят и уходят. Освоив темы, подписки и брокер, ты владеешь главным инструментом связи современного IoT.

Запомни главное

  • MQTT работает по модели publish/subscribe через брокера.
  • Сообщения раскладывают по темам; + и # — подстановки в подписках.
  • Это главный двусторонний протокол современного умного дома.
  • Проектируй понятную иерархию тем заранее: home/room/device/metric.

Итог: MQTT — лёгкий протокол publish/subscribe с брокером-посредником, темами и подстановками +/#, идеальный для двустороннего IoT-обмена. Это связующий язык умного дома. В финальном разделе соберём из всего изученного реальные проекты.

Проверьте себя
1. По какой модели работает MQTT?
AЗапрос–ответ напрямую между устройствами
BPublish/subscribe через брокера-посредника
CТолько широковещание
DТочка-точка по проводу
2. Что в MQTT-подписке означает подстановочный знак #?
AОдин любой уровень темы
BВсе оставшиеся уровни темы
CТолько цифры
DКонец соединения