что такое mqtt брокер
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 изначально создавали для интернета вещей, его используют в биллингах мобильных операторов и провайдеров. Им важно передавать информацию о движении денег на счетах клиентов, не теряя ее.
В последнее время мне пришлось долго и муторно разбираться с протоколом MQTT (Mosquitto) и с тем, как его можно использовать с домашней автоматизацией. Поэтому пришлось разбираться с тем, как оно работает и зачем нужны все эти настройки.
Немного теории
Основные термины и понятия используемые в данном протоколе:
Разберем каждый термин по отдельности
Message
Сообщения (message) содержат в себе информацию, которую один участник сети на базе протокола MQTT хочет передать другим. Взаимодействие между участниками сети осуществляется через Брокера. То есть, если мне, как устройству, нужно передать сообщение о том что я что-то сделал или сообщить о том, как у меня дела, я передаю сообщение брокеру публикуя во всеуслышание что «я что-то сделал» или «как у меня дела».
Publish
Это процесс передачи сообщения брокеру.
То есть простым языком, я подошел к брокеру и сказал «мама я покакал». Брокер гипотетически должен услышать это сообщение и записать его к себе в блокнотик. Почему гипотетически? Потому что есть особенности протокола, которые мы разберем чуть ниже. Пока берем за данность, что я сказал что-то брокеру используя механизм Publish и он это услышал и записал.
Subscribe
Так как всеми сообщениями от всех устройств владеет исключительно брокер, то нам жеж нужно как то получить эти сообщения. Для этого мы подписываемся на рассылку от брокера для получения проходящих через него сообщений. Чтобы читать какие-то конкретные сообщения, нам необходимо определить на какую тему мы хотим получать эти сообщения, и для этого как раз используется механизм Topic
Topic
Это как раз таки Тема, по поводу которой мы хотим получать или как ни странно отправлять сообщения.
То есть формат общения между участниками выглядит примерно так.
Я как участник хочу сказать всем «мама я покакала»
для этого я создаю топик любого содержания, например: мое_тело/задница/
и сообщаю в этот топик сообщение «мама я покакала»
Брокер получит это сообщение, и передаст всем, кто подписался на тему (топик) мое_тело/задница/
То есть это такая вот упрощенная система смс рассылок с определенными темами.
Формат топика может быть разным и абсолютно любым. В принципе мы можем создать любой топик, и в него передавать сообщения любого содержания. Главное чтобы получатель был подписан на этот топик и знал что делать с информацией полученной из сообщений.
Что касается особенностей топиков, то их не так чтобы много.
Во первых они чувствительны к регистру. То есть топик «мое_тело/задница» и топик «Мое_Тело/Задница» это два разных топика.
Во вторых, топики не создаются не сервере администратором. Они создаются публикаторами и подписчиками которые на них подписаны. Брокер только занимается передачей сообщений и служебной информации.
Они позволяют выстраивать иерархию. Ну например:
У нас есть в гостиной и в спальне по два выключателя и один в гараже. Для этого мы формируем на выключателях в топики в виде:
Затем, что есть служебные топики, которые позволяют подписаться на группы топиков или сообщений.
Например если мы хотим читать вообще все сообщения мы подписываемся на топик #
Если мы хотим видеть то, что происходит в доме, то мы подписываемся на топик home/# и будем получать сообщения в топиках:
Но не будем видеть то что происходит в топике:
Если мы хотим видеть то, что происходит в гостиной, мы подписываемся на топик home/livingroom/# и будем получать сообщения только из топиков
В общем я думаю понятно что и как происходит с этими топиками.
Служебные сообщения
В качестве служебных сообщений используются в основном два типа сообщений
Last Will and Testament (LWT) которое сообщает что после этого сообщения считать меня мертвым.
Ну плюс еще используется Keep Alive сообщения, которые сообщают брокеру что «я все еще живой» и стандартно посылаются каждые 60 секунд. Если брокер не получил это сообщение от клиента, то он принудительно пингует его чтобы выяснить живой ли тот, и если выясняется что он неживой, то брокер публикует за клиента LWT сообщение, чтобы все узнали что тот скончался.
Соответственно получение брокером Birth Message от устройства, переводит устройство в понимании брокера в режим ONLINE, а после того как брокер получает от устройства LWT сообщение или когда сам принимает решения что тот скончался проверив устройство на доступность, то переводит статус устройства в режим OFFLINE.
QoS в принципе расшифровывается как Quality Of Service, то есть качество предоставляемой услуги. В разрезе MQTT оно имеет три значения 0,1 и 2
Если по простому, то эти варианты означают по факту определение того, надо ли нам как публикующему свое сообщение устройству, быть уверенным что оно получено.
QoS=0 означает что мы один раз публикуем сообщение «мама я покакала» и нам пофиг услышали нас или нет
QoS=1 означает что мы будем публиковать сообщение «мама я покакала» до посинения, до тех пор пока нам не скажут что нас услышали и можно заткнуться уже.
QoS=2 означает что мы один раз сказали «мама я покакала», получили от мамы подтверждение того что она нас услышала, сообщили маме что мы узнали о том что мама нас улышала, а мама подтвердила, что она поняла что мы узнали о том что она услышала :))))))
Я думаю первая буква М в протоколе, имеет отсылку в адрес Майкрософта, который по стопицот раз переспрашивает «действительно ли вы уверены что хотите закрыть это приложения?» :)))))))
Вот в общем то и все.
Retain
Этот параметр имеет всего два значения вкл и выкл. Означает он очень простой механизм.
Если у нас режим выключен, то когда я сообщаю всему миру «мама я покакала», то его слышат все кто подписан сейчас на топик в который я это сообщил. Но вновь подключившийся подписчик на наш веселый топик «мое_тело/задница» не узнает о том что все уже случилось и так и умрет в неведении наверное.
Если же мы включаем режим Retain, то брокер берет на себя обязательство, после того как мы сообщили миру об акте дефекации, сообщать каждому вновь подписавшемуся на этот топик сей удивительный и жизненно необходимый факт.
Платформа ARM и брокер MQTT, как современная основа решений для Интернета вещей
Протокол MQTT, на текущее время, завоевал свою популярность и стал стандартом де факто в проектах, направленных на создание решений для Интернета вещей (IoT). Конечно, Интернет вещей – это определенная абстракция или, правильнее, концепция построения распределенных сетей устройств или машин. При этом, частные задачи взаимодействия машин Machine-to-Machine (M2M), уже сегодня эффективно решаются, включая и уровень подключения этих систем к Интернет, как для создания промышленных систем автоматики, так, например, и для построения систем «умного дома». Очевидно, что для критически важных систем требуется наличие локального арбитра или брокера и устройств, позволяющих отработать решение ситуации не зависимо от качества Интернет-подключения, а также в случае полного разрыва связи.
При этом, в качестве аппаратной платформы для запуска такого брокера MQTT, отлично себя зарекомендовали энергоэффективные, но от этого не менее производительные, микропроцессоры на базе архитектуры ARM. Такая взаимосвязь аппаратной платформы, протоколов обмена сообщениями и их программной реализации стала отправной точкой в стремительном прогрессе развития современных систем автоматизации. Далее рассмотрим подробнее аппаратные решения и программные компоненты для реализации одного из наиболее успешных протоколов обмена сообщениями в технических системах.
ClusterHAT review: Raspberry Pi cluster computer kit. Photo: MagPi magazine
Архитектура микропроцессоров ARM (Advanced RISC Machine) прочно вошла в нашу жизнь. Практически каждый смартфон уже сейчас работает на базе этой архитектуры. Стоит отметить, что понятие RISC-машина на сегодня достаточно размыто, ведь и ее противоположность – современная платформа x86-64, позаимствовала многое из мира RISC-систем. Но речь не об этом, а о том, что она на сегодня стала синонимом или отличительной особенностью производительной и, при этом, энергоэффективной мобильной платформы, а также основой для различных недорогих DIY или «сделай сам» устройств. В этом контексте, конечно, нельзя не упомянуть различные варианты Raspberry Pi, вплоть до решения кластера на базе платы ClusterHAT и т.п. В качестве основной операционной системы для этой платформы отлично себя зарекомендовала Linux. Но и тут, как не вспомнить, например, о такой системе, как Microsoft Windows 10 IoT Core?
Хорошо, когда есть выбор, но не все так просто, как хотелось бы. Microsoft Windows 10 IoT Core – это замечательная операционная система, но она, в первую очередь, предназначена для разработки и запуска программ, например, написанных на языке С# в среде Microsoft Visual Studio. Такой подход универсальным не назовешь. Поэтому, пока классическим выбором для большинства задач остается ARM и Linux, а также Android, как же без него. Отметим, что для быстрого прототипирования кроме плат Raspberry Pi есть и более дешевые Orange Pi компании Xunlong Software или, наоборот, более дорогие ODROID компании Hardkernel, но при этом вполне оправдывающие свою цену. Все зависит от решаемой задачи. А таковой, для текущего проекта, стал запуск сервера/брокера MQTT. При этом, не следует акцентировать внимание на то, что проект посвящен «умному дому» или решениям для робототехники. Это не принципиально, поскольку протокол MQTT – сам по себе является очень универсальным решением.
CPU-351-13. Low Power, Rugged i.MX6 SBC. Photo: Eurotech
Кроме промышленных решений архитектура ARM проникает на рынок серверных решений. Здесь интересен опыт компании Scaleway, которая развертывает и дает в аренду не обычные виртуальные машины, а физические сервера на базе ARMv8. Это решение интересно своей энергоэффективностью, с позиции провайдера, и отсутствием гипервизора или среды виртуализации, как таковой, для пользователя сервиса. Таким образом, становится реальностью отличная среда для запуска Docker-контейнеров. Это напоминает что-то вроде ClusterHAT в промышленных масштабах, а по производительности – отличный выбор для контейнерной виртуализации в облаке. В целом нельзя не согласиться, что это смелое, новаторское бизнес-решение в направлении хостинг услуг, которое уже достаточно продолжительное время существует на рынке. Получается, что если не покупать свой Raspberry Pi или аналог, то всегда можно поэкспериментировать с сервером на базе ARM, взяв его в аренду.
CloudMQTT is a perfect solution for «Internet of Things» messaging
Завершая выбор аппаратной платформы и хвалу архитектуры ARM, можно на этом поставить точку, но следует не забывать, что всегда можно найти альтернативное решение, а это только и подталкивает энтузиастов, гиков, этических хакеров к новым исследованиям и экспериментам с открытыми аппаратными платформами. Итак, у нас стоит задача на базе Linux установить брокер MQTT и немного с ним поэкспериментировать.
Можно было вообще не рассматривать аппаратную платформу, а сразу перейти к работе в облачном сервисе CloudMQTT. Но рассматривается задача на базе трехуровневой структуры Интернета вещей, где на нижнем уровне находятся интеллектуальные датчики и управляющие системы. Середина – это место брокера MQTT, причем он должен быть расположен локально, чтобы проблемы с доступом к Интернет можно было частично решить внутренним оборудованием. А верхний уровень – облако с интерфейсом Node-Red или AWS IoT, Azure IoT Hub и т.п. В такой концепции сложно представить лучшего кандидата на место энергоэффективного и очень бюджетного микро-сервера, что-то отличное от ARM.
Но так устроен мир, нельзя сказать, что все отлично или, наоборот, все плохо. Везде есть свои нюансы. Дело в том, что рассматриваемая трехуровневая система – это не совсем Интернет вещей, скорее, это некий промежуточный вариант пути к такой концепции. Просто IoT без Интернет-соединения не должен существовать, т.е. не зря мы ожидаем появления беспроводных сетей пятого поколения, усовершенствование существующих коммуникаций и т.п. В концепции Интернета вещей нет места для уровня промежуточного слоя, датчики и исполнительные системы должны выходить напрямую в облако, где и будет происходить их взаимодействие.
A Brief, but Practical Introduction to the MQTT Protocol and its Application to IoT. Picture: Zoetrope labs
Протокол MQTT (Message Queuing Telemetry Transport) – это асинхронный протокол передачи телеметрических сообщений по принципу издатель/подписчик с использованием брокера. Этот протокол был разработан IBM и переведен в разряд открытых проектов организации Eclipse Foundation. Особенностью протокола является его компактность, т.к. величина заголовка пакета данных составляет всего лишь несколько байт. Он работает поверх стандартного протокола TCP и, для обеспечения безопасности, предполагает использование механизмов аутентификации на уровне «username/password» и использование шифрования транспортного протокола TLS/SSL. На текущее время, протокол MQTT стал стандартом де-факто для построения решений Интернета вещей.
Поскольку MQTT разработан для использования в среде Интернет-соединения, которое по определению стоит считать не надежным, протокол предусматривает три уровня обеспечения качества сервиса доставки. QoS 0: At most once – «не более одного». Издатель публикует сообщение на брокере, затем брокер публикует его для подписчика. На этом уровне не гарантируется обязательная передача данных подписчику. QoS 1: At least once – «хотя бы один». Подписчик должен получить данное сообщение как минимум один раз. Однако, сообщения могут дублироваться и это должен предусматривать в логике своей работы подписчик. QoS 2: Exactly one – «гарантированно один». Обеспечивает высшую гарантию доставки и отсутствие дублирования сообщений.
Для масштабирования своих решений можно воспользоваться конфигурацией типа «мост» между брокерами, и тем самым снизить нагрузку на каждый брокер в отдельности. Так же протокол MQTT позволяет подписчикам получать данные сразу по нескольким каналам. Для этого применяют wildcard-символы «+» и «#», чтобы отметить либо все записи в определенной подписке, либо только блок сообщений. Например, подписка на несколько разных датчиков температуры: «sensors/+/temperature/+» или сразу подписка на все каналы: «#». Можно еще долго обсуждать особенности протокола, но проще попробовать на реальном примере. В качестве брокера можно выбрать множество решений, но одним из самых популярных и легковесных брокеров является Mosquitto.
Для разворачивания брокера Mosquitto выберем простой вариант одноплатного компьютера, например, одну из первых версий Raspberry Pi Model B 512MB RAM. Данный выбор продиктован буквально тем, что находилось под рукой. Конечно, для реального проекта, следует отдельно изучить вопрос о надежности и производительности платы и, кроме выбора оптимальных аппаратных решений, также следует проработать вопросы: надежности корпуса, качества блока питания, безопасности системы в целом и т.п. Плату Raspberry Pi еще было интересно взять, чтобы окончательно развеять миф о трудностях старта проекта на базе открытых аппаратных решений и операционной системы Linux. Конечно, от разработчика требуются базовые знания, но современные платформы стали исключительно дружественными с точки зрения программного интерфейса и при этом хорошо документированы.
Photo: Raspberry Pi Model B 512MB RAM
В качестве операционной системы можно сделать выбор в сторону официальной прошивки Raspbian Stretch with desktop или Raspbian Stretch Lite. Это две одинаковые операционные системы на базе известного дистрибутива Debian Stretch, который модифицировали для работы с Raspberry Pi. Отличия, только в наличие графического рабочего стола, что для начала ознакомления вполне оправдано, но для сервера, конечно, графическая оболочка не к чему. Для установки выберем все-таки вариант с графическим рабочим столом и все это установим на недорогую флешку 8GB SD card. Фактически, остается загрузить образ операционной системы и при помощи очень удобной кроссплатформенной утилиты Etcher перенести образ на физический накопитель.
Screenshot: Etcher in Windows 10
Теперь остается поместить прошитую флешку в плату Raspberry Pi и подать питание. Есть ода особенность, если потребуется получить удаленный доступ к командной строке Raspbian Stretch по протоколу ssh, при этом нет клавиатуры, физически подключенной к плате, то можно записать пустой файл с именем ssh в загрузочный раздел флешки, что позволит активировать соответствующий доступ. После включения и Raspberry Pi доступ к операционной системе разрешен пользователю «pi» по паролю «raspberry». Пользователь по умолчанию «pi» может получить права root, выполнив команду sudo. Поскольку в Raspbian все подготовлено для комфортной работы неподготовленного пользователя, то первой командой в новой системе может стать вызов меню конфигурирования системы:
Screenshot: Remote connection to Raspberry Pi by SSH and run raspi-config
Утилита raspi-config позволяет задать новый пароль пользователю и, например, в меню «Interfacing Options» можно настроить поведение интерфейсов системы, разрешить удаленный рабочий стол по протоколу VNC и т.п. Так же в меню: «Boot Options» можно установить параметры по умолчанию для загрузки системы, например выбрать только режим командной строки, а в под-меню «Resolution» из меню «Advanced Options» установить нужное разрешение графического экрана, например, выбрав требуемый размер «DMT» – для цифрового интерфейса монитора или «CEA» – аналогового входа и т.п.
Теперь можно обновить пакеты системы:
$ sudo apt-get update
$ sudo apt-get upgrade
И установить брокер Mosquitto и клиента MQTT, например, для тестирования системы:
$ sudo apt-get install mosquitto
$ sudo apt-get sudo mosquitto-clients
Screenshot: Raspberry Pi terminal sessions
Просматривать подписки и делать публикации по протоколу MQTT, а также выполнить тестирование нагрузочной способности брокера, можно в среде браузера Chrome и операционных систем: Linux, Mac, Windows благодаря кроссплатформенному приложению MQTTBox.
Действительно, протокол MQTT сейчас стал настолько распространен, что не найти удобное решение для своих задач просто невозможно. Так же в рамках проекта Eclipse Paho активно развивается разработка открытых программных решений и библиотек, практически на всех языках программирования, для реализации протокола обмена сообщениями MQTT и, тем самым, совершенствования решений для Интернета вещей.
Построение решений на базе брокера MQTT становится уже тривиальной задачей. Стоит лишь развернуть систему, подключиться к облаку, например, используя Node-RED или специализированное решение и остается дело за «малым» — подключить интеллектуальные датчики и исполнительные механизмы. Для рассмотрения нижнего уровня систем IoT следует написать отдельную статью, но для данного примера вполне можно обойтись рассмотрением примера на базе фактического стандарта для Интернета вещей – платы NodeMCU на базе SoC ESP8266 компании Espressif.
Screenshot: MQTTBox in Windows 10
Плата NodeMCU изначально ориентирована на разработку на языке eLua. Для сборки прошивки можно использовать облачный сервис, а сама плата проекта существует виде открытого аппаратного решения NodeMCU DEVKIT V1.0, для которого уже выпущено множество аналогов. При этом следует отметить хорошую документацию проекта. Однако, очень субъективно, но при разработке интеллектуального датчика с протоколом MQTT на базе прошивки с eLua для NodeMCU DEVKIT все же придется встретиться с рядом трудностей с реализацией протокола MQTT. При этом вся инфраструктура проекта выглядит как-то недостаточно подготовленной к использованию в качестве среды для быстрой и качественной разработки микропроцессорных систем. Всегда всплывают какие-то мелочи и нюансы, но еще раз стоит повториться – это очень субъективная оценка. Интересно, а у читателей блога есть успешный опыт с eLua и MQTT?
Совершенно другое дело – выбор среды разработки Arduino IDE для работы с NodeMCU DEVKIT, впрочем, как и с другими платами на базе ESP8266. Все делается практически моментально на базе готовых библиотек и примеров кода. Для начала разработки следует с официального сайта проекта Arduino скачать открытую кроссплатформенную среду разработки Arduino IDE. Затем в параметрах «File» — «Preferences» — «Addition Boards Manager URLs:» указать ссылку на проект Arduino core for ESP8266 WiFi chip: arduino.esp8266.com/stable/package_esp8266com_index.json После этого в «Tools» — «Boards Manager» остается загрузить и установить поддержку для плат ESP8266 Community. Кстати, не следует забывать о том, что для работы с платой NodeMCU потребуется установить драйвер интерфейсного преобразователя CP210x или, его еще называют мост UART к USB.
Photo: Работа с платой NodeMCU
Для работы с протоколом MQTT можно установить библиотеку PubNub Arduino Library. Для этого в меню «Sketch» — «Include Library» — «Manage Libraries» выбрать соответствующую библиотеку и установить. Ознакомиться с возможностями программной платформы можно на базе примера кода, например, Basic ESP8266 MQTT example, где на брокере публикуется канал «outTopic», а также устанавливается подписка на «inTopic», и когда приходит на «inTopic» значение «1», то на плате включается встроенный светодиод. Все просто, быстро и отлично работает из коробки.
Screenshot: Arduino IDE with ESP8266 support
В завершении хочется отметить, что эта публикация не призывает использовать исключительно архитектуру ARM-процессоров для построения систем Интернета вещей и она лишь затронула особенности внедрения MQTT-брокера, как связующего звена для решений в области автоматизации. Но при этом у читателя может сформироваться мнение, что на сегодня решения для IoT – это удел гиков, экспериментаторов и фанатов, например, плат Raspberry Pi. Это верно, на этом и держится прогресс, но будущее уже с нами.
Пример, очевиден: коммерческое решение платформы беспроводных датчиков Wzzard для IoT и шлюза Spectre Network Gateway компании Advantech B+B SmartWorx. Здесь, как и во многих на сегодняшний день внедрений в производственные циклы, предложена архитектура защищенных от внешней среды промышленных датчиков, которые объединяются беспроводной сетью, основанной на стандартах 6LoWPAN и IEEE 802.15.4e. Для обработки данных на уровне облака предлагается шлюз с поддержкой протокола MQTT и передачей данных по коммуникациям беспроводной 3G-сети или проводного 10/100 Ethernet.