Problème de connection ESP32 serveur MQTT sur raspberry

Bonjour à tous,

Je sollicite votre aide car je patauge un peu, je vous explique :

  • J'ai un ESP32 sur lequel est broché 2 capteurs DS18B20 qui fonctionnent bien sur mon moniteur série.
    Cet ESP32 est relié à mon réseau local en WIFI sous l'IP : 192.168.1.33 , la connexion réussit également avec le retour d'info dans le moniteur série.

  • J'ai un RaspberryPI 3B+ qui lui est connecté en Ethernet à ma box sous l'IP : 192.168.1.31 , connexion fonctionnel, prise à distance par VNC ok.
    Il contient le serveur MQTT mosquitto et NODE-RED, ce dernier est accessible depuis n'importe quel pc de la maison par l'adresse : 192.168.1.31:1880/
    Le serveur MQTT fonctionne sur le raspberry via deux consoles :

Dans mon programme de l'ESP, j'ai intégré la bibliothèque PubSublClient.h et c'est la que ça se gatte.
J'ai renseigné dans la variable :
const char* mqtt_server = "192.168.1.31";
ainsi que :
client.setServer(mqtt_server, 1883);

Pas de soucis dans le téléversement mais lorsque je lance le moniteur série :

Attempting MQTT connection... failed, rc = try again in 5 seconds

Avez vous une idée de se qui coince ?

Merci par avance pour votre aide.

Ludo

C'est ton server MQTT qui écoute sur le port 1880?
Dans ce cas il faut utiliser le même port dans la fonction setserver

Salut,

C'est node-red qui est écouté sur le port 1880.
Normalement, le port 1883 est configuré par défaut à l'installation de mosquitto sur la raspberryPI, je vais quand même le rajouter sur le fichier mosquitto.conf

Comment puis-je tester sur un autre PC de mon réseau local sans passer par l'IDE arduino la bonne connexion à mon serveur MQTT ?

PS, je vais faire un schéma complet de mon projet pour plus de clarté.

Ok, je pensais que tu avais testé ton serveur MQTT.
Du coup tu n'a pas testé la publication ou l'abonnement sur ton serveur MQTT?
Sur ton PC, si tu as python, il doit être assez simple de faire un script qui se connecte et s'abonne à une file d'attente.
Il y a des client MQTT online, mais je ne les ais jamais testé.

via le PowerShell de windows ?

Voici une image de mon projet pour aider dans la compréhension :

Powershell est juste l'interpréteur, il te faudra comme pour Python un programme/librairie capable de gérer les connexions du protocole MQTT.

As tu essayé de trouver un client online ?
Il y a aussi des applications mobile qui existe.

As tu un firewall sur ton rasberry qui pourrait bloquer le port 1883?
As tu vérifier que le port 1883 est bien en "listen" sur ton rasberry?

J'ai trouvé un problème que tu as évoqué.

Lorsque je ping depuis mon PC " Windows " l'adresse de ma RaspberryPI :

telnet 192.168.1.31 1883 ====> Connection failed

J'ai forcé l'ouverture du port 1883 dans le fichier mosquitto.conf ave la ligne : listener 1883

Après redémarrage de mosquitto, le ping depuis mon PC fonctionne correctement par contre, dans le moniteur serie de l'IDE, j'ai toujours la fonction reconnect() de PubSubClient qui boucle sur le fait que je ne suis pas connecté.

void  loop {

if (!client.connected()) {
    reconnect();
  }
  client.loop();
}
void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Create a random client ID
    String clientId = "ESP32Client-";
    clientId += String(random(0xffff), HEX);
    // Attempt to connect
    if (client.connect(clientId.c_str())) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      client.publish("outTopic", "hello world");
      // ... and resubscribe
      client.subscribe("inTopic");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

Précédemment sur le moniteur série, il ne semblait pas que client.state() retourne un code d'erreur.
C'est toujours le cas?

Tu utilise quoi comme librairie?

Voila mon retour de de routine :

Du coup le code 5 correspond à quoi?

c'est l'exemple simple de la bibliothèque PubSubClient.h

Sûrement, mais ça me dit pas à quoi correspond ce code d'erreur.
Tu as regardé dans la documentation de la librairie que tu utilise ?
C'est bien celle-là?
J'ai un doute, car la documentation indique que la fonction retourne un boolean.
Tu as aucun identifiant de configuré sur ton serveur mosquito?

Je t’envoie la partie complète concernant le code de la librairie PubSubClient.h que j'ai installé dans mon sketch ( les parties restantes que tu ne verras pas ci-dessous : wifi.h + OneWire.h + DallasTemperature.h sont fonctionnelles ).

#include <PubSubClient.h>

const char* mqtt_server = "192.168.1.31";

WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
#define MSG_BUFFER_SIZE	(50)
char msg[MSG_BUFFER_SIZE];
int value = 0;

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();

  // Switch on the LED if an 1 was received as first character
  if ((char)payload[0] == '1') {
    //digitalWrite(BUILTIN_LED, LOW);   // Turn the LED on (Note that LOW is the voltage level
    // but actually the LED is on; this is because
    // it is active low on the ESP-01)
  } else {
    //digitalWrite(BUILTIN_LED, HIGH);  // Turn the LED off by making the voltage HIGH
  }

}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Create a random client ID
    String clientId = "ESP32Client-";
    clientId += String(random(0xffff), HEX);
    // Attempt to connect
    if (client.connect(clientId.c_str())) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      client.publish("outTopic", "hello world");
      // ... and resubscribe
      client.subscribe("inTopic");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void setup() {

Serial.begin(115200);
client.setServer(mqtt_server, 1883); 
client.setCallback(callback);

}

void loop() {

  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  unsigned long now = millis();
  if (now - lastMsg > 2000) {
    lastMsg = now;
    ++value;
    snprintf (msg, MSG_BUFFER_SIZE, "hello world #%ld", value);
    Serial.print("Publish message: ");
    Serial.println(msg);
    client.publish("outTopic", msg);
  }

Je n'est pas encore configuré de Login / password dans le fichier mosquitto.conf pour plus de simplicité pour le moment.