MQTT клиент для Arduino, ESP8266, ESP32

Обмен сообщениями между устройствами

Пользовательские блоки для коммкникации и связи GSM, GPRS, IR, Bluetooth и другие
Правила форума
Рекомендации по размещению блоков:
Автор блока создает подробное описание блока, отличие от подобных(если есть на данный момент).Сложные блоки очень желательно с примерами.
При выходе новых версий редактирует/дополняет свой первый пост с указанием даты, версии, причины.
В каждой теме обсуждается только выложенный автором блок - баги, возможность (или предложение) доработки и прочие хотелки.
Свои блоки, переработанные, с другими библиотеками, протоколами и т.д.- размещаем либо сами отдельно, либо обсуждаем и дорабатываем в форуме Разработка блоков.
Пользователи улучшив блок автора и проверив его работоспособность - могут обратиться к автору или модераторам с просьбой добавить их версию блока в первое сообщение темы.
User8
Лейтенант
Сообщения: 341
Зарегистрирован: 12.06.2017{, 14:44}
Репутация: 103
Имя: Евгений

MQTT клиент для Arduino, ESP8266, ESP32

#1

Сообщение User8 » 08.09.2018{, 14:04}

Подробнее про MQTT:
https://ipc2u.ru/articles/prostye-reshe ... akoe-mqtt/

Установка брокера:
Windows: https://youtu.be/jFUPy1q3ze8
Linux: https://youtu.be/sNSWxyO6XSk
Raspberry Pi / Orange Pi: https://youtu.be/b7NRT-RNPOU
https://robot-on.ru/articles/ystanovka- ... -orange-pi
OpenWrt: https://youtu.be/ADBct61FLsU
Брокер на ESP8266: viewtopic.php?f=133&t=4117
https://youtu.be/QFdx8bnVRHc

Быстрый старт без установки брокера используя сайт beebotte.com:
https://youtu.be/XVnY4za6-uU
viewtopic.php?f=71&t=6293
Брокер от пользователя форума:
viewtopic.php?f=151&t=6474&sid=dc2ead44 ... =20#p91410

Настройка и использование MQTT в FLProg:
https://www.youtube.com/watch?v=QGQpr_Rc8mo
https://www.youtube.com/watch?v=KVksHJS-y-A
https://www.youtube.com/playlist?list=P ... oBGySyEDaU

Управление с помощью Яндекс Алисы и mqtt:
viewtopic.php?f=187&t=7602

Группы в Telegram:
https://t.me/joinchat/6CFnBYY5BUM0ZmZi
https://t.me/joinchat/BRr4VVHiIr1B3pMJNvlzEg

