Интернет вещей невозможно представить без надежного и простого способа обмена данными между устройствами. Сенсоры, контроллеры, мобильные приложения и облачные сервисы должны общаться между собой быстро и без лишних затрат ресурсов. Одним из самых популярных решений для этого стал протокол MQTT — легкий, гибкий и проверенный временем стандарт, который сегодня используется миллионами устройств по всему миру.
Что такое протокол MQTT
MQTT (Message Queuing Telemetry Transport) — это сетевой протокол обмена сообщениями, который создан специально для устройств с ограниченными ресурсами и нестабильным интернет-соединением.
Он появился в 1999 году. Его разработали Эндрю Стэнфорд-Кларк (IBM) и Арлен Ниппер (Arcom) для телеметрии в нефтегазовой отрасли: нужно было передавать данные с насосных станций на центральные серверы через дорогие и медленные спутниковые каналы. Протокол позволил экономить трафик и поддерживать связь даже при перебоях.
Сегодня развитием MQTT занимается международная организация OASIS, которая отвечает за поддержку открытых стандартов. Кроме того, протокол признан также ISO и активно используется в Интернете вещей (IoT).
Где используется MQTT и почему он популярен
MQTT активно используется в самых разных сферах:
- умные дома и бытовая техника (управление светом, климатом, безопасностью);
- промышленная автоматизация и мониторинг оборудования;
- системы «умного» города (освещение улиц, парковки, датчики качества воздуха);
- транспорт и логистика (GPS-трекеры, контроль состояния транспорта);
- энергетика (счетчики, управление распределительными сетями);
- медицина (носимые устройства, удаленный мониторинг пациентов).
Популярность MQTT объясняется тем, что он решает сразу несколько задач, которые долгое время были головной болью инженеров: как обмениваться данными там, где интернет медленный или нестабильный, как подключать тысячи устройств без перегрузки сети, и как при этом не усложнять архитектуру.
Архитектура MQTT
MQTT построен вокруг очень простой, но эффективной модели: есть брокер и есть клиенты. Все устройства, приложения или сервисы, которые работают через MQTT, называются клиентами. А брокер — это центральный узел, который принимает все сообщения и распределяет их тем, кто подписался на определенные топики.
Посмотрим подробнее:
- Клиент — это любое приложение или устройство, которое подключается к брокеру для обмена сообщениями. Он может выполнять две основные задачи: публиковать информацию и подписываться на топики. Клиентом может быть датчик, умная лампа, мобильное приложение, сервером или, например, промышленный контроллер.
- Брокер — главный элемент системы. Его задача — принять сообщения от клиентов и раздать их всем подписчикам соответствующих топиков. Он выступает посредником и гарантирует, что данные окажутся у тех, кому они нужны. В зависимости от настроек брокер может работать локально или в облаке, позволяя подключать устройства из разных сетей и городов.
- Топики — это адреса сообщений, по которым брокер распределяет данные между клиентами. С их помощью удобно структурировать данные и управлять подписками.
Модель подписки и публикации
В основе MQTT лежит модель pub/sub (публикация/подписка). Она кардинально отличается от классической клиент–серверной схемы, где одно устройство запрашивает данные у другого напрямую. В MQTT все проще: один участник публикует сообщение в определенный топик, а все подписчики этого топика автоматически получают его через брокера.
Работает это так:
- Публикация. Устройство или приложение отправляет сообщение в определенный топик.
- Подписка. Другое устройство заранее подписывается на интересующий топик. Как только в этот топик приходит новое сообщение, брокер сразу передает его подписчику.
Допустим, у входа в квартиру установлен датчик движения. Когда он фиксирует движение, то публикует сообщение в топик home/entrance/motion. На этот же топик подписана система освещения. Получив сигнал, она сразу включает свет в прихожей. При этом у датчика нет никакой информации о лампе, а лампа ничего не знает о датчике — все взаимодействие организует брокер.
Таким образом, преимущество этой модели — полное разделение ролей. Отправитель не знает, кто получит его сообщение, а получатель не обязан знать, кто его отправил. Всем заправляет брокер. Это снижает нагрузку на сеть и упрощает масштабирование: можно легко добавить новые устройства, просто подписав их на нужные топики.
QoS-уровни доставки сообщений
Протокол учитывает разные условия работы сети. В одних случаях достаточно просто передать данные, в других — важно гарантировать, что сообщение дойдет до получателя при любых обстоятельствах. Чтобы это реализовать, в MQTT есть уровни качества доставки сообщений — QoS (Quality of Service).
Всего их три:
QoS 0 — «доставить по возможности»
Сообщение отправляется один раз, без подтверждения. Если оно дошло — отлично, если нет — повторной попытки не будет. Этот уровень чаще всего используется в системах, где данные обновляются постоянно и потеря одной-двух публикаций не критична.
Пример: датчик температуры каждые 10 секунд отправляет значение. Если одно сообщение потерялось, его тут же заменит новое.
QoS 1 — «доставить хотя бы один раз»
В этом случае клиент ждет подтверждения от получателя. Если оно не приходит, сообщение отправляется повторно. В результате получатель может увидеть сообщение один или, в случае повторных попыток, несколько раз. Чтобы избежать дубликатов, нужно заранее продумать обработку на стороне клиента.
Пример: система безопасности отправляет уведомление о сработавшем датчике движения.
QoS 2 — «доставить ровно один раз»
Самый надежный, но и самый тяжелый по ресурсам уровень. Здесь используется многоступенчатый обмен подтверждениями между клиентом и брокером, который гарантирует, что сообщение будет доставлено получателю ровно один раз.
Пример: банковский терминал передает команду о проведении транзакции. Ошибка или повторная обработка в этом случае недопустимы.
Разные уровни QoS позволяют настраивать систему под конкретные задачи. Там, где важна скорость и экономия ресурсов, выбирают QoS 0. Когда сообщение должно точно дойти, но дубликаты не страшны — используют QoS 1. А для финансовых или промышленных операций, где нельзя потерять или продублировать данные, подходит QoS 2.
Какие данные передает протокол MQTT
MQTT изначально создавался как универсальный протокол, который не ограничивает разработчика в выборе типа информации. Он может передавать любые данные в виде байтовой последовательности: текст, числа, JSON, бинарные файлы и закодированные изображения. Все зависит от того, что нужно системе.
Примеры данных, которые часто передают по MQTT:
- показания датчиков (температура, влажность, давление, освещенность);
- состояния устройств (включено/выключено, уровень заряда, ошибки);
- команды (включить свет, изменить режим работы, открыть дверь);
- сообщения от систем мониторинга и аналитики;
- журналы и логи оборудования;
- мультимедийные данные (в редких случаях — аудио или фото, чаще в сжатом виде).
Как часто MQTT передает сообщения
Частота передачи зависит от задачи: одни устройства публикуют данные раз в несколько секунд, другие — только при наступлении события, а некоторые делают это непрерывно, каждую долю секунды. Благодаря такой гибкости протокол одинаково хорошо работает и в системах, где достаточно редкой отправки небольших пакетов, и там, где требуется постоянный поток данных.
Структура сообщений MQTT
Каждое сообщение делится на три части:
- Фиксированный заголовок
Это обязательная часть любого MQTT-сообщения. В ней закодирован тип пакета — например, CONNECT (клиент подключается к брокеру), PUBLISH (отправка данных в топик), SUBSCRIBE (запрос на подписку) и так далее.
Кроме типа пакета, фиксированный заголовок содержит несколько флагов: они определяют, как брокер должен обработать сообщение — нужно ли его сохранить, требуется ли подтверждение доставки, будет ли сообщение отправлено повторно.
Следом идет поле Remaining Length — оно показывает, сколько байт займут остальные части сообщения. Благодаря ему брокер сразу понимает, где сообщение начинается и где заканчивается.
- Переменный заголовок
Есть не во всех сообщениях. Если фиксированный заголовок у всех сообщений одинаковый по структуре, то переменный заголовок подстраивается под задачу. Его можно представить как набор дополнительных полей, которые уточняют, куда и как нужно доставить данные.
Структура переменного заголовка зависит от того, какой пакет передается. В сообщениях публикации в нем указывается топик (например: home/office/lamp), в который нужно отправить сообщение. Если оно передается с QoS 1 или 2, в этом же заголовке хранится идентификатор пакета — он помогает брокеру и клиенту согласовать доставку.
В других типах пакетов переменный заголовок может содержать разные параметры: при подписке туда помещаются идентификаторы пакетов и настройки QoS, при установке соединения — информация о версии протокола, времени жизни соединения и другие характеристики.
В новой версии протокола MQTT 5.0 в него добавились дополнительные поля: например, время жизни сообщения или пользовательские свойства, которые позволяют передавать метаданные вместе с сообщением.
- Полезная нагрузка
Ради этой части и ведется весь обмен. В ней находятся данные, которые устройство хочет передать другим участникам системы.
В отличие от заголовков, структура полезной нагрузки никак не регламентируется самим протоколом: MQTT просто передает последовательность байтов, а уже клиенты договариваются между собой, в каком формате хранить и обрабатывать эту информацию.
В полезной нагрузке может быть практически что угодно:
- короткие текстовые команды вроде ON или OFF;
- числовые значения (например, температура, уровень заряда батареи);
- структурированные данные в формате JSON или XML;
- бинарные массивы — например, закодированные изображения или обновления прошивки.
Формально протокол позволяет передавать до 256 МБ в одном сообщении, но в реальных системах такими объемами почти не пользуются: они слишком тяжелые для сетей с низкой пропускной способностью, где MQTT обычно и применяется.
Преимущества MQTT
У протокола есть следующие плюсы:
- Легкость. У сообщений маленький заголовок — всего 2 байта. Благодаря этому уменьшается нагрузка на сеть, и данные передаются быстрее.
- Двусторонняя связь. Клиент может одновременно публиковать данные и получать их. Такой обмен подходит для систем удаленного управления, где важна обратная реакция: не только отправить команду устройству, но и сразу узнать результат.
- Энергоэффективность. MQTT минимизирует количество пакетов и передачу лишнего трафика. Это продлевает срок работы аккумуляторных устройств и увеличивает общую пропускную способность сети.
- Простота масштабирования. Добавить новое устройство можно буквально в пару шагов: нужно лишь подписаться на нужный топик. При этом остальная система не требует перестройки.
- Гибкость в защите данных. Для незащищенных локальных сетей используется порт 1883, а для шифрованного соединения по TLS — 8883. Это позволяет легко переключаться между простым и защищенным режимом работы.
- Поддержка крупных и маленьких сообщений. Хоть в реальности чаще всего передаются несколько байтов, MQTT способен нести полезную нагрузку до 256 МБ, а значит подходит для разных задач.
Ограничения MQTT
Несмотря на очевидные преимущества, у MQTT есть и слабые стороны. Они не делают его плохим решением, но помогают понять, где протокол подойдет, а где потребуются альтернативы:
- Скорость отправки сообщений. В сравнении с протоколом CoAP, который ориентирован на сверхлегкие и быстрые транзакции, MQTT работает медленнее. Для сценариев с частыми короткими запросами он может быть не самым эффективным вариантом.
- Обнаружение ресурсов. В MQTT поиск новых устройств и сервисов осуществляется через подписку на топики. Это удобно, но менее надежно, чем в CoAP, где для обнаружения ресурсов используется определенный механизм.
- Безопасность из коробки. В протоколе нет встроенного шифрования. Безопасность обеспечивается только при использовании TLS/SSL. Если его не настроить, сообщения можно перехватить.
- Масштабируемость. В локальной сети MQTT легко справляется с десятками и сотнями устройств. Но если речь идет о глобальной системе с миллионами узлов, то уже нужны более сложные решения: балансировка нагрузки и дополнительные инструменты для управления инфраструктурой.
Как выбрать брокер
Чтобы подобрать MQTT-брокер под свои задачи, нужно сначала понять, где он будет использоваться. Одно дело — «умный дом» или учебный проект, другое — промышленная система с тысячами подключенных датчиков. От этого и зависят требования.
Если говорить про большие проекты, то от брокера обычно ждут:
- способность выдерживать огромное количество одновременных подключений без сбоев;
- умение правильно маршрутизировать сообщения по топикам, чтобы информация доходила только до нужных клиентов;
- поддержку хранения сессий и пропущенных сообщений, чтобы устройства не теряли данные при временных отключениях;
- встроенные механизмы безопасности: авторизацию, аутентификацию, работу по TLS/SSL;
- возможность масштабироваться и работать в кластере, когда нагрузка распределяется между несколькими брокерами;
- удобные инструменты мониторинга и управления потоком данных, включая аналитику и контроль политик.
В случае небольших проектов на первый план выходят совсем другие вещи:
- брокер должен быть простым в установке и настройке — чтобы можно было подключить устройства за несколько минут;
- он должен давать возможность постепенно масштабировать систему, если прототип вырастет в рабочий продукт;
- важна экономия — многие облачные брокеры предлагают оплату по факту;
- даже при небольшом масштабе стоит предусмотреть базовую защиту, чтобы данные не могли быть перехвачены.
В итоге все сводится к задачам. Для домашнего проекта или прототипа чаще всего хватает легких решений вроде Mosquitto или простого облачного брокера. А вот если речь идет о промышленности, транспорте или больших IoT-платформах, то лучше выбирать более серьезные продукты, такие как HiveMQ или EMQX — они дают и масштаб, и стабильность, и контроль над данными.
Пошаговое руководство: как начать работать с MQTT
Шаг 1. Подготовьте MQTT-брокер
Прежде чем устройства смогут обмениваться сообщениями, нужен MQTT-брокер. Без него протокол работать не будет.
Есть несколько способов подготовить брокер:
- Использовать облачный сервис. Самый быстрый вариант — развернуть брокер в облаке. Например, сервис EMQX Serverless позволяет запустить брокер за пару минут, не занимаясь настройкой серверов. Он автоматически масштабируется под нагрузку и работает в разных регионах на AWS, Google Cloud и Microsoft Azure. Плюс — удобная модель оплаты pay-as-you-go, где вы платите только за реально использованные ресурсы.
- Подключиться к публичному бесплатному брокеру. Для тестов и обучения можно воспользоваться готовым сервером broker.emqx.io. Он доступен для подключения:
- TCP-порт: 1883 (без шифрования);
- WebSocket-порт: 8083.
Важно! Публичные брокеры не подходят для конфиденциальных данных и стабильной работы в продакшене.
- Развернуть брокер локально. Если вы хотите полный контроль, можно установить брокер на свой компьютер или, например, на Raspberry Pi. Популярное решение — Mosquitto (открытый MQTT-брокер). Такой вариант подойдет для проектов умного дома или локальных IoT-сетей.
Шаг 2. Подготовьте MQTT-клиент
Чтобы работать с брокером, нужен клиент — программа или устройство, которое будет публиковать сообщения и подписываться на топики. Клиент может быть чем угодно: датчиком температуры, мобильным приложением, микроконтроллером или специальной утилитой для тестов. На этапе знакомства с MQTT проще всего использовать готовый инструмент.
Один из самых удобных вариантов — MQTTX. Это кроссплатформенный клиент с простым интерфейсом, доступный в трех форматах:
- веб-версия — работает прямо в браузере по адресу ;
- десктопное приложение — для Windows, macOS и Linux;
- CLI-утилита — для работы через командную строку.
MQTTX выглядит как чат: вы создаете соединения, подписываетесь на топики и сразу видите все приходящие сообщения в удобной ленте. Это позволяет легко проверить, как работает публикация и подписка без написания кода.
Кроме MQTTX, можно использовать и библиотеки для программирования. Под MQTT есть SDK практически для всех языков — Python, JavaScript, C, C#, Java.
Но для быстрого старта достаточно веб-версии MQTTX: открыть ее в браузере и уже через пару кликов создать соединение с брокером.
Шаг 3. Создайте MQTT-соединение
Когда у вас есть брокер и клиент, пора связать их между собой:
- Перейдите на .
- Нажмите кнопку New Connection.
- В поле Name придумайте любое название, например My Test Client.
- В поле Host введите адрес брокера — например broker.emqx.io.
- В поле Port укажите 1883, если используете TCP-подключение.
- В поле Path оставьте значение по умолчанию.
- Нажмите Connect.
Через пару секунд клиент установит соединение. Если все прошло удачно, появится сообщение о подключении и зеленый индикатор рядом с именем:
Шаг 4. Подпишитесь на топик
Теперь, когда соединение установлено, можно получать сообщения от других клиентов. Для этого нужно подписаться на определенный топик.
Подписка работает так: вы сообщаете брокеру, какие данные вам интересны, и он будет пересылать только их.
В веб-клиенте MQTTX:
- Нажмите New Subscription.
В поле Topic введите нужный адрес. Для примера можно указать devices/+/status — так вы будете получать статусы сразу от всех устройств.
- Убедитесь, что уровень QoS стоит на 0 (для теста этого достаточно).
- Нажмите Confirm.
После этого в списке появится новая подписка, и как только кто-то опубликует сообщение в этот топик, оно сразу же отобразится у вас в клиенте.
Подписка — это ключ к тому, чтобы наблюдать за системой в реальном времени. Хотите отслеживать температуру в каждой комнате? Подпишитесь на home/+/temperature. Нужно получать только данные с конкретного датчика? Используйте точный путь вроде home/livingroom/temperature.
Шаг 5. Опубликуйте сообщение
Подписка позволяет вам получать данные, но MQTT работает в обе стороны. Теперь вы сами можете отправить сообщение в выбранный топик, чтобы проверить работу системы.
В веб-клиенте:
- Выберите одно из ваших соединений.
- В нижней части окна найдите поле для публикации.
Введите название топика, например home/livingroom/temperature.
- В текстовое поле вставьте сообщение. Это может быть простой текст (ON, OFF) или JSON:
{ "temperature": "22.5" }
- Нажмите кнопку отправки.
Если все сделано правильно, сообщение сразу появится у всех клиентов, которые подписаны на этот топик.
Например, если в одном соединении вы публикуете данные, то в другом (подписанном на тот же топик) они тут же отобразятся.
Шаг 6. Проверьте получение сообщений
После публикации стоит убедиться, что данные дошли до подписчиков. Откройте соединение, которое подписано на выбранный топик, и посмотрите список сообщений. Если все работает правильно, вы увидите ваше сообщение там же, куда попадают данные от других устройств.
Например, если вы публиковали температуру в топик home/livingroom/temperature, то в подписке на этот же топик появится запись с вашим значением.
Такой простой тест покажет, что вся цепочка работает: клиент установил соединение с брокером, подписался на топик, получил сообщение, которое опубликовал другой клиент.
Заключение
MQTT за годы своего существования стал одним из ключевых протоколов для Интернета вещей. Его простота, экономичность и надежность сделали возможным подключение миллионов устройств. При этом он остается гибким: разработчик сам решает, какие уровни надежности доставки использовать, как организовать топики и какой брокер выбрать под задачи.
Конечно, у MQTT есть свои ограничения, и он подходит не для всех сценариев. Но в тех случаях, где важна легкость, стабильность и эффективный обмен небольшими сообщениями, он остается одним из наиболее подходящих решений. А потому MQTT и дальше будет играть заметную роль в развитии IoT-систем.