2017-07-03 2 views
0

Mon problème:MQTT mosquitto et deux ESP8266

J'ai un Raspberry Pi, et j'ai installé le courtier mosquitto MQTT sur elle. Mon objectif est de faire communiquer 2 clients MQTT via le broker Mosquitto, j'ai donc installé le code ci-dessous sur deux ESP8266 (WeMos D1 mini) et j'ai créé cette commande MQTT: mosquitto_pub -h 192.168.1.20 -t /wassim/led -m "on". Ainsi, lorsque je connecte un seul client ESP, le message "on" apparaît sur le moniteur série. Mais quand je connecte le second client ESP, je ne vois aucun message sur le moniteur série ... (Mais si sur le terminal du Raspberry, je peux tout voir Sur les clients je ne vois rien). Le code:

#include <ESP8266WiFi.h> 
#include <WiFiClient.h> 
#include <MQTTClient.h> 

float temp; 
float lm; 
String aw=""; 
const char* host = "192.168.1.20"; 
const char* ssid = "THOMSON1121"; 
const char* password = "Wassim"; 
WiFiClient net; 
MQTTClient mqtt; 

void connect(); 

void setup() { 
    Serial.begin(115200); 
    Serial.println(); 
    Serial.println("Booting..."); 
    WiFi.mode(WIFI_AP_STA); 
    WiFi.begin(ssid, password); 
    mqtt.begin(host, net); 
    connect(); 
    if(mqtt.subscribe("/wassim/led")) { 
    Serial.println("Subscription Valid !"); 
    } 
    Serial.println("Setup completed..."); 
} 

void loop() { 
    if (!mqtt.connected()) { 
    connect(); 
    } 
    mqtt.loop(); 
    delay(3000); 
} 

void connect() { 
    while(WiFi.waitForConnectResult() != WL_CONNECTED) { 
    WiFi.begin(ssid, password); 
    Serial.println("WiFi connection failed. Retry."); 
    } 
    Serial.print("Wifi connection successful - IP-Address: "); 
    Serial.println(WiFi.localIP()); 
    while (!mqtt.connect(host)) { 
    Serial.print("."); 
    } 
    Serial.println("MQTT connected!"); 
} 

void messageReceived(String topic, String payload, char * bytes, unsigned int length) { 
    Serial.print("incoming: "); 
    Serial.print(topic); 
    Serial.print(" - "); 
    Serial.print(payload); 
    Serial.println(); 
} 

Le changement d'un client à l'autre est if(mqtt.subscribe("/wassim/tmp")).

+0

Il n'est pas clair que vous demandez ici. Voulez-vous dire qu'un client est abonné à '/ wassim/led' & un à'/wassim/tmp'? Si c'est le cas, vous publiez seulement '/ wassim/led' de sorte qu'un seul périphérique recevra le message. – hardillb

Répondre

0

MQTT est une application 'bus de messages' .... pour que plusieurs 'abonnés' reçoivent le même message qu'un 'éditeur' met dans le bus, ils doivent tous deux s'abonner au même sujet ... ou au moins assez du sujet + wildcard ... afin d'être envoyé ce message publié. L'un de vos deux clients n'écoute que le sujet que votre commande 'mosquitto_pub' envoie. Pour recevoir, vous devez spécifier le sujet complet (mqtt.subscribe("/wassim/led")) ou un caractère générique pour récupérer tous les messages 'wassim' envoyés (mqtt.subscribe("/wassim/#")).