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 КБ) 2752 скачивания
MQTT_ESP_Sub_6_8_(CODE).ubi
(38.95 КБ) 2572 скачивания
MQTT_ESP_Pub_6_8_(CODE).ubi
(44.63 КБ) 2666 скачиваний
Последний раз редактировалось User8 28.01.2023{, 01:57}, всего редактировалось 175 раз.

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

MQTT для Arduino, ESP8266, ESP32

#41

Сообщение User8 » 09.12.2018{, 18:01}

pipapsix, ivanpost, добавил вход mqttReconnect, чтобы после установки новых данных можно было подать на него единицу, после чего esp переподключится к брокеру уже с новыми данными. Нужно проверить работает или нет...
Вложения
MQTT_ESP_Main_4_0_External_Input_(CODE).ubi
(257.74 КБ) 91 скачивание
Последний раз редактировалось User8 23.12.2018{, 16:17}, всего редактировалось 4 раза.

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

MQTT для Arduino, ESP8266, ESP32.

#42

Сообщение pipapsix » 09.12.2018{, 20:17}

User8 писал(а):
09.12.2018{, 18:01}
Нужно проверить работает или нет...
чет не соображу как через веб этим управлять, если чек боксом, то он и останется все время включеным вроде, или я не прав?
или убрать сохранение в память?

Отправлено спустя 17 минут 11 секунд:
Работает.

Аватара пользователя
Stepa
Рядовой
Сообщения: 64
Зарегистрирован: 01.05.2018{, 00:45}
Репутация: 1
Откуда: Ковылкино, Мордовия
Имя: Степан

MQTT для Arduino, ESP8266, ESP32.

#43

Сообщение Stepa » 09.12.2018{, 23:48}

User8 писал(а):
09.12.2018{, 18:01}
чтобы после установки новых данных
Я чет не понял, каких данных?

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

MQTT для Arduino, ESP8266, ESP32.

#44

Сообщение User8 » 10.12.2018{, 00:59}

pipapsix, я веб интерфейсом не пользовался, но думаю можно придумать как этого добиться.

Stepa, чтобы каждый раз не прошивать для изменения данных, например сервер брокера поменялся, можно задать новый с помощью веб интерфейса, который можно настроить в flprog.

Отправлено спустя 6 минут 8 секунд:
Я тут подумал, новые данные можно задавать с помощью того же mqtt, чтобы на всех esp сразу менялись. Например при изменении адреса сервера брокера не лазить на каждую esp и менять руками, а отправить имя сервера в топик и esp уже сами установят новый адрес сервера. Только не нужно забывать что main блок должен первее выполняться, поэтому sub блок выше блока main размещать нельзя, поэтому нужно sub блок размещать ниже и уже через переменные выше устанавливать.

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

MQTT для Arduino, ESP8266, ESP32.

#45

Сообщение pipapsix » 10.12.2018{, 07:15}

Я изменил данные через веб, нажал сохранить, и все само подключилось, без последней фичи. Она как бы не нужна получается.
ЕСП я не перегружал.

Отправлено спустя 1 минуту :
User8 писал(а):
10.12.2018{, 01:05}
новые данные можно задавать с помощью того же mqtt
Все нужное в этом блоке уже есть) новичек может не разобраться, как я когдато.

Отправлено спустя 3 минуты 27 секунд:
Stepa писал(а):
09.12.2018{, 23:48}
Я чет не понял, каких данных?
Адрес сервера, логин, пароль.

Аватара пользователя
dekorator
Лейтенант
Сообщения: 427
Зарегистрирован: 06.09.2015{, 09:39}
Репутация: 7
Откуда: Баку

MQTT для Arduino, ESP8266, ESP32.

#46

Сообщение dekorator » 10.12.2018{, 07:44}

User8 писал(а):
10.12.2018{, 01:05}
Например при изменении адреса сервера брокера не лазить на каждую esp и менять руками, а отправить имя сервера в топик
Это в какой топик отправить? Адрес же изменился :shok:

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

MQTT для Arduino, ESP8266, ESP32.

#47

Сообщение pipapsix » 10.12.2018{, 07:45}

