Магистр ДонНТУ Потопахин Алексей Александрович
Потопахин Алексей АлександровичФакультет компьютерных наук и технологийКафедра искусственного интеллекта и системного анализаСпециальность Технологии программного обеспечения интеллектуальных системИсследование и разработка метода управления трехмерной сценой с помощью динамических жестовНаучный руководитель: доц. Ручкин Константин Анатольевич

MQTT для Интернета вещей

Введение

Данный раздел посвящен обзору сетевого протокола MQTT, сравнение с HTTP, эффективность использования для Интернета вещей, а также применение на практике. В качестве практического применения в разделе описывается управление микроконтроллером Arduino Pro Mini на ATmega328P через микрокомпьютер Raspberry Pi, которые соединены между собой через UART узел.

Что такое Интернет-вещей?

Прежде чем перейти к самому обзору MQTT, пару слов об Интернет вещей. Технологии Интернета вещей (Internet of Things, IoT) – это широкая сеть устройств, подключенных к Интернету, в том числе смартфоны, планшеты и практически любые вещи, оснащенные датчиками: автомобили, промышленное оборудование, реактивные двигатели, нефтяные вышки, носимые устройства и многое другое. Все эти вещи собирают данные и обмениваются ими [1].

Следуя этой концепции и современным разработкам в данной области микрокомпьютер с веб-сервером и набором датчиков можно встроить куда угодно: чайник, розетка, кофемолка и т.д. А зачем? Ну например, если встроить датчик температуры в простой электрический чайник, то можно удаленно наблюдать за процессом закипания воды. А если добавить условие, скажем: при температуре 100 градусов выключить чайник или поддерживать температуру на уровне 70-90 градусов, чтобы всегда иметь доступ к горячей воде. Реализаций можно придумать великое множество. На самом деле это очень примитивный пример и уже на данный момент существуют коммерческие предложения на рынке, но он описывает саму концепцию. Таким образом обычные для нас бытовые приборы могут обмениваться информацией между собой и человеком.

Что такое MQTT?

Для обмена информацией устройствам нужен простой и легковесный сетевой протокол, который позволит им эффективно функционировать и взаимодействовать в сети, асинхронность, а также поддерживаемый любыми устройствами и операционными системами. Все эти задачи с легкостью решает протокол MQTT.

Логотип mqtt.org

MQTT (ранее известный как Message Queueing Telemetry Transport) – это простой, быстродействующий протокол связи, работающий поверх TCP/IP, разработанный для Интернета вещей. Протокол призван быть простым протоколом обмена сообщениями через брокера по схеме публикации/подписки, при разработкекоторого преследуется цель обеспечить открытость, простоту, минимальные требования к ресурсам и удобство внедрения. С момента его появления цель удобства внедрения была достигнута, так как были разработаны различные библиотеки для внедрения клиентов MQTT [2].

Схема простого взаимодействия между подписчиком, издателем и брокером представлена ниже:

Схема взаимодействия MQTT [3]
Реализации MQTT

Наиболее известная реализация брокера – Mosquitto от Eclipse. Платформа реализует возможность обмена сообщениями между компонентами системы на базе стандартов протокола MQTT. Mosquitto написан на C и распространяется под лицензией EPL/EDL. Поддерживаются операционные системы Windows, Mac и Linux.

Логотип mosquitto.org

Реализацию по схеме публикации/подписки выполняет библиотека Paho также от Eclipse. Поддерживаются все основные популярные языки программирования: C/C++, Java, JavaScript, Python, Go, C#.

В практическом примере будут использоваться эти решения от Eclipse.

MQTT vs HTTP

HTTP на момент написания раздела самый популярный и широко используемый протокол для коммуникации устройств. Прежде чем решать свои задачи выбор был в пользу HTTP, но с ростом популярности Интернета вещей и MQTT, заставило разобраться в этом вопросе. На сегодняшний день производительность устройств для Интернета вещей довольно невысока по сравнению с высокопроизводительными веб-серверами. Это относится прежде всего к Arduino платформам и популярному микроконтроллеру ESP8266. Raspberry Pi намного мощнее, однако если связь поддерживается только через мобильный интернет, то и в этом случае могут возникать проблемы.

Главными преимуществами MQTT протокола в данном случае являются его легковесность (MQTT передает данные как массив байтов) и использование схемы издатель-подписчик при обмене сообщениями. Заголовок сообщений MQTT короткий, а наименьший размер пакета сообщений составляет 2 байта. Использование текстового формата сообщений в HTTP протоколе позволяет создавать более длинные заголовки и сообщения, которые понятны человеку. Это помогает избавиться от ошибок, но в то же время это излишне для устройств с ограниченными ресурсами [4].

Кроме всего в мобильных сетях пропускная способность MQTT выше, чем HTTP, а протокол также предоставляет высокие гарантии доставки сообщений благодаря возможности доступа клиентам к сохраненным (retained) сообщениям, которые может хранить брокер, в случае если соединение было разорвано. В следующем подразделе приводится скриншот с запущенными процессами и развертывание брокера (Mosquitto) на Raspberry Pi Model B обходится системе ~1% от всей памяти (без нагрузки). HTTP веб-сервер с настроенной системой аутентификации и защитой был бы более ресурсоемким. Таким образом MQTT идеально подходит для Интернета вещей.

Что на практике?

На практике ставится задача управления Arduino Pro Mini через протокол MQTT. Однако у модуля из-за своих компактных размеров отсутствуют Ethernet, Wi-Fi и USB. Поэтому было принято решение для связи использовать микрокомпьютер Raspberry Pi. В схеме участвует Raspberry Pi Model B, однако это актуально для любой другой модели. Схема подключения через UART изображена ниже:

Raspberry Pi не может принять выходной сигнал от Arduino (TX) напряжением 5В. Входы одноплатного компьютера рассчитаны на принятие сигнала только 3.3В. Поэтому для того, чтобы Raspberry Pi мог обработать 3.3В, необходимо в схеме использовать делитель напряжения. Это достигается при помощи двух резисторов сопротивлением 330 и 470 Ом. Можно использовать резисторы любыми другими номиналами, которые смогут обеспечить ~3.3В.

Далее необходимо разобраться с софтом, который позволит нам отправлять команды в Arduino. На Raspberry Pi запускается Mosquitto брокер. Но это не обязательно, можно использовать сервисы, которые предоставляют платно/бесплатно услуги брокера в сети. Также нужен клиент, который будет одновременно подписчиком и выполнять публикацию сообщений. Для таких целей существует мощный инструмент Node-RED. Данный инструмент позволяет объединять устройства, API и онлайн-сервисы в рамках концепции Интернета вещей. Node-RED предоставляет редактор настроек в веб-интерфейсе. Пример настройки приведен ниже:

Однако для поставленной задачи использование такого инструмента избыточно и в приоритете прежде всего производительность и экономия памяти Raspberry Pi. Поэтому было принято решение реализовать приложение на основе библиотеки Eclipse PahoPi4J, которое работало как сервис и выступало в роли моста между брокером и Arduino. В итоге было реализовано приложение MQTT Serial Device Bridge (MSDB) на Java, исходники на GitHub. На рисунке ниже показан список запущенных процессов Node-RED и MSDB:

Можно заметить, что Node-RED ресурсоемкий инструмент. Если отключить веб-редактор в настройках параметром disableEditor, то ситуация не изменится. Приложение MSDB не идеально. Вполне возможно, что реализации на Python и C/C++ могут дать результат лучше. В итоге мост связывает брокер с Arduino и любой клиент может отправлять команды микроконтроллеру.

Источники