MQTT для Arduino, ESP8266, ESP32

Протокол MQTT для обмена сообщениями.

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

MQTT для Arduino, ESP8266, ESP32

#1

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

Для создания блоков была использована библиотека async-mqtt-client: https://github.com/marvinroger/async-mqtt-client

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

Описание блока Main:
Выход mqttConnected - на данном выходе будет единица, если esp подключена к брокеру.
- Настройки MQTT доступны внутри данного блока.
- LWT сообщение - сообщение, которое будет отправлено в указанный топик, после отключения клиента от брокера.
Пример: мы указали в настройках: willMessageOnline: 1; willMessageOffline: 0; willTopic: client1/status;
После старта esp и подключению к брокеру, в топик client1/status будет отправлено сообщение 1, а при отключении esp от брокера в топик client1/status будет отправлено сообщение 0. Параметром keepAlive можно отрегулировать, через сколько секунд брокер отправит сообщение willMessageOffline после отключения esp от брокера. Не рекомендуется ставить меньше 5 секунд.

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

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

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

MQTT блоки для Ethernet Arduino: viewtopic.php?p=61489#p61489
MQTT ESP Main блок с внешними входами: viewtopic.php?p=61490#p61490
Вложения
MQTT_ESP_Main_6_4_(CODE).ubi
(473.23 КБ) 57 скачиваний
MQTT_ESP_Sub_6_4_(CODE).ubi
(18.74 КБ) 54 скачивания
MQTT_ESP_Pub_6_4_(CODE).ubi
(45.45 КБ) 52 скачивания
Последний раз редактировалось User8 13.01.2019{, 07:30}, всего редактировалось 64 раза.

Аватара пользователя
Авиакот
Рядовой
Сообщения: 27
Зарегистрирован: 07.04.2016{, 23:13}
Репутация: 0

MQTT для Arduino, ESP8266, ESP32

#61

Сообщение Авиакот » 14.12.2018{, 21:42}

User8 писал(а):
14.12.2018{, 21:03}
Авиакот, в коде все в порядке, вы единственный у кого не работает, у меня на 4.2 компилируется.
Пробовал на разных компах, на одном ХР, на другом десятка, результат одинаковый: на 4.0 все хорошо, на 4.2 ошибка. Вот я и хочу понять, почему у меня одного так.

Аватара пользователя
Dev1
Капитан
Сообщения: 941
Зарегистрирован: 12.07.2016{, 18:04}
Репутация: 32
Откуда: Гондурас

MQTT для Arduino, ESP8266, ESP32

#62

Сообщение Dev1 » 14.12.2018{, 21:57}

User8 писал(а):
14.12.2018{, 21:33}
Dev1, он сыпет эти ошибки т.к. пытается скомпилировать со стандартной библиотекой, постоянно автоматом тянет ее из репозитория библиотек. С той библиотекой что в первом посте по ссылке на гитхаб, все компилируется.
Проблема этой программы в том что в комплекте идет старая версия IDE, с какими то доработками, костылями. Такого не должно быть, тем более каких то библиотек. Версия программы должна соответствовать какой то версии IDE, по хорошему под последнюю. И IDE и библиотеки должны ставится как положено и в соответствующие директории. А так постоянно будет бардак с версиями библиотек, которые и в программе и отдельно поставленные(в документы).
Win7-64 FLProg v4.2.4 Portable, external IDE 1.8.8 + Last Libs :fie:

lazd
Рядовой
Сообщения: 7
Зарегистрирован: 30.11.2018{, 15:03}
Репутация: 0
Имя: Вячеслав

MQTT для Arduino, ESP8266, ESP32

#63

Сообщение lazd » 15.12.2018{, 09:58}

Добрый день! Имею следующую проблему: При пропадании доступа к глобальной сети, программа зависает на main блоке MQTT. При возобновлении доступа продолжает работу. Это ни есть хорошо!!! Все процессы замирают... Как обойти это?

Аватара пользователя
User8
Сержант
Сообщения: 164
Зарегистрирован: 12.06.2017{, 14:44}
Репутация: 20
Имя: Евгений

MQTT для Arduino, ESP8266, ESP32

#64

Сообщение User8 » 15.12.2018{, 10:02}

lazd, увеличьте время попытки переподключения, по умолчанию стояло 60000мс.