Описание блока Main: (Настройки клиента)
mqttServer - ip или домен mqtt брокера (нужно указывать без https://).
mqttPort - порт mqtt брокера (по умолчанию: 1883).
mqttUser - имя пользователя на брокере, можно использовать один логин и пароль на всех mqtt клиентах.
mqttPassword - пароль.
mqttClientId - любое уникальное название на английском, нужно для идентификации на брокере. Для всех клиентов должно быть разное.
Выход mqttConnected - на данном выходе будет единица, если есть подключение к брокеру.
Last Will сообщение - сообщение, которое будет отправлено в указанный топик, после отключения клиента от брокера.
По умолчанию Will топик равен установленному значению на входе mqttClientId.
Пример: мы указали в настройках: willMessageOnline: 1; willMessageOffline: 0; willTopic: client1;
После старта esp и подключению к брокеру, в топик client1 будет отправлено сообщение 1, а при отключении esp от брокера в топик client1 будет отправлено сообщение 0. Параметром keepAlive можно отрегулировать, через сколько секунд брокер отправит сообщение willMessageOffline после отключения esp от брокера. Не рекомендуется ставить меньше 5 секунд.

Описание блока Sub: (Прием сообщения)
Unsubscribe - при удержании единицы происходит отписка от топика, сообщения в топик перестают приходить. При пропадании единицы происходит подписка на топик снова. Данный вход может быть полезен для получения периодических сообщений, когда только нужно или один раз при старте контроллера, можно использовать для оптимизации программы.
Topic - топик для получения сообщения.
QoS - можно указать 0, 1 или 2. Если не указывать ничего, то сообщение принимается с QoS 0.
- Если вы поставили на блоке pub QoS 2, то на блоке sub вы также должны выставить QoS 2 для приема недоставленных сообщений.
- Для корректной работы QoS 1 и 2, на брокере и всех esp должен быть выставлен Clean Session = false.
Выход Received - на данном выходе будет единица в один цикл при получении любого сообщения в топик.
Выход Message - получение сообщения из указанного на входе топика.

Описание блока Pub: (Отправка сообщения)
Send - при поступлении на данный вход единицы, будет отправлено сообщение один раз. Данный вход имеет встроенный Rtrig, не используйте внешний.
Topic - топик, куда будет отправлено сообщение. (Пример: house/room1/lamp1/status)
Message - сообщение, которое будет отправлено на брокер.
QoS - можно указать 0, 1 или 2. Если не указывать ничего, то сообщение отправляется с QoS 0.
- Esp не сохраняет у себя неотправленные сообщения, вы должны сами проконтролировать, чтобы сообщение дошло до брокера с QoS 1 и 2, после чего брокер возьмет на себя ответственность по доставке сообщений с QoS 1 и 2.
- Используйте qos 1 и 2 только для очень важных сообщений, не нужно использовать qos для отправки например показаний температуры или других показаний с датчиков.
Retain - если true, последнее отправленное сообщение сохраняется на mqtt брокере. Это сообщение будет получать подписчик при подключении к брокеру.
Выход qosDelivered - нужен для контроля доставки сообщений с QoS 1 и 2 до брокера. При подаче и удерживании единицы на входе Send, на выходе qosDelivered будет единица, если сообщение доставлено на брокер. Единица будет держаться на данном выходе пока на входе Send не пропадет единица.

Не забудьте включить wifi клиент в настройках контроллера и указать данные вашей wifi сети.

Библиотека: viewtopic.php?p=61491#p61491
Последняя версия библиотеки: https://github.com/marvinroger/async-mqtt-client

Новая версия блоков:
viewtopic.php?p=113908#p113908

Блоки для Ethernet Arduino: viewtopic.php?p=61490#p61486
Main блок для ESP32: viewtopic.php?p=61490#p61490
Копии блоков для ESP8266 и ESP32, для подключения к двум брокерам одновременно: viewtopic.php?p=61489#p61489
Блоки для ESP8266:
Вложения
MQTT_ESP_Main_6_8_(CODE).ubi
(521.53 КБ) 2754 скачивания
MQTT_ESP_Sub_6_8_(CODE).ubi
(38.95 КБ) 2579 скачиваний
MQTT_ESP_Pub_6_8_(CODE).ubi
(44.63 КБ) 2671 скачивание
Последний раз редактировалось User8 28.01.2023{, 01:57}, всего редактировалось 175 раз.

SerOv
Лейтенант
Сообщения: 570
Зарегистрирован: 06.01.2018{, 19:50}
Репутация: 26

MQTT для Arduino, ESP8266, ESP32

#161

Сообщение SerOv » 30.12.2018{, 23:57}

Как на графике, связь показывет что не было, а график не меняется
СпойлерПоказать
к3.jpg
Отправлено спустя 2 минуты 24 секунды:
А я понял. надо скриптом делать?

Аватара пользователя
pipapsix
Лейтенант
Сообщения: 436
Зарегистрирован: 25.10.2016{, 21:26}
Репутация: 15
Откуда: Волгоградская обл.
Имя: СашкаСаняАлександр

MQTT для Arduino, ESP8266, ESP32

#162

Сообщение pipapsix » 31.12.2018{, 05:56}

Timoha писал(а):
30.12.2018{, 21:30}
Попробуйте задействовать в вашей схеме часы реального времени. (включение/отключение реле по времени)
Вот о том и речь.
Часы имеются в проекте, мне нужно управлять и с помощью часов и с помощью MQTT одним и тем же реле.

slon-genia
Сержант
Сообщения: 102
Зарегистрирован: 21.11.2016{, 11:05}
Репутация: 2

MQTT для Arduino, ESP8266, ESP32

#163

Сообщение slon-genia » 31.12.2018{, 08:13}

pipapsix писал(а):
31.12.2018{, 05:56}
Timoha писал(а):
30.12.2018{, 21:30}
Попробуйте задействовать в вашей схеме часы реального времени. (включение/отключение реле по времени)
Вот о том и речь.
Часы имеются в проекте, мне нужно управлять и с помощью часов и с помощью MQTT одним и тем же реле.
Я выкладывал свой проэкт в этой теме. Там трёхканальное реле управления освещением. Управление идёт как по MQTT, так и с местного выключателя. Поставьте вместо выключателя свой таймер либо часы и будет вам то что вы хотите.

Timoha
Рядовой
Сообщения: 11
Зарегистрирован: 06.10.2017{, 21:15}
Репутация: 0
Откуда: Москва
Имя: Юрий

MQTT для Arduino, ESP8266, ESP32

#164

Сообщение Timoha » 31.12.2018{, 09:58}

pipapsix,
В своем первом ответе, я поначалу выложил эту схему, после посчитал что в данной теме она немного не к месту - удалил. надеюсь топикстартер позволит - если снесет данное сообщение, не обижусь.
В данной схеме плата освещения из рабочего проекта "умного курятника" ))))... в схеме реализовано автоматическое включение и отключение по времени (включая рассвет/закат), ручное управление (mqtt), а также управление режимами: авто, ручное, отключение. Посмотрите, может найдете для себя что то полезное.
Вложения
освещение_авто(рассвет_закат)_ ручное.png

Аватара пользователя
pipapsix
Лейтенант
Сообщения: 436
Зарегистрирован: 25.10.2016{, 21:26}
Репутация: 15
Откуда: Волгоградская обл.
Имя: СашкаСаняАлександр

MQTT для Arduino, ESP8266, ESP32

#165

Сообщение pipapsix » 31.12.2018{, 19:38}

Timoha,
Благодарю, возьму что мне нужно.

Всех с наступающим.
В Волгоградской области НГ на час раньше.

Отправлено спустя 29 секунд:
slon-genia,
Я тоже помню было, но не наткнулся.

Аватара пользователя
pipapsix
Лейтенант
Сообщения: 436
Зарегистрирован: 25.10.2016{, 21:26}
Репутация: 15
Откуда: Волгоградская обл.
Имя: СашкаСаняАлександр

MQTT для Arduino, ESP8266, ESP32

#166

Сообщение pipapsix » 02.01.2019{, 17:14}

С наступившим.
Тут я не пойму в чем дело.
Значит работали две есп, все передавали.
А так как ростелеком задолбал, решил отказаться от него.
Взял билайновский ВАФАЙ модем , перешил его под теле2., подключил безлимит.
Положил его под крышу, выдает до 60мб, настраиваю WIFI антену TPLINK мостом к модему, от него шнуром к роутеру(на роутере WIFI отключил),все ништяк на компах и смартфонах интет есть.
в ESPках прописал новую сетть от тплинка, они подключаются к нему, вижу их в настройках. Могу даже открыть ВЭБ ЕСПШЕК и зати в него, а вот MQTT серверу не подключаются.

CraCk
Лейтенант
Сообщения: 633
Зарегистрирован: 10.09.2015{, 21:51}
Репутация: 10

MQTT для Arduino, ESP8266, ESP32

#167

Сообщение CraCk » 02.01.2019{, 18:51}

