【问题标题】:MQTT Mosquitto and two ESP8266MQTT Mosquitto 和两个 ESP8266
【发布时间】:2017-07-03 04:06:34
【问题描述】:

我的问题:

我有一个 Raspberry Pi,并在上面安装了 Mosquitto MQTT 代理。我的目标是让 2 个 MQTT 客户端通过 Mosquitto 代理进行通信,因此我在两个 ESP8266(WeMos D1 mini)上安装了以下代码 我已经创建了这个 MQTT 命令:mosquitto_pub -h 192.168.1.20 -t /wassim/led -m "on"

所以,当我只连接一个 ESP 客户端时,我会在串行监视器中看到“开启”消息。但是当我连接第二个 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"))

【问题讨论】:

  • 不清楚你在这里问。您的意思是一位客户订阅了/wassim/led 和一位订阅了/wassim/tmp?如果是这样,您只发布到/wassim/led,因此只有一台设备会收到消息。

标签: arduino mqtt iot esp8266 mosquitto


【解决方案1】:

MQTT 是一个“消息总线”应用程序......为了让多个“订阅者”接收到由“发布者”放在总线上的相同消息,他们都必须订阅同一个主题。 ..或至少足够的主题+通配符...以便发送已发布的消息。您的两个客户中只有一个正在收听您的“mosquitto_pub”命令发出的主题。要让它接收,您可以指定完整的主题 (mqtt.subscribe("/wassim/led")),或者指定一个通配符来获取所有发出的“wassim”消息 (mqtt.subscribe("/wassim/#"))。

【讨论】: