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
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é.
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);
}
}
}
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.