User8 писал(а):
25.12.2018{, 15:47}
Да эта даже лучше, т.к. асинхронно работает, но нужно разбираться. На днях заберу esp горстку и нормально протестирую все.
Как самочувствие после НГ?
Говорят что на этой библиотеке работает qos.

User8
Лейтенант
Сообщения: 341
Зарегистрирован: 12.06.2017{, 14:44}
Репутация: 103
Имя: Евгений

MQTT для Arduino, ESP8266, ESP32

#168

Сообщение User8 » 02.01.2019{, 20:02}

CraCk, жив, не понятно как там qos работает, потратил много времени чтобы добиться работы qos на sub блоке на этой библиотеке, в итоге приходит только последнее сообщение с одного топика. Нужно какой-то буфер делать, чтобы временно хранить полученные данные, но примеров как этот буфер реализовать я не нашел. При включении esp с брокера приходят все данные и в итоге в переменную записывается только последнее сообщение. У меня недостаточно знаний, чтобы сделать этот буфер, надеюсь кто-то возьмется доделать. Насчет qos на pub блоке почти не проверял, вроде как не работает если данные не отосланы на брокер, но на блоке pub qos не так критичен, всегда можно отослать и проверить дошло или нет сообщение. Все сложно с этими qos для микроконтроллеров...

Отправлено спустя 9 минут 16 секунд:
Еще одна версия блоков на другой библиотеке: https://github.com/marvinroger/async-mqtt-client
Зависаний щас совсем вроде нет, даже во время коннекта. Все должно работать кроме qos, с ним все непонятно.
Удалил прикрепленные блоки, нужно доработать...
Последний раз редактировалось User8 02.01.2019{, 23:14}, всего редактировалось 1 раз.

SerOv
Лейтенант
Сообщения: 570
Зарегистрирован: 06.01.2018{, 19:50}
Репутация: 26

MQTT для Arduino, ESP8266, ESP32

#169

Сообщение SerOv » 02.01.2019{, 21:55}

А почему после 4-ой сразу 6-я версия? И какие главные отличия между ними? Можете описать.

User8
Лейтенант
Сообщения: 341
Зарегистрирован: 12.06.2017{, 14:44}
Репутация: 103
Имя: Евгений

MQTT для Arduino, ESP8266, ESP32

#170

Сообщение User8 » 02.01.2019{, 22:18}

SerOv, 5.0 еще на одной библиотеке, выкладывал на предыдущих страницах. Как таковой разницы почти нет, пытаемся найти лучшую.

SerOv
Лейтенант
Сообщения: 570
Зарегистрирован: 06.01.2018{, 19:50}
Репутация: 26

MQTT для Arduino, ESP8266, ESP32

#171

Сообщение SerOv » 02.01.2019{, 22:22}

У меня на вашей 4 версии. Работает в мажордомо. Спасибо вам за блоки.

User8
Лейтенант
Сообщения: 341
Зарегистрирован: 12.06.2017{, 14:44}
Репутация: 103
Имя: Евгений

MQTT клиент для Arduino, ESP8266, ESP32

#172

Сообщение User8 » 02.01.2019{, 23:13}

Блоки для Arduino Ethernet:

Если используете блоки на нескольких arduino, не забудьте зайти в параметры Main блока и изменить mac адрес.
В параметре mac замените последний символ на 0xEE или 0xEF. На каждой arduino должен быть разный mac адрес.


Используйте клеммы вместо переменных хотя бы для входов/выходов String в вашем проекте, чтобы использовать меньше динамическую память и не получить глюки во время работы arduino. Особенно это касается Arduino Uno, Nano, Pro mini и других подобных контроллеров на atmega328p.
Вложения
MQTT_Ethernet_Main_3_6_(CODE).ubi
(304.44 КБ) 503 скачивания
MQTT_Ethernet_Sub_3_6_(CODE).ubi
(27.65 КБ) 466 скачиваний
MQTT_Ethernet_Pub_3_6_(CODE).ubi
(19.74 КБ) 488 скачиваний
Последний раз редактировалось User8 05.07.2019{, 05:17}, всего редактировалось 53 раза.

