Протокол 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 – сам по себе является очень универсальным решением.
Говоря об ARM стоит думать не только о современных смартфонах, множестве применений в качестве домашних маршрутизаторов или средств прототипирования. Процессоры с такой архитектурой вполне могут работать в достаточно сложных условиях промышленных систем автоматики. Например, одноплатный компьютер CPU-351-13 компании Eurotech. Плата этого промышленного компьютера построена на базе ARM-процессора iMX.6 (1.2GHz) и является эффективной системой с пониженным энергопотреблением (порядка 4 Вт на четыре ядра), которая применяется в приложениях IoT/M2M, выдерживая эксплуатацию в диапазоне температур: -40° to +85°C. Плата содержит видеовыход, зарядное устройство (battery charger), сотовый модем (cellular), WiFi, Bluetooth LE и поддерживает технологию ZigBee. Так же плата идеально подходит для решения задач на транспорте, так как поддерживает шину CAN, имеет встроенный датчик ускорений (accelerometer) и систему приема GPS-сигнала.
Кроме промышленных решений архитектура 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 все подготовлено для комфортной работы неподготовленного пользователя, то первой командой в новой системе может стать вызов меню конфигурирования системы:
$ sudo raspi-config
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
Теперь можно проверить локально работу брокера MQTT, для чего подписаться, например, на событие: $ mosquitto_sub -h localhost -t "sensor/temperature"
И опубликовать какое-нибудь значения для соответствующего канала: $ mosquitto_pub -h localhost -t "sensor/temperature" -m 21.0
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.