dekorator писал(а):
10.12.2018{, 07:44}
Это в какой топик отправить? Адрес же изменился
Я тоже об этом подумал, но можно же и заранее поменять.Если знаешь, что поменяется,.

Аватара пользователя
dekorator
Лейтенант
Сообщения: 427
Зарегистрирован: 06.09.2015{, 09:39}
Репутация: 7
Откуда: Баку

MQTT для Arduino, ESP8266, ESP32.

#48

Сообщение dekorator » 10.12.2018{, 07:56}

Так писать же правильно не запрещено! Тут же новичков полно.
Вопрос к автору, можно сделать выход типа -"доступность сервера "? чтобы не городить доп. обвязку к блоку. Тогда можно организовать например автоматический переход на альтернативный (запасной) брокер или индикацию какую к этому выходу подцепить.

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

MQTT для Arduino, ESP8266, ESP32.

#49

Сообщение User8 » 10.12.2018{, 08:13}

dekorator писал(а):
10.12.2018{, 07:44}
Это в какой топик отправить? Адрес же изменился
Адрес изменится после отключения от брокера, поэтому можно задать новый сервер, но если не правильно укажешь, то esp уже не подключится и нужно будет прошивать с актуальными данными.
dekorator писал(а):
10.12.2018{, 07:56}
можно сделать выход типа -"доступность сервера "? чтобы не городить доп. обвязку к блоку.
Так есть же выход mqttConnected, когда на нем 0, значит сервер недоступен, я надеюсь инверсией пользоваться умеете.

Аватара пользователя
dekorator
Лейтенант
Сообщения: 427
Зарегистрирован: 06.09.2015{, 09:39}
Репутация: 7
Откуда: Баку

MQTT для Arduino, ESP8266, ESP32.

#50

Сообщение dekorator » 10.12.2018{, 08:24}

User8 писал(а):
10.12.2018{, 08:13}
Так есть же выход mqttConnected
Есть правда. Там появляется - 0 если сервер вдруг резко "пропал"?

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

MQTT для Arduino, ESP8266, ESP32.

#51

Сообщение User8 » 10.12.2018{, 08:26}

dekorator, сразу или через 15 секунд, можно в настройках keepalive указать меньше, но не рекомендую ставить меньше 5 секунд.

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

MQTT для Arduino, ESP8266, ESP32

#52

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

При компиляции блока со входами, созданного в версии 4.2.0, возникает ошибка:
СпойлерПоказать
Arduino: 1.8.1 (Windows 10), Плата:"NodeMCU 1.0 (ESP-12E Module), 80 MHz, 115200, 4M (3M SPIFFS)"

pr2:151: error: 'MQTT' does not name a type

void callback(const MQTT::Publish& pub)

^

pr2:151: error: expected unqualified-id before '&' token

void callback(const MQTT::Publish& pub)

^

pr2:151: error: expected ')' before '&' token

pr2:151: error: expected initializer before 'pub'

void callback(const MQTT::Publish& pub)

^

C:\Users\admin\AppData\Local\Temp\flprog\pr2\pr2.ino: In function 'void loop()':

pr2:98: error: 'class PubSubClient' has no member named 'set_server'

client.set_server(mqttServer, mqttPort);

^

pr2:112: error: 'MQTT' has not been declared

