ESP8266 souscrire à un topic MQTT

Bonjour,
J'ai un ESP qui transmet des infos sur un topic (sofar2mqtt)
La publication se déroule bien et je reçois les données si je me connecte sur le client en ligne "http://www.emqx.io/"
Par contre je n'arrive pas à récupérer les données sur un autre ESP.
Voici mon code, si qqun a une idée du problème...

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

// WiFi
const char *ssid = "xxxxxxx"; // Enter your WiFi name
const char *password = "xxxxxxx";  // Enter WiFi password

// MQTT Broker
const char *mqtt_broker = "broker.emqx.io";
const char *topic = "topicXXXX";
const char *mqtt_username = "xxxxxxx";
const char *mqtt_password = "xxxxxxx";
const int mqtt_port = 1883;

WiFiClient espClient;
PubSubClient client(espClient);

void mqttReconnect() 
{
  //connecting to a mqtt broker
  client.disconnect();		// Just in case.
	delay(200);
  client.setServer(mqtt_broker, mqtt_port);
  client.setCallback(callback);
  while (!client.connected()) {
      String client_id = "Arduino";
      //client_id += String(WiFi.macAddress());
      Serial.printf("The client %s connects to the public mqtt broker\n", client_id.c_str());
      if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
          Serial.println("Public emqx mqtt broker connected");
      } else {
          Serial.print("failed with state ");
          Serial.print(client.state());
          delay(2000);
      }
  }

  client.subscribe(topic);

}

void setup() {
  // Set software serial baud to 115200;
  Serial.begin(9600);
  // connecting to a WiFi network
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.println("Connecting to WiFi..");
  }
  Serial.println("Connected to the WiFi network");

  mqttReconnect();

  Serial.println("Setup fini, attente message");
}

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

void loop() {
  client.loop();

  //make sure mqtt is still connected
  if((!client.connected()) || !client.loop())
  {
    mqttReconnect();
  }
}

:warning:

Post mis dans la mauvaise section, on parle anglais dans les forums généraux. ➜ déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans "Les bonnes pratiques du Forum Francophone”

1 Like

Que voyez vous dans le moniteur série ?

Bonsoir.
Rien…

Sur le pc, dans la page du broker je vois bien les données arriver toutes les 5-10 secondes du 1er module ESP mais rien sur le second.
Par contre si je poste un message sur le topic (pc) il arrive bien dans le second ESP. Il est donc bien connecté au broker
Je comprends pas…

testez votre infrastructure avec le code d’un exemple de la bibliothèque PubSubClient

Bonjour @flying_0

Sur le pc, dans la page du broker je vois bien les données arriver toutes les 5-10 secondes du 1er module ESP mais rien sur le second

 String client_id = "Arduino";

chacun des ESP8266 a-t-il bien un identifiant de client particulier qui permet au broker de le distinguer des autres clients ?

Par contre si je poste un message sur le topic (pc) il arrive bien dans le second ESP.

Moniteur série : avec tous les Seriial.print() du code il est étonnant de ne rien voir dans le terminal de l'IDE pour l'ESP8266 qui pose problème

J’ajoute l’adresse MAC à la fin pour le rendre unique.
Par contre l’ESP d’envoi à un nom plus « banal », je vais le modifier pour essayer.

Pour les Serial.print, ils sont juste dans le setup et la fonction de connections. C’est pas bien?

Merci de votre aide

il est fort probable que 'arduino' est déjà utilisé comme identifiant pour le broker !
ça pourrait expliquer le non fonctionnement de la souscription pour le second ESP8266

Des serial.print() sont présents dans la fonction de callback, ça devrait suffire à signaler l'arrivée d'une donnée pour un topic souscrit

Bonjour,
Le nom du 2ème ESP est unique sous la forme : Ard_DueXX:XX:XX:XX:XX:XX
Le topic est également unique sous la forme : Sofar2mqtt_XXXXXXXXXXX/state
Je me connecte au broker avec les même username et password sur les 2 ESP et via le PC
Pourtant rien n'arrive dans la fonction callback du 2ème ESP (sauf lorsque je fais un envoi "manuel" du PC vers le topic

1-Donc le second ESP aynt souscrit à un topic ne recoit que les données publiées à partir de l'ordi et non celles publitées par l'autre ESP , c'est bien ça ? (étant donné que la publication par l'autre ESP semble effective au vu de l'écran del'ordi)

2-version de MQTT utilsée actuellement côté broker ? (3 ? 5?)

3-pour les manipulations de mise au point avec l'ordi utilises tu un client comme MQTT Explorer, MQTTFx... ?

4-la souscription est elle OK avec un exemple de base de la bibliothèque PubSub ?

oui c'est tout à fait cela.
Sur l'ordi je suis connecté via "http://www.emqx.io/online-mqtt-client#/..."
J'utilise les librairies ESP8266WiFi.h et PubSubClient.h sur le 2ème ESP

Pour la souscription elle est ok; à la fin du setup du 2ème ESP je publie un message sur le topic et il s'affiche bien à l'ordi.
Je n'ai pas compris le point 2 "version de MQTT"

MQTT X utilise la version 5.0 de la specification

ils ont un lien pour Arduino

La bibliothèque PubSub utilise la version 3.1.1
Certains brokers proposent la vertion 5
c'est sans doute le cas des brokers d'EMQX ,que je n'utilise pas, il faut peut être faire sur sa consoie une action pour lui dire de travailler en version 3.1.1

@J-M-L

MQTT X est un client (comme MQTT Explorer ou MQTT FX) pas un broker

Merci je vais aller voir

oki
désolé je suis novice; il y a 3 jours je ne savais même pas ce qu'était MQTT

il y a 3 jours je ne savais même pas ce qu'était MQTT

Dans ce cas, ne pas brûler les étapes , tester les exemples de base de PubSubClient comme indiqué en #5 et #10

désolé mauvais lien

je voulais dire que https://www.emqx.io est un broker MQTT 5.0. c'est semble-t-il celui utilisé

C'est leur code que j'ai utilisé pour la connexion et pour subscrire

oui en effet. Il faudrait que je trouve un broker 3.1.1. alors ? J'en avais essayé plusieurs mais le seul où j'ai réussi à me connecter (pour faire les tests je n'ai pas envie de payer un abonnement), c'est emqx.io