Подключение 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