client.subscribe(MQTT::Subscribe()

^

pr2:135: error: 'MQTT' has not been declared

client.publish(MQTT::Publish(Topic_143862172_1, Message_143862172_1)

^

C:\Users\admin\AppData\Local\Temp\flprog\pr2\pr2.ino: At global scope:

pr2:151: error: 'MQTT' does not name a type

void callback(const MQTT::Publish& pub)

^

pr2:151: error: expected unqualified-id before '&' token

void callback(const MQTT::Publish& pub)

^

pr2:151: error: expected ')' before '&' token

pr2:151: error: expected initializer before 'pub'

void callback(const MQTT::Publish& pub)

^

C:\Users\admin\AppData\Local\Temp\flprog\pr2\pr2.ino: In function 'boolean reconnect()':

pr2:161: error: 'MQTT' has not been declared

if (client.connect(MQTT::Connect(mqttClientId)

^

pr2:166: error: 'class PubSubClient' has no member named 'set_callback'

client.set_callback(callback);

^

pr2:166: error: 'callback' was not declared in this scope

client.set_callback(callback);

^

pr2:167: error: 'MQTT' has not been declared

client.publish(MQTT::Publish("client1/status", "1")

^

exit status 1
'MQTT' does not name a type

Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"
Компиляция версией 4.0.0 заканчивается успешно.

Кроме того, блок без входов, ранее успешно проверенный, при компиляции версией 4.2.0 выдает ошибку, удаление двойной библиотеки не помогает.
Вопрос: как бороться?

Аватара пользователя
Golan
Капитан
Сообщения: 827
Зарегистрирован: 26.11.2017{, 23:18}
Репутация: 77
Откуда: Деревня, 98 домов в Мордовии
Имя: Владимир
Контактная информация:

MQTT для Arduino, ESP8266, ESP32

#53

Сообщение Golan » 14.12.2018{, 19:44}

4.2.0 глючный получился.
Добро не ценится в современном мире, люди от него наглеют!

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

MQTT для Arduino, ESP8266, ESP32

#54

Сообщение User8 » 14.12.2018{, 19:48}

Авиакот, он не видит библиотеку улучшенную и пытается скомпилировать со стандартной библиотекой pubsubclient, значит где-то она есть, ищите.

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

MQTT для Arduino, ESP8266, ESP32

#55

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

User8 писал(а):
14.12.2018{, 19:48}
Авиакот, он не видит библиотеку улучшенную и пытается скомпилировать со стандартной библиотекой pubsubclient, значит где-то она есть, ищите.
Улучшенная тоже pubsubclient называется? Удалил все, теперь ругается на отсутствие библиотеки
СпойлерПоказать
Arduino: 1.8.1 (Windows 10), Плата:"NodeMCU 1.0 (ESP-12E Module), 80 MHz, 115200, 4M (3M SPIFFS)"

C:\Users\admin\AppData\Local\Temp\flprog\pr3\pr3.ino:2:26: fatal error: PubSubClient.h: No such file or directory

#include <PubSubClient.h>

^

compilation terminated.

exit status 1
Ошибка компиляции для платы NodeMCU 1.0 (ESP-12E Module).

Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"

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

MQTT для Arduino, ESP8266, ESP32

#56

Сообщение User8 » 14.12.2018{, 20:18}

Авиакот, папка называлась pubsubclient-Imroy, скачайте из первого поста и положите в папку с библиотеками.

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

MQTT для Arduino, ESP8266, ESP32

#57

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

User8 писал(а):
14.12.2018{, 20:18}
Авиакот, папка называлась pubsubclient-Imroy, скачайте из первого поста и положите в папку с библиотеками.
Установил, ошибка та же. Что в этой строке кода не правильно: void callback(const MQTT::Publish& pub) ? Ругается на нее. Версия 4.0.0 компилирует точно такой же код (строку).

Отправлено спустя 2 минуты 19 секунд:
Если дело в библиотеке, почему тогда 4.0.0 все нормально компилирует? Может кто подскажет, как код подправить?

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

MQTT для Arduino, ESP8266, ESP32

#58

Сообщение User8 » 14.12.2018{, 21:03}

Авиакот, в коде все в порядке, вы единственный у кого не работает, у меня на 4.2 компилируется.

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

MQTT для Arduino, ESP8266, ESP32

#59

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

Вас не смущает ошибка:

Код: Выделить всё

pr2:151: error: expected unqualified-id before '&' token
:senile:
Win10-64 FLProg v7.5.2 Portable :fie:

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

MQTT для Arduino, ESP8266, ESP32

#60

Сообщение User8 » 14.12.2018{, 21:33}

Dev1, он сыпет эти ошибки т.к. пытается скомпилировать со стандартной библиотекой, постоянно автоматом тянет ее из репозитория библиотек. С той библиотекой что в первом посте по ссылке на гитхаб, все компилируется.

Ответить

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