lazd
Рядовой
Сообщения: 7
Зарегистрирован: 30.11.2018{, 15:03}
Репутация: 0
Имя: Вячеслав

MQTT для Arduino, ESP8266, ESP32

#65

Сообщение lazd » 15.12.2018{, 10:13}

Увы! Это не оказывает ни какого воздействия. Получается, что нет интернета - прога стоит, есть интернет - работает. По моему мнению ей должно быть все равно есть интернет или нет. Просто не будет доступен сервер MQTT. Получается же, что не работает ничего из других важных задач.

Аватара пользователя
User8
Сержант
Сообщения: 164
Зарегистрирован: 12.06.2017{, 14:44}
Репутация: 20
Имя: Евгений

MQTT для Arduino, ESP8266, ESP32

#66

Сообщение User8 » 15.12.2018{, 10:50}

lazd, щас проверил на esp, светодиодом мигает когда есть коннект и мигает если нет коннекта, цикл не останавливается. Во время попытки подключения только идет остановка цикла секунд на 5-8.

lazd
Рядовой
Сообщения: 7
Зарегистрирован: 30.11.2018{, 15:03}
Репутация: 0
Имя: Вячеслав

MQTT для Arduino, ESP8266, ESP32

#67

Сообщение lazd » 15.12.2018{, 12:00}

User8, спасибо! Можно попросить Ваш проект на проверку у себя?

Аватара пользователя
User8
Сержант
Сообщения: 164
Зарегистрирован: 12.06.2017{, 14:44}
Репутация: 20
Имя: Евгений

MQTT для Arduino, ESP8266, ESP32

#68

Сообщение User8 » 15.12.2018{, 12:12}

lazd, весь проект это включенный симетричный мультивибратор и его выход подключен на GPIO2. Можно на выход mqttConnected подключить 2 мультивибратора, когда нет коннекта быстрее мигает, а когда есть медленнее мигает и их выход на GPIO2(встроенный светодиод в esp).

Аватара пользователя
Авиакот
Рядовой
Сообщения: 27
Зарегистрирован: 07.04.2016{, 23:13}
Репутация: 0

MQTT для Arduino, ESP8266, ESP32

#69

Сообщение Авиакот » 15.12.2018{, 12:54}

Dev1 писал(а):
14.12.2018{, 21:57}
User8 писал(а):
14.12.2018{, 21:33}
Dev1, он сыпет эти ошибки т.к. пытается скомпилировать со стандартной библиотекой, постоянно автоматом тянет ее из репозитория библиотек. С той библиотекой что в первом посте по ссылке на гитхаб, все компилируется.
Проблема этой программы в том что в комплекте идет старая версия IDE, с какими то доработками, костылями. Такого не должно быть, тем более каких то библиотек. Версия программы должна соответствовать какой то версии IDE, по хорошему под последнюю. И IDE и библиотеки должны ставится как положено и в соответствующие директории. А так постоянно будет бардак с версиями библиотек, которые и в программе и отдельно поставленные(в документы).
Действительно, проблема была в библиотеках, зря я на версию 4.2 наговаривал...

lazd
Рядовой
Сообщения: 7
Зарегистрирован: 30.11.2018{, 15:03}
Репутация: 0
Имя: Вячеслав

MQTT для Arduino, ESP8266, ESP32

#70

Сообщение lazd » 15.12.2018{, 14:19}

Уважаемый User8, набросал проект, как Вы и указали. НЕ РАБОТАЕТ! Может быть я где-то допускаю ошибку? Слишком уж все элементарно...
Висяк и при отрубании WiFi, и при пропадании коннекта с MQTT сервером. Прилагаю свой проект, проверьте , пожалуйста! Wemos D1 mini
Вложения
flash.flp
(587.55 КБ) 6 скачиваний

Аватара пользователя
User8
Сержант
Сообщения: 164
Зарегистрирован: 12.06.2017{, 14:44}
Репутация: 20
Имя: Евгений

MQTT для Arduino, ESP8266, ESP32

#71

Сообщение User8 » 15.12.2018{, 15:58}

lazd, вот мигает светодиод, хотя даже сервер не указан и wifi не мой.
Вложения
flash2.flp
(601.13 КБ) 9 скачиваний

lazd
Рядовой
Сообщения: 7
Зарегистрирован: 30.11.2018{, 15:03}
Репутация: 0
Имя: Вячеслав

