2017-07-03 119 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/#"))。