Подключение 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, о которых я не знаю? Веди меня. Заранее спасибо

, 👍3

Обсуждение

Здесь, 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


1 ответ


Лучший ответ:

1

Код в вашем скетче вряд ли будет проблемой. Он отлично работает для меня после того, как я ввожу IP-адреса и пароль для своей сети.

Согласно документации APIPubSubClient , код rc = -2, возвращенный client.state (), вызван сбоем сетевого подключения. Поскольку ваш код уже проверил, что он подключен к Wi-Fi, прежде чем пытаться связаться с брокером MQTT, проблема, вероятно, заключается в связи между двумя устройствами, а не в самом Wi-Fi-соединении. Вещи для проверки:

  1. Находятся ли оба устройства в одной сети, и есть ли у них маршрут для связи друг с другом? С ноутбука, работающего с брокером MQTT, попробуйте запустить ping XXX.XXX.XXX.XXX (заменив XXXS IP-адресом, сообщенным ESP32) и проверьте, что вы получаете ответ. Вы можете закомментировать строку 67 вашего кода, чтобы он не отключался от Wi-Fi после каждой попытки отправки сообщения, иначе вы увидите много потерянных пакетов.
  2. У вас есть правильный IP-адрес для брокера MQTT в вашем скетче? Это должен быть IP-адрес вашего ноутбука, а не адрес замыкания на себя, 127.0.0.1.
  3. Можно ли использовать другое устройство в той же сети для подключения к серверу MQTT? (например, мобильный телефон с приложением MQTT dashboard)
  4. Настроена ли Mosquitto для прослушивания удаленных подключений? Если вы используете v2 Mosquitto, вы должны сознательно настроить его на прием входящих соединений, иначе он будет слушать только интерфейс localhost. Вам также придется либо настроить механизм аутентификации, либо явно настроить его, чтобы разрешить анонимные соединения. Это может быть причиной того, что вы можете подключиться с ноутбука, на котором работает брокер, но не с других устройств.
  5. На сервере 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