ESP8266 в качестве MQTT брокера для мобильного приложения

    Как говорится, лень — двигатель прогресса. Для облегчения жизни сейчас делаю себе небольшое устройство в виде модуля ESP8266 и преобразователя RS485 для связи с датчиками-газоанализаторами по протоколу Modbus. В производстве постоянно возникает необходимость подключаться к приборам для выполнения различного рода диагностики по 485 интерфейсу, но каждый раз тащить с собой ноутбук неудобно, а вот мобильный телефон всегда в кармане.

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

    Приложение для телефона

    В качестве приложения я выбрал IoTmanager. Основная фича — это очень гибкая настройка виджетов с помощью HTML5+CSS, все настройки производятся в устройствах, а не в приложении. Топики отправляются в JSON формате и содержат в себе имена заголовков, значения и стили отображения. Возможно кому-то это будет неудобно, но мне такой подход понравился.

    Приложение может работать на двух MQTT библиотеках: Paho.js и MQTT.js. С ходу у меня получилось установить WebSocket соединение через библиотеку Paho, на ней я и остался работать. Если выбрать в настройках MQTT, соединения не происходит, подозреваю, что нужно поковырять библиотеку WebSocketServer.

    Я долго презирал Arduino, но все же сдался

    Не хочу разводить дискуссию по поводу выбора среды, просто скажу, что для меня важную роль в выборе Arduino IDE для написания прошивки ESP8266 сыграло наличие тонны готовых библиотек и документации. Все просто и быстро, благо проект обещает быть не сложным.

    Оффтопик
    Хотите верьте, хотите нет, но даже ракеты улетают в космос с микроконтроллерами, запрограммированными в среде Arduino. Решающую роль очень часто играет скорость разработки — подключил готовые библиотеки и в путь.

    Open Source наше все

    Репозиторий на GitHub. Библиотека пока сыровата, в некоторых случаях настройки виджетов вызывают реконнект IoTmanager’a, причину которого я найти пока не могу, возможно совместная разработка пойдет быстрее.

    Проект содержит в себе две реализации библиотеки:

    MQTTbroker.h это попытка реализовать реальный брокер с контролем подписок. Т.е когда приходит сообщение в топик, брокер проходит по всем клиентам и их подпискам и ищет совпадения (в том числе по маскам /+/) и рассылает сообщения только тем, у кого подписки соответствуют имени топика, не забывая про самого себя.

    MQTTbroker_lite.h работает немного быстрее за счет того, что в ней отсутствует автоматическая логика обработки подписок. Все приходящие сообщения перенаправляются в callback функцию основной программе, а там уже, если надо, обрабатываем их сами. Для конкретно моего случая нужна именно такая реализация: одно устройство — один подключаемый клиент, я знаю на что он подписан и чего от меня ждет.

    Пример работы

    Берем любой модуль с ESP8266 (у меня это NodeMcu) и загружаем в него скетч примера из библиотеки. Порт для отладки в инструментах Arduino IDE предлагаю отключить, иначе библиотека будет слать кучу отладочных сообщений, потом на них посмотрите. Открываем последовательный порт и наблюдаем IP адрес.

    На телефоне подключаемся к созданной Wi-Fi точке доступа. В приложении IoTmanager заходим в настройки подключения: выбираем движок PAHO, вбиваем IP адрес модуля, 80 порт, префикс топиков /IoTmanager и чуть ниже отключаем SSL/TLS.

    Жмем на спидометр в углу, после небольшой задержки должно подключиться и отобразить переключатели. Если не подключается, попробуйте убить и заново запустить приложение. На первом переключателе у меня настроен светодиод (см.видео).

    Иногда возникает задержка при подключении. Как я думаю, это связано с тем, что IoTmanager выдает все начальные сообщения за один раз, ESP немного подвисает, обрабатывая их, а дальше уже работает без тормозов.

    Короткое описание

    Обе части библиотеки очень похожи, приведу описание версии _lite:

    typedef void(*callback_t)(uint8_t num, Events_t event , String topic_name, uint8_t * payload, uint8_t length_payload); //функция callback'a должна иметь такой вид
    
    MQTTbroker_lite(WebSocketsServer * webSocket); //конструктору класса передаем указатель на WebSocket
    void setCallback(callback_t cb); //установка функции callback'a
    void begin(void); //начальная инициализация (обнуление массивов)
    void parsing(uint8_t num, uint8_t * payload, uint8_t length); //парсинг пришедшего в WS сообщения
    void publish(uint8_t num, String topic, uint8_t* payload, uint8_t length); //публикация сообщения клиенту num
    void disconnect(uint8_t num); //отключение клиента
    bool clientIsConnected(uint8_t num); //проверка клиента на соединение 

    Видео демонстрация


    Спасибо за внимание. Присоединяйтесь к разработке, библиотека еще сыровата.
    За помощью можно обращаться в Telegram oWart

    Ссылки:

    1. Проект на GitHub
    2. Описание виджетов IoTmanager
    3. Спецификация протокола MQTT v.3.1.1
    Поделиться публикацией

    Комментарии 12

      +1
      Arduino конечно ерунда полная, но для esp8266 Arduino это самый быстрый способ начать работать.
        0
        Согласен
        +1

        Сам протокол mqtt для iot отлично подходит. Только появляется необходимость держать локальный или внешний брокер на более мощном железе. Так что запуск брокера на микроконтроллере очень интересен.
        Не силен в C++, но, так понял, код на C переписать можно.
        Есть статистика использования памяти?

          0
          Нет, статистики никакой нет, в esp8266 и arduino ide не силен
            +1

            Нормальный полноценный брокер с offline QOS2 на ЕSP не запилить. Так что, если нужно что-то большее чем QOS0 — не мучайте железку, не потянет.

              0
              Это да… бесполезно
            +1
            а где же ModBus? ожидал что он отдаёт/получает данные и передаёт на MQTT. или это ещё будет делаться?
              0
              Модбас только в планах, сначала надо было соединить телефон и esp доступным средствами
              +2
              Не понятен смысл этой затеи. Для чего использовать MQTT в данном случае?
              Теряется смысл протокола.
                +1
                MQTT т.к распространен и есть готовые клиенты для мобильных телефонов. Писать что-то свое под iOS не входило в мои планы. Вебсервер не даст той скорости обновления данных, как хотелось бы… я так думаю
                  0
                  Согласен с предыдущим оратором )) Идея хороша, но инструмент, ИМХО, сильно избыточен.

                  Если ставится задача на посмотреть что-то через модбас, то проще и «дешевле» сделать микро- веб страничку в ЕСП-шке. Ибо чаще раза в секунду всё равно опрашивать без толку, да mqtt внесёт ещё и дополнительные задержки.

                  Если уж очень хочется «живого» обновления, то не рефрешем всей страницы, а используя ajax/websocket (не помню, допилили ли их).

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

                Самая большая проблема esp8266 (но не esp32)- нешифруемая флеш-память отдельно от чипа. Чтобы взломать инфраструктуру — достаточно украсть девайс.

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                Самое читаемое