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

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

MQTT для ESP, ESP8266, ESP32s.

#2

Сообщение pipapsix » 11.09.2018{, 10:24}

Привет.
Сел опять за работу, и опять ошибка, уже была такая.
СпойлерПоказать
pr4:6: error: 'WiFiClient' does not name a type

pr4:7: error: 'espClient' was not declared in this scope

exit status 1
'WiFiClient' does not name a type

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

MQTT для ESP, ESP8266, ESP32s.

#3

Сообщение User8 » 11.09.2018{, 16:03}

pipapsix, wifi не нужно забывать включать в настройках контроллера.

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

MQTT для ESP, ESP8266, ESP32s.

#4

Сообщение pipapsix » 11.09.2018{, 16:30}

User8 писал(а):
11.09.2018{, 16:03}
pipapsix, wifi не нужно забывать включать в настройках контроллера.
пардон.туплю.
создал новый проект , а думал в старом сижу.

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

MQTT для ESP, ESP8266, ESP32s.

#5

Сообщение User8 » 22.09.2018{, 04:49}

Блоки переделаны, теперь используется немного другая библиотека. Появилась возможность устанавливать QoS, а еще отсылать и принимать более длинные сообщения. Нужно тестить

jenyaprihodko
Рядовой
Сообщения: 4
Зарегистрирован: 04.10.2018{, 10:55}
Репутация: 0
Имя: Евгений

MQTT для ESP, ESP8266, ESP32.

#6

Сообщение jenyaprihodko » 04.10.2018{, 21:39}

Хочу спросить - насколько реализуемо переделать этот блок под работу не с ESP, а через Arduino и подключенный к нему Ethernet Shield на чипе W5100? Я пробовал в блоке менять: WiFiClient на Ethernet, но IDE ругается на целую кучу всего. Библиотеку Ethernet.h подключал дополнительно. Подскажите куда бы мне рыть, как правильно подойти к решению вопроса. Спасибо!

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

MQTT для Arduino, ESP8266, ESP32

#7

Сообщение User8 » 04.10.2018{, 22:46}

Последний раз редактировалось User8 03.01.2019{, 04:13}, всего редактировалось 2 раза.

jenyaprihodko
Рядовой
Сообщения: 4
Зарегистрирован: 04.10.2018{, 10:55}
Репутация: 0
Имя: Евгений

MQTT для ESP, ESP8266, ESP32.

#8

Сообщение jenyaprihodko » 05.10.2018{, 09:45}

User8 писал(а):
04.10.2018{, 22:46}
jenyaprihodko, кроме замены клиента, там нужно еще mac адрес прописать, и запустить сам шилд. Пробуйте этот блок:
Огромное спасибо, сегодня буду пробовать)

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

MQTT для ESP, ESP8266, ESP32.

#9

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

Нет топика и сообщения не приходят. С версией 3.4 все работает.
СпойлерПоказать
pu.jpg
СпойлерПоказать
Проба MQTT4 2.flp
(634.65 КБ) 307 скачиваний

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

MQTT для ESP, ESP8266, ESP32.

#10

Сообщение User8 » 05.10.2018{, 21:28}

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

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

MQTT для ESP, ESP8266, ESP32.

#11

Сообщение SerOv » 05.10.2018{, 21:53}

Сначала поставил логин, пароль и имя устройства. Все сработало. Не пароль не имя не спрашивал.
потом убрал логин и пароль. Тоже все заработало. Мне не понятен смысл этих трех величин. а имя устройства где отображается?

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

MQTT для ESP, ESP8266, ESP32.

#12

Сообщение User8 » 05.10.2018{, 22:21}

SerOv писал(а):
05.10.2018{, 21:53}
а имя устройства где отображается?
Это имя видит MQTT брокер, он использует его для идентификации клиента, чтобы знать кому что отправлять.

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

MQTT для ESP, ESP8266, ESP32.

#13

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

А логин и пароль

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

