2017-07-03 94 views
0

我的問題:MQTT Mosquitto和兩個ESP8266

我有一個Raspberry Pi,並且我已經安裝了Mosquitto MQTT broker。我的目標是讓2個MQTT客戶端通過Mosquitto代理進行通信,所以我在兩個ESP8266(WeMos D1 mini) 上安裝了以下代碼,並且我已經創建了此MQTT命令:mosquitto_pub -h 192.168.1.20 -t /wassim/led -m "on"

因此,當我只連接一個ESP客戶端時,在串口監視器中看到「on」消息。但是,當我連接第二個ESP客戶端時,我無法在串口監視器上看到任何消息......(但是,如果在Raspberry的終端上,則可以看到所有內容,在客戶端上我什麼都看不到)。代碼:

#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(); 
} 

從一個客戶端到另一個客戶端的更改是if(mqtt.subscribe("/wassim/tmp"))

+0

你不清楚你在這裏問。你的意思是說一個客戶訂閱了'/ wassim/led',一個訂閱了'/ wassim/tmp'?如果是這樣,你只發布到'/ wassim/led',這樣只有一個設備會收到這條消息。 – hardillb

回答

0

MQTT是一個'消息總線'應用程序....爲了讓多個'訂閱者'收到一個'發佈者'放在公共汽車上的相同消息,他們都必須訂閱相同的主題...或至少足夠的話題+通配符......以獲得發佈該發佈的消息。您只有兩個客戶端中的一個監聽您的'mosquitto_pub'命令發出的主題。要獲得它,您要麼指定完整的主題(mqtt.subscribe("/wassim/led")),要麼指定一個通配符來獲取發出的所有'wassim'消息(mqtt.subscribe("/wassim/#"))。