что такое mqtt протокол
Протокол Mqtt
Концепцию современного высокоинтеллектуального оборудования, будь то различные датчики, управляемые агрегаты, устройства, входящие в состав «умного» дома или подобные таким, невозможно представить без коммуникации между ними.
Практический обмен информацией в единой сети осуществляется в пределах понятия интернета вещей, или Internet of Things, IoT. Этот термин объединяет все физические приборы, в которых присутствуют технологические части для взаимодействия с внешней средой и между собой. Сама же связь реализована передачей данных по специальным протоколам разного уровня, самые известные из которых – TCP\IP, MQTT, ZigBee, WirelessHart, MiWi, 6LoWPAN, LPWAN и другие.
Коммуникации в IoT
Самый лучший пример подобной связи – это контроль температуры в здании. Термодатчик, находящийся в помещении и подключенный к IoT, отправляет свои показания с определенной периодичностью на центральный пункт обмена (сервер, хаб, брокер – названий много, суть одна). Когда температура опускается ниже установленного предела, управляющая точка, пользуясь каналами связи, выдает команду общему обогревателю (отопительной системе или тенам) на включение.
Когда датчик, контролирующий температуру воздуха, отправит показания о нормализации окружающей среды, то сервер отключит отопление. В случае слишком жаркой погоды, а значит, и при высоких цифрах сигнализатора – будет запущена вентиляция или кондиционер. Области, в которых задействован IoT
Независимо от среды передачи информации, используемой в интернете вещей, будь то радио, WIFI, 3G\LTE коммуникации или даже проводная связь – для обмена данными применяются различные протоколы. Они могут быть как низкого физического уровня, так и прикладного – работающие поверх них. Есть спецификации передачи данных, у которых присутствуют реализации обоих вариантов. Один из таких, относящийся к последнему типу, — MQTT (Message Queue Telemetry Transport), работающий поверх других, и его младший собрат MQTT-SN (MQTT for Sensor Networks), позволяющий осуществлять коммуникацию на физическом уровне.
Разработан он специалистами IBM в 1999 году, для внутреннего использования в соединении устройств, принадлежащих и созданных корпорацией. С 2011 исходные коды и структурная документация переданы группе компаний Eclipse, в которой было продолжено расширение и развитие протокола. С 2016 он прошел стандартизацию международной комиссией и зарегистрирован как ISO\IEC20922. Планируемые области использования MQTT в IBM
Структура протокола
MQTT – открытый протокол, с малым размером передаваемых сообщений. Его особенность – механизм подписок (subscribe) для работы всех устройств сети. Прямой коммуникации в ней не существует – весь обмен идет через аппаратный центр, в терминах системы – «брокер», который принимает и распространяет полученные сообщения, пользуясь принципами, заложенными еще в сетях «FIDO». То есть, «станция» (датчик, контроллер включения\выключения) подписана на «узел» – брокер в понятиях MQTT. Периодически она подключается к центральной точке сети и создает на ней темы (работает, как «издатель») или выгружает себе те, на которые подписана – что сильно напоминает файл-эхи или в понятиях интернета – конференции NNTP.
Простейшая схема взаимодействия между издателем, подписчиком и брокером выглядит так: Рис.1 Простейшая система контроля температуры помещения в сети MQTT
Физически группы подписок на сервере узлов – брокере – представлены в текстовом виде (используется кодировка utf8). Они размечены по уровням веток логического дерева, разделяемых символом слэша «/».
То есть, для рис.1 информация от издателей «кондиционер» и «датчик» будет храниться в таком виде:
/work/room_1/atmosphere/sensor_1/temperature – датчик температуры 1 в комнате 1,
/work/room_1/atmosphere/sensor_2/temperature – датчик температуры 2 в комнате 1,
/work/room_1/atmosphere/air_conditioning/mode – режим кондиционера в комнате 1.
Получение информации для подписчиков может производиться как опросом поштучно всех показателей, так и затребованием данных при помощи управляющих символов. Это «*» для одного уровня и «#» в случае многих.
Скажем, если интересуют показания нагрева воздуха по всем датчикам помещения, то подписчик запрашивает ее через «/work/room_1/atmosphere/*/temperature». При необходимости информации со всех сигнальных устройств (режим кондиционера, показания термоэлементов) здания – используется синтаксис запроса «/work/#».
Оборудование
В качестве брокера может использоваться любой микрокомпьютер, лишь бы его возможностей было достаточно для поднятия сервера TCP\IP html и понимания протоколов MQTT. Так как подпрограммы работы с сетью унифицированы с возможностями ОС linux, то будет достаточно для этого и Raspberry PI.
Что касается датчиков и контроллеров (издателей и подписчиков, в терминологии сети), работающих через MQTT, то их представлено на рынке просто безмерное количество. Это приборы на основе микросхем RAK473, RAK476, SIM7020C, ESP8266 и других.
Их характерная черта – наличие модулей (зачастую WIFI) связи и самой управляющей логики с дополнительными физическими каналами. Причем установку параметров, перепрограммирование и остальные сервисные функции по ним можно осуществлять через web-интерфейс, подключаясь к уже прошитому чипу.
Преимущества
Применение
Структура сети MQTT дает возможность использовать ее для соединения между множеством устройств и аппаратуры. Это и контроллеры промышленного и домашнего оборудования, системы умных домов, опрос различных датчиков, да и всего того, что входит в понятие интернета вещей.
Кроме того, этот протокол позволяет использовать для контроля и наблюдения за устройствами через глобальную сеть, облачные технологии и клиенты для различных операционных систем, включая Android, Linux, Windows, iOS. Собственно, на любых, способных запустить современный браузер.
Есть у протокола и ограничения. Он не предназначен для коммуникации устройств в реальном времени (присутствует задержка в обмене межу брокером с подписчиком). Кроме того, передача мультимедийной информации – аудио и видео – ограничена размерами единовременных малых пакетов. Но для таких вещей существуют специализированные виды связи. Некоторые виды использования брокера сети
Пример проекта с управлением по MQTT
Понять принципы работы сети MQTT поможет пример создания схемы управления розеткой 220В с использованием сети WIFI.
Сначала нужно настроить сам узловой компьютер. Для упрощения процесса будет использоваться любой Raspberry PI с установкой на него комплекса ПО MajorDomo. Подробная инструкция и образы для загрузки размещены на сайте http://majordomo.smartliving.ru/.
У большого ПК, управляемого другими версиями этой ОС, установка подобного комплекса проходит сложнее.
В системе linux, которая установлена на этом микро-ПК, необходимо набрать команду в консоли:
sudo apt-get install mosquitto
Затем в панели управления Raspbian в «Маркет дополнений» найти mqtt и установить его:
Произвести конфигурацию (панель управления/mqtt):
Собственно, для тестового проекта – эта настройка брокера достаточна. Нужно перегрузить Raspberry PI, чтобы изменения вступили в силу (ну или с помощью консоли перезапустить службу mosquitto).
Следующий пункт – переход к работе с микроконтроллером. Будет описано устройство с минимумом деталей. Это реле с управлением по WIFI и возможностью размыкания цепи розетки 220В. В качестве самого прерывателя используется устройство Omron G3MB-202P. Его срабатывание контролируется модулем WIFI ESP-01 на базе логики ESP8266. Питаться сборка будет от источника в 3.3В. Схема:
Но перед тем как ее собирать, нужно контроллер запрограммировать алгоритмами работы с MQTT, для чего используется прошивка ESP8266, которая выкачивается с wifi-iot.com. На сайте проходят регистрацию, в разделе с названием логики контроллера выбирают элементы:
После чего сохранить выбранные настройки в профиле пользователя и кликнуть «скомпилировать». Станет доступна ссылка на результат, который необходимо скачать себе на компьютер.
Собственно, само программирование доступно путем применения NodeMCU Flasher и переходника USB-UART.
Схема коннектора к ESP-01
При подаче питания на уже соединенное с компьютером устройство, нужно держать зажатым T1. Потом отпустить. Это переведет ESP8266 в режим прошивки. Далее через NodeMCU программа помещается в микросхему. Модуль ESP-01 после окончания этого процесса монтируется с первоначальной схемой и подключается к питанию.
Как общаются машины — протокол MQTT
Протокол MQTT достаточно молод (стандартизирован только в 2016 году), но уже успел получить широкое распространение в промышленности и IoT. Он был специально разработан максимально компактным, для нестабильных интернет-каналов и маломощных устройств, и позволяет гарантированно доставлять сообщения в случае потери пакетов и обрывов связи.
Главные особенности протокола MQTT:
История протокола MQTT
MQTT был разработан компанией IBM в 1999 году, и поначалу использовался внутри компании, для своих решений.
В ноябре 2011 IBM совместно с компанией Eurotech объявили об участии в рабочей группе Eclipse M2M и передаче кода MQTT в проект Eclipse Paho.
В 2013 году консорциум OASIS (Organization for the Advancement of Structured Information Standards) начинает процесс стандартизации протокола MQTT. До этого момента спецификация протокола была опубликована под бесплатной лицензией, и такие компании, как Eurotech (ранее известный как Arcom), уже используют протокол в своих продуктах.
В октябре 2014 г. OASIS публикует первый официальный стандарт протокола MQTT.
В 2016 г. протокол был стандартизирован Международной организацией по стандартизации ISO и получил номер ISO/IEC 20922.
С 2014 года интерес к протоколу начинает стремительно расти и, судя по графику Google Trends, на сегодняшний день превышает интерес к Modbus.
Сравнительный график Google Trends
Основные понятия
MQTT имеет клиент-серверную архитектуру. Обмен сообщениями происходит через центральный сервер, называемый брокером. В обычных условиях клиенты не могут общаться напрямую друг с другом, и весь обмен данными происходит через брокера.
Клиенты могут выступать в роли поставщиков данных (Publisher) и в роли получателей данных (Subscriber). В русском переводе эти термины часто переводят как издатель и подписчик, но, чтобы избежать путаницы, мы будем использовать только оригинальную терминологию.
В протоколе MQTT клиенты обмениваются данными друг с другом, через центральный узел
На прикладном уровне протокол работает поверх TCP/IP и может легко связывать удаленные объекты напрямую по интернету, без необходимости использования VPN-тоннелей. Достаточно, чтобы брокер имел реальный IP-адрес и все клиенты могли к нему подключиться. При этом, клиенты могут находится за NAT. Так как в протоколе MQTT подключение инициируют клиенты, пробрасывать порты для установки соединения не требуется, в то время как в Modbus/TCP подключение инициирует сервер (master), что требует прямой сетевой доступности.
Стандартный порт MQTT-брокера для входящих TCP-соединений — 1883. При использовании защищенного SSL-подключения используется порт 8883.
Broker
Брокер — это центральный узел MQTT, обеспечивающий взаимодействие клиентов. Обмен данными между клиентами происходит только через брокера. В качестве брокера может выступать серверное ПО или контроллер. В его задачи входит получение данных от клиентов, обработка и сохранение данных, доставка данных клиентам, и контроль за доставкой сообщений.
Publisher/Subscriber
Для понимания разницы между Publisher и Subscriber разберем простой пример: датчик влажности измеряет влажность в помещении, и если она опустилась ниже определенного уровня, включается увлажнитель воздуха.
В данном случае датчик влажности выступает в роли Publisher: его задача сводится только к публикации данных в сторону брокера. Увлажнитель воздуха выступает в роли Subscriber: он подписывается на обновления данных о влажности и получает от брокера актуальные данные, при этом увлажнитель может сам решать, в какой момент включать увлажнение.
В этой схеме MQTT-клиенты, то есть датчик и увлажнитель, не знают о существовании друг друга, и не взаимодействуют напрямую. Брокер может получать данные из разных источников, проводить над ними манипуляции, например, рассчитывать среднее значение от нескольких датчиков, и уже обработанные данные возвращать подписчику.
Publisher посылает данные брокеру, Subscriber подписывается на обновления этих данных
При этом, асинхронность протокола MQTT предусматривает, что датчик и увлажнитель могут быть онлайн в разное время, терять пакеты, и быть недоступны. Брокер позаботится о том, чтобы сохранить в памяти последние данные, полученные от датчика, и обеспечить их доставку на увлажнитель.
Topic
Для идентификации сущностей в MQTT используются топики, в русском переводе их еще называют каналами. Топики состоят из UTF8-символов, и имеют древовидную структуру, похожую на файловую систему в UNIX. Это удобный механизм, позволяющий называть сущности в человекопонятном виде.
Пример топиков в MQTT
Такой подход позволяет наглядно видеть, какие данные передаются, и удобно разрабатывать и отлаживать код, без необходимости запоминать цифровой адрес размещения данных, как это сделано в Modbus.
Топики также предусматривают wildcard-синтаксис, хорошо знакомый тем, кто работал с файловой системой UNIX. Wildcard может быть одноуровневым и многоуровневым.
Одноуровневый wildcard обозначается символом «+«.
Например, чтобы получить данные с температурных датчиков во всех помещениях в доме, подписчику нужно подписаться на такой топик:
В результате он подпишется на получение данных с таких датчиков:
Многоуровневый wildcard обозначается символом «#«.
Пример получения данных со всех датчиков во всех комнатах в доме:
Подписка на такой топик позволит получать данные с таких датчиков:
Идентификация клиентов
Для контроля доступа в MQTT предусмотрена аутентификация клиентов, в отличие от протокола Modbus, который не имеет такой функции. Для контроля доступа используются такие поля:
ClientId — (обязательное поле) уникальный идентификатор клиента. Должен быть уникальным для каждого клиента. Текущая версия стандарта MQTT 3.1.1 позволяет использовать пустое поле ClientId, если не требуется сохранение состояния подключения.
Username — (опциональное поле) логин для аутентификации, в формате UTF-8. Может быть не уникальным. Например, группа клиентов может авторизовываться с одним и тем же логином/паролем.
Password — (опциональное поле) может посылаться только вместе с полем Username, при этом Username может передаваться без поля Password. Максимум 65535 байт. Важно знать, что имя и пароль передаются в открытом виде, поэтому, если данные передаются по публичным сетям, необходимо использовать SSL для шифрования подключения.
Структура пакета
Как уже говорилось выше, в протоколе MQTT подключение всегда инициируют клиенты, вне зависимости от того, являются ли они получателями (Subscriber) или поставщиками (Publisher) данных. Разберем пакет с установкой соединения, перехваченный с помощью программы Wireshark.
Пакет с опцией MQTT, переданный по нешифрованному каналу
В TCP заголовке видно, что пакет передан по порту 1883, то есть шифрование не используется, а значит в открытом виде доступны все данные, в том числе логин и пароль.
Заголовок
Тип сообщения — Connect (команда 0x0001), установка соединения с брокером. Основные команды: Connect, Disconnect, Publish, Subscribe, Unsubscribe. Есть также команды подтверждения получения, keep alive, и т.д.
Флаг DUP — означает, что сообщение передается повторно, используется только в типах сообщений PUBLISH, SUBSCRIBE, UNSUBSCRIBE, PUBREL, для случаев, когда брокер не получил подтверждения получения предыдущего сообщения.
Уровень QoS — флаг Quality of Service. Мы разберем эту тему подробнее дальше.
Retain — данные, опубликованные с флагом retain, сохраняются на брокере. При последующей подписке на этот топик, брокер сразу отправит сообщение с этим флагом. Используется только в сообщениях с типом Publish.
Использование на практике
Теперь, ознакомившись с теорией, попробуем поработать с MQTT на практике. Для этого будем использовать открытую программу Mosquitto, которая может работать как в режиме клиента, так и в режиме сервера (брокера). Работает на Windows, macOS, Linux. Программа очень удобна для отладки и изучения протокола MQTT, при этом также широко используется в промышленной эксплуатации. Мы будем использовать ее как клиент для отправки и получения данных с удаленного облачного брокера.
Множество облачных провайдеров предоставляют услуги MQTT-брокера, например Microsoft Azure IoT Hub, Amazon AWS IoT, и другие. В этом примере мы будем использовать сервис Cloudmqtt.com, так как у него самая простая регистрация, и бесплатного тарифа достаточно для обучения.
После регистрации, в личном кабинете доступны реквизиты для подключения к брокеру. Так как мы подключаемся к серверу через публичные сети интернета, разумно использовать SSL-порт, для шифрования трафика.
Реквизиты доступа к MQTT-брокеру в личном кабинете облачного провайдера
Гибкость протокола MQTT позволяет клиенту передавать данные, заранее не определенные на брокере. То есть нет необходимости предварительно создавать нужные топики, в которые сможет записать данные Publisher. Используя данные, полученные из личного кабинета, попробуем вручную составить запрос для публикации данных в топик habr/test/random и чтения из него.
mosquitto_sub — утилита-клиент subscriber
mosquitto_pub — утилита-клиент publisher
Для начала подключимся к брокеру как subscriber, и подпишемся на получение данных из топика
habr/test/random.
Видно, что подключение прошло успешно, и мы подписались на топик habr/test/random, и сейчас ожидаем данных в данном топике от брокера.
Так как используется SSL-подключение, для проверки сертификата необходимо указать путь, по которому программа будет искать корневые сертификаты шифрования. Так как у сервиса в нашем примере используется сертификат, выданный доверенным удостоверяющим центром, то мы указываем путь к системному хранилищу корневых сертификатов: —capath /etc/ssl/certs/
Теперь попробуем опубликовать данные в топик, не прерывая первую программу.
Видно, что данные были успешно приняты сервером и опубликованы в нужный топик. Одновременно с этим, в первом окне, в котором запущена программа mosquitto_sub, мы видим, как сообщение было получено, при этом даже юникод работает, видно сообщение на руском языке.
QoS и гарантия доставки
Однако пересылкой сообщения в реальном времени мало кого удивишь, ведь то же самое можно сделать даже банальной утилитой nc. Поэтому попробуем имитировать нестабильное соединение между подписчиком и отправителем. Представим, что оба клиента работают через GPRS, с огромной потерей пакетов, и даже успешная установка TCP-соединения происходит редко, при этом нужно, чтобы подписчик гарантированно получил сообщение отправителя. В данном случае на помощь приходят опции QoS.
По умолчанию для сообщений установлен флаг QoS в значение 0, что значит «Fire and forget»: Publisher публикует сообщение на брокере, но при этом не требует, чтобы сообщение было гарантированно доставлено подписчику. Это подходит для данных, потеря которых не критична, например, для регулярных измерений влажности или температуры.
QoS 1: At least once – хотя бы один. Этот флаг означает, что пока Publisher не получит подтверждения доставки подписчику, данная публикация будет посылаться брокеру, и далее подписчику. Таким образом, подписчик должен получить данное сообщение как минимум один раз.
QoS 2: Exactly once – гарантированно один. Флаг QoS, обеспечивающий высшую гарантию доставки сообщений за счет использования дополнительных процедур подтверждения и завершения публикации (PUBREC, PUBREL, PUBCOMP). Применим для ситуаций, когда нужно исключить любые потери и дублирование данных от датчиков. Например, когда от полученного сообщения срабатывает сигнализация, вызов экстренных служб.
Для симуляции плохой связи отключим оба клиента и попробуем отправить сообщение с наивысшим приоритетом QoS, а также добавим опцию Retain, чтобы отправленное сообщение сохранилось на брокере.
Теперь, спустя время, наш получатель наконец смог установить соединение с интернетом и подключился к брокеру:
MQTT: протокол передачи данных в интернете вещей
Существует много протоколов обмена информацией — от распространенного HTTP до редко встречающегося PeSIT. Несмотря на это, для интернета вещей разработали отдельный протокол — MQTT. Разберемся, где и как его применяют.
Схема работы и особенности протокола MQTT
MQTT — специализированный протокол публикации небольших наборов данных в интернете вещей. Основная сфера его применения — доставка небольших сообщений, например показателей сенсоров.
Сообщения в MQTT передают между тремя участниками — издателями, брокером и подписчиками:
Описание MQTT-протокола: издатели и подписчики (их еще называют MQTT-клиентами) не знают о существовании друг друга, они общаются только с MQTT-брокером
IoT-устройства (датчики) могут быть и издателями, и подписчиками. Подписка им нужна для получения команд телеуправления, обновления конфигурации устройств, версий прошивок. В этом случае сообщение через брокер отправляет системное ПО, а принимает IoT-устройство.
У MQTT-протокола несколько особенностей, посмотрим на основные:
MQTT для IoT хорошо подходит, так как адаптирован к особенностям устройств и каналов связи. Этот протокол минимально нагружает вычислительные мощности умных устройств и правильно доставляет сообщения в центральный узел в условиях нестабильного соединения.
Особенности доставки сообщений
У данных разная ценность и приоритет доставки, поэтому в MQTT предусмотрены флаги Quality of Service — QoS:
Чем хуже качество связи, тем сложнее обрабатывать QoS. Поэтому QoS 0 используют, когда данных много, они передаются регулярно и потеря одного или нескольких сообщений ни на что не влияет.
Например, сенсор передает данные о температуре оборудования раз в секунду, но для анализа используют только среднесуточные показатели — тогда потеря нескольких сообщений несущественна. Но при передаче финансовых данных потери недопустимы, иначе на счете клиента не сойдется баланс.
Применение протокола MQTT: мониторинг оборудования, сред и отправка важных данных
Посмотрим, где чаще всего применяют протокол MQTT:
На крупных предприятиях умные датчики устанавливают на станках, трансформаторах, кранах и погрузчиках. Они мониторят работу промышленных устройств и передают данные в центральную аналитическую систему.
Благодаря этому компании могут отслеживать работу оборудования в реальном времени, прогнозировать его износ и оценивать эффективность работы предприятия.
MQTT используют для анализа климатических показателей, сейсмической активности и устойчивости зданий. Это позволяет предсказывать природные катастрофы и катаклизмы, предотвращать разрушение построек.
Хотя протокол MQTT изначально создавали для интернета вещей, его используют в биллингах мобильных операторов и провайдеров. Им важно передавать информацию о движении денег на счетах клиентов, не теряя ее.