MQTT для ESP, ESP8266, ESP32.

#14

Сообщение User8 » 05.10.2018{, 22:26}

SerOv писал(а):
05.10.2018{, 22:23}
А логин и пароль
Логин и пароль можно использовать для всех клиентов одинаковый, поэтому и нужно имя устройства для идентификации.

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

MQTT для ESP, ESP8266, ESP32.

#15

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

Хорошо бы это, в описание добавить :smile9:

jenyaprihodko
Рядовой
Сообщения: 4
Зарегистрирован: 04.10.2018{, 10:55}
Репутация: 0
Имя: Евгений

MQTT для ESP, ESP8266, ESP32.

#16

Сообщение jenyaprihodko » 07.10.2018{, 17:47}

User8, попробовал, но все равно выдаёт сообщение с ошибкой.
СпойлерПоказать
Arduino: 1.8.1 (Windows 10), Плата:"Arduino/Genuino Uno"

pr1:10: error: no matching function for call to 'PubSubClient::PubSubClient(EthernetClient&, const char [13], int)'

PubSubClient client(mqttClient, "192.168.0.52", 1883);

^

C:\Users\User\AppData\Local\Temp\flprog\pr1\pr1.ino:10:53: note: candidates are:

In file included from C:\Users\User\AppData\Local\Temp\flprog\pr1\pr1.ino:3:0:

c:\Program Files (x86)\FLProg\ideV2\libraries\pubsubclient\src/PubSubClient.h:116:4: note: PubSubClient::PubSubClient(const char*, uint16_t, void (*)(char*, uint8_t*, unsigned int), Client&, Stream&)

PubSubClient(const char*, uint16_t, MQTT_CALLBACK_SIGNATURE,Client& client, Stream&);

^

c:\Program Files (x86)\FLProg\ideV2\libraries\pubsubclient\src/PubSubClient.h:116:4: note: candidate expects 5 arguments, 3 provided

c:\Program Files (x86)\FLProg\ideV2\libraries\pubsubclient\src/PubSubClient.h:115:4: note: PubSubClient::PubSubClient(const char*, uint16_t, void (*)(char*, uint8_t*, unsigned int), Client&)

PubSubClient(const char*, uint16_t, MQTT_CALLBACK_SIGNATURE,Client& client);

^

c:\Program Files (x86)\FLProg\ideV2\libraries\pubsubclient\src/PubSubClient.h:115:4: note: candidate expects 4 arguments, 3 provided

c:\Program Files (x86)\FLProg\ideV2\libraries\pubsubclient\src/PubSubClient.h:114:4: note: PubSubClient::PubSubClient(const char*, uint16_t, Client&, Stream&)

PubSubClient(const char*, uint16_t, Client& client, Stream&);

^

c:\Program Files (x86)\FLProg\ideV2\libraries\pubsubclient\src/PubSubClient.h:114:4: note: candidate expects 4 arguments, 3 provided

c:\Program Files (x86)\FLProg\ideV2\libraries\pubsubclient\src/PubSubClient.h:113:4: note: PubSubClient::PubSubClient(const char*, uint16_t, Client&)

PubSubClient(const char*, uint16_t, Client& client);

^

c:\Program Files (x86)\FLProg\ideV2\libraries\pubsubclient\src/PubSubClient.h:113:4: note: no known conversion for argument 1 from 'EthernetClient' to 'const char*'

c:\Program Files (x86)\FLProg\ideV2\libraries\pubsubclient\src/PubSubClient.h:112:4: note: PubSubClient::PubSubClient(uint8_t*, uint16_t, void (*)(char*, uint8_t*, unsigned int), Client&, Stream&)

PubSubClient(uint8_t *, uint16_t, MQTT_CALLBACK_SIGNATURE,Client& client, Stream&);

^

c:\Program Files (x86)\FLProg\ideV2\libraries\pubsubclient\src/PubSubClient.h:112:4: note: candidate expects 5 arguments, 3 provided

