В процессе разработки получилась библиотека, которая позволяет подключаться напрямую с телефона к модулю и обмениваться данными через приложение MQTT клиента. Возможно кому-то такое решение тоже пригодится, ведь отпадает необходимость иметь сторонний MQTT брокер (будь то локальный брокер на Raspberry или брокер в интернете) и подключение к интернету, что в моем случае самое главное.
Приложение для телефона
В качестве приложения я выбрал IoTmanager. Основная фича — это очень гибкая настройка виджетов с помощью HTML5+CSS, все настройки производятся в устройствах, а не в приложении. Топики отправляются в JSON формате и содержат в себе имена заголовков, значения и стили отображения. Возможно кому-то это будет неудобно, но мне такой подход понравился.
Приложение может работать на двух MQTT библиотеках: Paho.js и MQTT.js. С ходу у меня получилось установить WebSocket соединение через библиотеку Paho, на ней я и остался работать. Если выбрать в настройках MQTT, соединения не происходит, подозреваю, что нужно поковырять библиотеку WebSocketServer.
Я долго презирал Arduino, но все же сдался
Не хочу разводить дискуссию по поводу выбора среды, просто скажу, что для меня важную роль в выборе Arduino IDE для написания прошивки ESP8266 сыграло наличие тонны готовых библиотек и документации. Все просто и быстро, благо проект обещает быть не сложным.
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)
timurey
21.04.2017 09:28+1Сам протокол mqtt для iot отлично подходит. Только появляется необходимость держать локальный или внешний брокер на более мощном железе. Так что запуск брокера на микроконтроллере очень интересен.
Не силен в C++, но, так понял, код на C переписать можно.
Есть статистика использования памяти?
ByTE1974
21.04.2017 10:42+2Не понятен смысл этой затеи. Для чего использовать MQTT в данном случае?
Теряется смысл протокола.oWart
21.04.2017 10:48+1MQTT т.к распространен и есть готовые клиенты для мобильных телефонов. Писать что-то свое под iOS не входило в мои планы. Вебсервер не даст той скорости обновления данных, как хотелось бы… я так думаю
av0000
21.04.2017 14:03Согласен с предыдущим оратором )) Идея хороша, но инструмент, ИМХО, сильно избыточен.
Если ставится задача на посмотреть что-то через модбас, то проще и «дешевле» сделать микро- веб страничку в ЕСП-шке. Ибо чаще раза в секунду всё равно опрашивать без толку, да mqtt внесёт ещё и дополнительные задержки.
Если уж очень хочется «живого» обновления, то не рефрешем всей страницы, а используя ajax/websocket (не помню, допилили ли их).
На своих домашних датчиках делаю шаблонообразную веб морду для конфига и просмотра живых значений с рефрешем страницы целиком. Даже раз в секунду полсотни значений нормально успевает отдать
barkalov
23.04.2017 11:17Самая большая проблема esp8266 (но не esp32)- нешифруемая флеш-память отдельно от чипа. Чтобы взломать инфраструктуру — достаточно украсть девайс.
dernuss
Arduino конечно ерунда полная, но для esp8266 Arduino это самый быстрый способ начать работать.
oWart
Согласен