User8
Лейтенант
Сообщения: 341
Зарегистрирован: 12.06.2017{, 14:44}
Репутация: 103
Имя: Евгений

MQTT клиент для Arduino, ESP8266, ESP32

#173

Сообщение User8 » 03.01.2019{, 01:04}

Копии блоков для ESP8266 и ESP32, для подключения еще к одному брокеру одновременно.
Вложения
MQTT_ESP32_Main_6_8_copy_(CODE).ubi
(435.29 КБ) 420 скачиваний
MQTT_ESP_Main_6_8_copy_(CODE).ubi
(99.2 КБ) 521 скачивание
MQTT_ESP_Sub_6_8_copy_(CODE).ubi
(39.8 КБ) 527 скачиваний
MQTT_ESP_Pub_6_8_copy_(CODE).ubi
(44.65 КБ) 562 скачивания
Последний раз редактировалось User8 30.04.2020{, 21:20}, всего редактировалось 12 раз.

User8
Лейтенант
Сообщения: 341
Зарегистрирован: 12.06.2017{, 14:44}
Репутация: 103
Имя: Евгений

MQTT клиент для Arduino, ESP8266, ESP32

#174

Сообщение User8 » 03.01.2019{, 01:05}

Main блок для ESP32, блоки pub и sub возьмите от ESP8266.

Используется обновленная библиотека, для корректной работы mqtt, нужно удалить старую библиотеку.
Удалите папку async-mqtt-client по пути: flprog\ideV4\libraries\ и еще возможно из flprog\ideV4\portable\sketchbook\libraries\ После компиляции проекта, flprog сама добавит новую библиотеку.
Вложения
MQTT_ESP32_Main_6_8_(CODE).ubi
(441.19 КБ) 969 скачиваний
Последний раз редактировалось User8 25.01.2020{, 23:21}, всего редактировалось 21 раз.

User8
Лейтенант
Сообщения: 341
Зарегистрирован: 12.06.2017{, 14:44}
Репутация: 103
Имя: Евгений

MQTT клиент для Arduino, ESP8266, ESP32

#175

Сообщение User8 » 03.01.2019{, 01:09}

MQTT библиотека для ESP8266 и ESP32, разархивировать в папку: flprog\ideV3\libraries\ или flprog\ideV4\libraries\

Для тех, у кого flprog сама не экспортировала библиотеку из блоков или антивирус заблокировал данное действие.
Вложения
async-mqtt-client.zip
(107.13 КБ) 1266 скачиваний
Последний раз редактировалось User8 14.12.2019{, 23:07}, всего редактировалось 5 раз.

starshoy81
Лейтенант
Сообщения: 530
Зарегистрирован: 05.04.2016{, 23:30}
Репутация: 29
Откуда: Санкт-Петербург
Имя: Илья

MQTT для Arduino, ESP8266, ESP32

#176

Сообщение starshoy81 » 03.01.2019{, 01:14}

User8, CraCk, вот кстати, по поводу qos указано в последней обсуждаемой библиотеке:
async-mqtt-client :: index
Ограничения и известные проблемы
Когда для CleanSession установлено значение false, реализация не соответствует спецификации. Следующее не соблюдается:
Нужно помнить:

Все сообщения в потоке QoS 1 или 2, которые не подтверждены посредником
Все полученные сообщения QoS 2, которые еще не подтверждены брокеру
Это означает, что повторная передача не выполняется в случае сбоя.

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

Так что надо еще и настраивать брокер на корректную работу с сообщениями. В частности CleanSession в True и выделять память для хранения сообщений. Памяти нужно прилично, т.к. обмен идёт string типом. На моей малине процесс москито занимает 6 Мб, при четырёх клиентах на дефолтных настройках.
Также надо учитывать, что не все авторы библиотек реализуют полную поддержку протокола. И, также, под какую версию протокола написана библиотека.