c:\Program Files (x86)\FLProg\ideV2\libraries\pubsubclient\src/PubSubClient.h:111:4: note: PubSubClient::PubSubClient(uint8_t*, uint16_t, void (*)(char*, uint8_t*, unsigned int), Client&)

PubSubClient(uint8_t *, uint16_t, MQTT_CALLBACK_SIGNATURE,Client& client);

^

c:\Program Files (x86)\FLProg\ideV2\libraries\pubsubclient\src/PubSubClient.h:111:4: note: candidate expects 4 arguments, 3 provided

c:\Program Files (x86)\FLProg\ideV2\libraries\pubsubclient\src/PubSubClient.h:110:4: note: PubSubClient::PubSubClient(uint8_t*, uint16_t, Client&, Stream&)

PubSubClient(uint8_t *, uint16_t, Client& client, Stream&);

^

c:\Program Files (x86)\FLProg\ideV2\libraries\pubsubclient\src/PubSubClient.h:110:4: note: candidate expects 4 arguments, 3 provided

c:\Program Files (x86)\FLProg\ideV2\libraries\pubsubclient\src/PubSubClient.h:109:4: note: PubSubClient::PubSubClient(uint8_t*, uint16_t, Client&)

PubSubClient(uint8_t *, uint16_t, Client& client);

^

c:\Program Files (x86)\FLProg\ideV2\libraries\pubsubclient\src/PubSubClient.h:109:4: note: no known conversion for argument 1 from 'EthernetClient' to 'uint8_t* {aka unsigned char*}'

c:\Program Files (x86)\FLProg\ideV2\libraries\pubsubclient\src/PubSubClient.h:108:4: note: PubSubClient::PubSubClient(IPAddress, uint16_t, void (*)(char*, uint8_t*, unsigned int), Client&, Stream&)

PubSubClient(IPAddress, uint16_t, MQTT_CALLBACK_SIGNATURE,Client& client, Stream&);

^

c:\Program Files (x86)\FLProg\ideV2\libraries\pubsubclient\src/PubSubClient.h:108:4: note: candidate expects 5 arguments, 3 provided

c:\Program Files (x86)\FLProg\ideV2\libraries\pubsubclient\src/PubSubClient.h:107:4: note: PubSubClient::PubSubClient(IPAddress, uint16_t, void (*)(char*, uint8_t*, unsigned int), Client&)

PubSubClient(IPAddress, uint16_t, MQTT_CALLBACK_SIGNATURE,Client& client);

^

c:\Program Files (x86)\FLProg\ideV2\libraries\pubsubclient\src/PubSubClient.h:107:4: note: candidate expects 4 arguments, 3 provided

c:\Program Files (x86)\FLProg\ideV2\libraries\pubsubclient\src/PubSubClient.h:106:4: note: PubSubClient::PubSubClient(IPAddress, uint16_t, Client&, Stream&)

PubSubClient(IPAddress, uint16_t, Client& client, Stream&);

^

c:\Program Files (x86)\FLProg\ideV2\libraries\pubsubclient\src/PubSubClient.h:106:4: note: candidate expects 4 arguments, 3 provided

c:\Program Files (x86)\FLProg\ideV2\libraries\pubsubclient\src/PubSubClient.h:105:4: note: PubSubClient::PubSubClient(IPAddress, uint16_t, Client&)

PubSubClient(IPAddress, uint16_t, Client& client);

^

c:\Program Files (x86)\FLProg\ideV2\libraries\pubsubclient\src/PubSubClient.h:105:4: note: no known conversion for argument 1 from 'EthernetClient' to 'IPAddress'

c:\Program Files (x86)\FLProg\ideV2\libraries\pubsubclient\src/PubSubClient.h:104:4: note: PubSubClient::PubSubClient(Client&)

PubSubClient(Client& client);

^

c:\Program Files (x86)\FLProg\ideV2\libraries\pubsubclient\src/PubSubClient.h:104:4: note: candidate expects 1 argument, 3 provided

c:\Program Files (x86)\FLProg\ideV2\libraries\pubsubclient\src/PubSubClient.h:103:4: note: PubSubClient::PubSubClient()

PubSubClient();

^

c:\Program Files (x86)\FLProg\ideV2\libraries\pubsubclient\src/PubSubClient.h:103:4: note: candidate expects 0 arguments, 3 provided

c:\Program Files (x86)\FLProg\ideV2\libraries\pubsubclient\src/PubSubClient.h:83:7: note: constexpr PubSubClient::PubSubClient(const PubSubClient&)

class PubSubClient {

^

c:\Program Files (x86)\FLProg\ideV2\libraries\pubsubclient\src/PubSubClient.h:83:7: note: candidate expects 1 argument, 3 provided

c:\Program Files (x86)\FLProg\ideV2\libraries\pubsubclient\src/PubSubClient.h:83:7: note: constexpr PubSubClient::PubSubClient(PubSubClient&&)

c:\Program Files (x86)\FLProg\ideV2\libraries\pubsubclient\src/PubSubClient.h:83:7: note: candidate expects 1 argument, 3 provided

pr1:57: error: 'MQTT' does not name a type

void callback(const MQTT::Publish& pub)

^

pr1:57: error: expected unqualified-id before '&' token

void callback(const MQTT::Publish& pub)

^

pr1:57: error: expected ')' before '&' token

pr1:57: error: expected initializer before 'pub'

void callback(const MQTT::Publish& pub)

^

pr1:57: error: 'MQTT' does not name a type

void callback(const MQTT::Publish& pub)

^

pr1:57: error: expected unqualified-id before '&' token

void callback(const MQTT::Publish& pub)

^

pr1:57: error: expected ')' before '&' token

pr1:57: error: expected initializer before 'pub'

void callback(const MQTT::Publish& pub)

^

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

pr1:67: error: 'MQTT' has not been declared

if (client.connect(MQTT::Connect("Arduino UNO Black")

^

pr1:72: error: 'class PubSubClient' has no member named 'set_callback'

client.set_callback(callback);

^

pr1:72: error: 'callback' was not declared in this scope

client.set_callback(callback);

^

pr1:73: error: 'MQTT' has not been declared

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

^

exit status 1
no matching function for call to 'PubSubClient::PubSubClient(EthernetClient&, const char [13], int)'

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

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

MQTT для ESP, ESP8266, ESP32.

#17

Сообщение User8 » 08.10.2018{, 22:44}

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

jenyaprihodko
Рядовой
Сообщения: 4
Зарегистрирован: 04.10.2018{, 10:55}
Репутация: 0
Имя: Евгений

MQTT для ESP, ESP8266, ESP32.

#18

Сообщение jenyaprihodko » 10.10.2018{, 00:05}

User8, сработало, спасибо Вам большое!

flDave
Рядовой
Сообщения: 1
Зарегистрирован: 15.11.2018{, 18:15}
Репутация: 0
Имя: David

MQTT для Arduino, ESP8266, ESP32.

#19

Сообщение flDave » 15.11.2018{, 22:14}

User8, доброго времени суток! Пробую через эти блоки общаться с Domoticz, и обнаружил такой баг.
Когда вводишь сообщение в фигурных скобках и кавычками в формате domoticz {"idx":719,"nvalue":0}, при компиляции выскакивает следующая ошибка: "expected primary-expression before '(' token"
СпойлерПоказать
Снимок.JPG
Возможно устранить эту ошибку?
Заранее спасибо!

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

MQTT для Arduino, ESP8266, ESP32.

#20

Сообщение User8 » 15.11.2018{, 23:53}

flDave привет, двойные кавычки нужно экранировать обратным слешем: {\"idx\":719,\"nvalue\":0}

Ответить

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