Как говорится, лень — двигатель прогресса. Для облегчения жизни сейчас делаю себе небольшое устройство в виде модуля 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. dernuss
    20.04.2017 22:13
    +1

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


    1. oWart
      21.04.2017 10:50

      Согласен


  1. timurey
    21.04.2017 09:28
    +1

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


    1. oWart
      21.04.2017 10:44

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


    1. barkalov
      23.04.2017 11:14
      +1

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


      1. oWart
        23.04.2017 21:39

        Это да… бесполезно


  1. cisaa
    21.04.2017 10:41
    +1

    а где же ModBus? ожидал что он отдаёт/получает данные и передаёт на MQTT. или это ещё будет делаться?


    1. oWart
      21.04.2017 10:45

      Модбас только в планах, сначала надо было соединить телефон и esp доступным средствами


  1. ByTE1974
    21.04.2017 10:42
    +2

    Не понятен смысл этой затеи. Для чего использовать MQTT в данном случае?
    Теряется смысл протокола.


    1. oWart
      21.04.2017 10:48
      +1

      MQTT т.к распространен и есть готовые клиенты для мобильных телефонов. Писать что-то свое под iOS не входило в мои планы. Вебсервер не даст той скорости обновления данных, как хотелось бы… я так думаю


      1. av0000
        21.04.2017 14:03

        Согласен с предыдущим оратором )) Идея хороша, но инструмент, ИМХО, сильно избыточен.

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

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

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


  1. barkalov
    23.04.2017 11:17

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