MQTT для Arduino, ESP8266, ESP32

#72

Сообщение lazd » 15.12.2018{, 17:08}

User8, Спасибо! Гляну. Не могли бы Вы расшифровать эту строку:
if ((WiFi.status() == WL_CONNECTED && now - lastReconnectAttempt > reconnectionTime) || (WiFi.status() == WL_CONNECTED && tryStartConnect)) {

Аватара пользователя
User8
Сержант
Сообщения: 164
Зарегистрирован: 12.06.2017{, 14:44}
Репутация: 20
Имя: Евгений

MQTT для Arduino, ESP8266, ESP32

#73

Сообщение User8 » 15.12.2018{, 17:16}

lazd, первое условие: если wifi подключен и количество миллисекунд прошло больше чем указано в настройках. Второе условие добавлено, чтобы делать попытку подключиться после старта esp, а не ждать 60сек для первой попытки.

Аватара пользователя
CraCk
Лейтенант
Сообщения: 514
Зарегистрирован: 10.09.2015{, 21:51}
Репутация: 6

MQTT для Arduino, ESP8266, ESP32

#74

Сообщение CraCk » 15.12.2018{, 23:58}

Для параноиков можно добавить TLS/SSL шифрование?
https://habr.com/company/intel/blog/283440/
Пример на библиотеке Adafruit library
https://medium.com/@flespi/how-to-conne ... 3b94f37d88
https://github.com/adafruit/Adafruit_MQ ... sp8266.ino
Еще немного инфы
https://internetofhomethings.com/homethings/?p=1820
https://www.hivemq.com/blog/mqtt-securi ... s-tls-ssl/

Аватара пользователя
User8
Сержант
Сообщения: 164
Зарегистрирован: 12.06.2017{, 14:44}
Репутация: 20
Имя: Евгений

MQTT для Arduino, ESP8266, ESP32

#75

Сообщение User8 » 16.12.2018{, 08:27}

CraCk, вот что нашел: "ESP8266 is very slow to handle TLS/AES. You should use ESP32 for SSL. That's why you cannot find it - it's not worth trying." И так не совсем гладко все работает, а если еще и шифрование добавить...

Аватара пользователя
CraCk
Лейтенант
Сообщения: 514
Зарегистрирован: 10.09.2015{, 21:51}
Репутация: 6

MQTT для Arduino, ESP8266, ESP32

#76

Сообщение CraCk » 16.12.2018{, 12:07}

User8 писал(а):
16.12.2018{, 08:27}
И так не совсем гладко все работает, а если еще и шифрование добавить..
Да согласен. Но если в будущем что то измениться в лучшую сторону по ESP8266 то не забудьте про SSL.

Аватара пользователя
Anydy
Администратор
Сообщения: 1723
Зарегистрирован: 30.12.2017{, 12:10}
Репутация: 105
Имя: Андрей

MQTT для Arduino, ESP8266, ESP32

#77

Сообщение Anydy » 16.12.2018{, 12:17}

А если использовать ESP32?

Аватара пользователя
User8
Сержант
Сообщения: 164
Зарегистрирован: 12.06.2017{, 14:44}
Репутация: 20
Имя: Евгений

MQTT для Arduino, ESP8266, ESP32

#78

Сообщение User8 » 16.12.2018{, 12:27}

Anydy, мне лень разбираться, кому очень нужно, разберется и добавит :D

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

MQTT для Arduino, ESP8266, ESP32

#79

Сообщение pipapsix » 16.12.2018{, 12:47}

вот похвалиться хочу.


Датчик на улице.
передает на есп и Экран некстион дома.
С него на народный мониторинг.
Получает погоду с интернета, но что то большая разница.
Все работает.. пока..
бЛАГОДАРЮ ЗА ПОЩЬ.
img_20181216_132729.xpNwK.jpg

Аватара пользователя
User8
Сержант
Сообщения: 164
Зарегистрирован: 12.06.2017{, 14:44}
Репутация: 20
Имя: Евгений

MQTT для Arduino, ESP8266, ESP32

#80

Сообщение User8 » 16.12.2018{, 12:52}

pipapsix, молодец, в экранах щас большого смысла нет, когда у каждого есть телефон, можно на него все выводить, вот например: http://iotmanager.ru/ru/

Ответить

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

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость