Подключение ESP32 через MQTT
Для проекта, над которым я работаю, мне нужно подключить плату ESP32 к другому серверу по протоколу MQTT. Я использую брокер Mosquitto MQTT, и в настоящее время он находится на моем ноутбуке. Ниже приведен тестовый код, который я использую, и который я построю вокруг этой программы.
#include <WiFi.h>
#include <PubSubClient.h>
const char* ssid = "*****"; //WiFi Name
const char* password = "********"; //WiFi Password
const char* server= "***.***.**.***"; //RPi or Machine IP on which the broker is
WiFiClient espClient;
PubSubClient client(espClient);
int setup_WiFi(){
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
Serial.print("Attempting MQTT connection...");
client.connect("esp32");
if (client.connect("esp32")){
Serial.println("connected");
}
else {
Serial.print("failed, rc=");
Serial.println(client.state());
}
return 0;
}
int reconnect() {
unsigned long startAttemptTime = millis();
while (!client.connected())
{
Serial.println("Attempting MQTT connection...");
// Attempt to connect
if (client.connect("esp32")){ //if (client.connect("esp32", MQTT_USER, MQTT_PASS)) {
Serial.println("connected");
}
else {
Serial.print("failed, rc=");
Serial.println(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
return 0;
}
int send_mqtt(){
setup_WiFi();
char sss[15]="Hello World";
if (!client.connected()){
reconnect();
}
client.publish("esp32/test", sss); //send message
WiFi.disconnect(true);
Serial.println("Sent");
return 0;
}
void setup() {
Serial.begin(115200);
client.setServer(server, 1883); //mqtt server details
setup_WiFi();
reconnect();
send_mqtt();
}
void loop() {
send_mqtt();
delay(10000); //Wait 10 secs before next transmission
}
Я попытался подключиться, но получил эту ошибку
Попытка подключения MQTT...не удалось, rc= -2
Что я делаю не так? Какие-либо изменения мне нужно внести в файл .conf, о которых я не знаю? Веди меня. Заранее спасибо
@P_K, 👍3
Обсуждение1 ответ
Лучший ответ:
Код в вашем скетче вряд ли будет проблемой. Он отлично работает для меня после того, как я ввожу IP-адреса и пароль для своей сети.
Согласно документации APIPubSubClient , код rc = -2
, возвращенный client.state ()
, вызван сбоем сетевого подключения. Поскольку ваш код уже проверил, что он подключен к Wi-Fi, прежде чем пытаться связаться с брокером MQTT, проблема, вероятно, заключается в связи между двумя устройствами, а не в самом Wi-Fi-соединении. Вещи для проверки:
- Находятся ли оба устройства в одной сети, и есть ли у них маршрут для связи друг с другом? С ноутбука, работающего с брокером MQTT, попробуйте запустить
ping XXX.XXX.XXX.XXX
(заменив XXXS IP-адресом, сообщенным ESP32) и проверьте, что вы получаете ответ. Вы можете закомментировать строку 67 вашего кода, чтобы он не отключался от Wi-Fi после каждой попытки отправки сообщения, иначе вы увидите много потерянных пакетов. - У вас есть правильный IP-адрес для брокера MQTT в вашем скетче? Это должен быть IP-адрес вашего ноутбука, а не адрес замыкания на себя,
127.0.0.1
. - Можно ли использовать другое устройство в той же сети для подключения к серверу MQTT? (например, мобильный телефон с приложением MQTT dashboard)
- Настроена ли Mosquitto для прослушивания удаленных подключений? Если вы используете v2 Mosquitto, вы должны сознательно настроить его на прием входящих соединений, иначе он будет слушать только интерфейс
localhost
. Вам также придется либо настроить механизм аутентификации, либо явно настроить его, чтобы разрешить анонимные соединения. Это может быть причиной того, что вы можете подключиться с ноутбука, на котором работает брокер, но не с других устройств. - На сервере MQTT вы видите какие-либо попытки подключения в файле журнала Mosquitto (
/var/log/mosquitto/mosquitto.log
)? Могут быть некоторые сообщения об ошибках, которые дадут вам дополнительные подсказки.
Я перепробовал все, что вы предложили. За исключением "Пинга", все меры оказались неудачными. Я смог пингнуть. Извините за поздний ответ., @P_K
Поэтому, если вы можете пропинговать ESP32, и он использует правильный адрес для брокера MQTT, следующее, что нужно проверить, - это сам брокер. Не могли бы вы обновить свой вопрос, включив версию Mosquitto, которую вы запускаете, и копию его файла "mosquitto.conf"? Что происходит, когда вы пытаетесь подключиться к нему с другого устройства по тому же Wi-Fi?, @JRI
При подключении другого устройства выдается сообщение об ошибке "сбой подключения"., @P_K
Так что, похоже, брокер MQTT не работает. Возможно, он не настроен на разрешение удаленных подключений. Можете ли вы отредактировать свой вопрос, указав номер версии Mosquitto и конфигурационный файл? Это помогло бы решить проблему., @JRI
Версия 2.0.11, и ссылка на файл conf находится [здесь](https://drive.google.com/file/d/1ETP8TwdUzf_gd3TmuVAAyeJTC31lPxrF/view?usp=sharing), @P_K
В этом файле conf все настройки закомментированы, поэтому Mosquitto использует значения по умолчанию. Это означает, что вы можете войти в систему без какой-либо аутентификации, но только с компьютера, на котором работает Mosquitto. Он не слушает ваш Wi-Fi. Вам необходимо отредактировать файл conf, чтобы разрешить подключения с других устройств, а также настроить аутентификацию или явно разрешить анонимные подключения. Прочитайте ссылку в пункте 4 моего ответа, чтобы узнать, как это сделать., @JRI
Большое вам спасибо за вашу помощь, @P_K
- Несколько тем MQTT
- esp32-cam публикует изображение в mqtt
- Чтение данных из Google Таблиц с помощью Nodemcu
- Публиковать данные json в mqtt
- Не удалось подключиться к брокеру MQTT через esp8266/32 и pub/sub client
- esp32 http client response только 200 не получил данные после этого
- PubSubClient: Подписка работает, но обратный вызов никогда не вызывался
- Невозможно подключить ESP32 к Mosquitto на Raspberry с использованием сертификатов
Здесь, const char* сервер= "***.***.**.***"; , Я ввожу IPv4-адрес машины, на которой установлен Mosquitto., @P_K
Может ли ваш ноутбук пинговать ESP32?, @Majenko
Можете ли вы подключиться к клиенту MQTT, работающему на самом брокере? Говорят ли что-нибудь файлы журналов брокера MQTT? Успешно ли подключаются другие клиенты MQTT?, @StarCat
@starcat Я могу подключиться к "локальному хосту". Я использую проводник MQTT для просмотра подключений. На самом деле я не знаю, подключаются ли другие устройства, потому что я этого не пробовал, и у меня нет ресурсов. И я пытаюсь понять, к какому IP-адресу мне следует подключиться., @P_K
@Majenko Из той же сети, да, я могу пинговать. Из другой сети (другой Wi-Fi), нет, @P_K
Из той же сети может ли ESP32 подключиться к ноутбуку?, @Majenko
@Majenko Я на самом деле не знаю, как это проверить ... не могли бы вы провести меня сюда? ESP32 может подключаться к Wi-Fi и тоже получать IP-адрес., @P_K