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-обмена. Это связующий язык умного дома. В финальном разделе соберём из всего изученного реальные проекты.