User8
Лейтенант
Сообщения: 341
Зарегистрирован: 12.06.2017{, 14:44}
Репутация: 103
Имя: Евгений

MQTT для Arduino, ESP8266, ESP32

#177

Сообщение User8 » 03.01.2019{, 01:19}

starshoy81, c cleanSession true никакие сообщения с qos 1 2 не дойдут, если во время передачи одно из устройств не будет подключено к брокеру.

starshoy81
Лейтенант
Сообщения: 530
Зарегистрирован: 05.04.2016{, 23:30}
Репутация: 29
Откуда: Санкт-Петербург
Имя: Илья

MQTT для Arduino, ESP8266, ESP32

#178

Сообщение starshoy81 » 03.01.2019{, 03:11}

User8, не дойдут, только если подписчик отвалился от брокера, а сообщения в этот же момент приняты. Фактически же маловероятно. У меня есть интересный опыт - на даче исполнительное устройство, я рядом с ним, клиент mqtt на смарте подключен через сотовую сеть к брокеру в городе, в городе брокер сидит за роутером с проводным интернетом, этот брокер стоит в мосту с брокером на даче, брокер на даче сидит через сотовую сеть со скоростью 64 кбит\сек на роутере, к роутеру подключен клиент шилд 5100 подключенный к меге, на меге запущена программа трансляции mqtt на модбас, мега через 485 на скорости 19200 бит\сек передаёт данные в контроллер, который управляет тем исполнительным устройством, про которое я писал в начале этой длинной цепочки. Так вот - задержки команд управления на глаз не видны, не смотря на приличное количество узлов трансляции. Поэтому в локалке принятые сообщения практически моментально оказываются у подписчика.

"При подключении клиент устанавливает флаг «чистого сеанса», который иногда также называют флагом «чистого запуска». Если для чистой сессии задано значение false, то соединение считается долговременным. Это означает, что когда клиент отключается, все подписки, которые он имеет, остаются, и любые последующие сообщения QoS 1 или 2 будут сохраняться до тех пор, пока он не подключится снова в будущем. Если чистый сеанс имеет значение true, то все подписки будут удалены для клиента при его отключении."

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

User8
Лейтенант
Сообщения: 341
Зарегистрирован: 12.06.2017{, 14:44}
Репутация: 103
Имя: Евгений

MQTT для Arduino, ESP8266, ESP32

#179

Сообщение User8 » 03.01.2019{, 21:41}

ESP Main блок в первом посте обновлен, исправил небольшое упущение - подписка на топики происходила в каждом цикле, теперь подписка происходит один раз, после подключения к брокеру.

User8
Лейтенант
Сообщения: 341
Зарегистрирован: 12.06.2017{, 14:44}
Репутация: 103
Имя: Евгений

MQTT для Arduino, ESP8266, ESP32

#180

Сообщение User8 » 06.01.2019{, 09:58}

В библиотеке есть возможность узнать, дошло сообщение до брокера или нет с QoS 1 и 2. Долго думал как это реализовать, чтобы можно было пользоваться, вот что придумал:
Выход qosDelivered - нужен для контроля доставки сообщений с QoS 1 и 2 до брокера. При подаче и удерживании единицы на входе Send, на выходе qosDelivered будет единица, если сообщение доставлено на брокер. Единица будет держаться на данном выходе пока на входе Send не пропадет единица.
Если это можно будет применять, то я обновлю в первом посте, а пока пусть будут тут.
Вложения
MQTT_ESP_Main_6_3_(CODE).ubi
(474.28 КБ) 277 скачиваний
MQTT_ESP_Pub_6_2_(CODE).ubi
(45.44 КБ) 262 скачивания

Ответить

Вернуться в «Коммуникация и связь»