首页 > 解决方案 > 多个 ESP8266 订阅一个 RPI 3

问题描述

我无法将 2 个(或更多)ESP8266 订阅到一个 RPi3 代理。我用了:

import paho.mqtt.client as mqtt
import datetime

mqtt_topics = ["esp8266-1", "esp8266-2"]

def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))

    for topic in mqtt_topics:
     client.subscribe(topic)

def on_message(client, userdata, msg):
    print(datetime.datetime.now())
        print(str(msg.topic)+" "+str(msg.payload))

client = mqtt.Client()
client.on_connect = on_connect
client.connect('localhost', 1883, 60)

try:
    for topic in mqtt_topics:
        client.on_message = on_message
    client.loop_forever()
except KeyboardInterrupt:
        print("CTRL-C: Terminating program.")

它有效,但仅适用于 1 esp。如果我连接 esp8266-1 它会检查它的值,然后我连接 esp8266-2 以获得它的值并且 esp8266-1 不再可用(即使我打开 esp8266-2)。

如何同时订阅 esp8266?我一次只能拥有其中一个。

标签: mqttpublish-subscribeesp8266

解决方案


代码需要很少的改动:

import paho.mqtt.client as mqtt
import datetime

mqtt_topics = [("esp8266-1",0), ("esp8266-2",0)]

def on_connect(client, userdata, flags, rc):
  print("Connected with result code "+str(rc))
  client.subscribe(mqtt_topics)

def on_message(client, userdata, msg):
  print(datetime.datetime.now())
  print(str(msg.topic)+" "+str(msg.payload))

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect('localhost', 1883, 60)

try:
  client.loop_forever()
except KeyboardInterrupt:
  print("CTRL-C: Terminating program.")

但是,如果一个客户端工作而第二个客户端强制第一个断开连接,那么听起来两个客户端的客户端 ID 相同。对于所有客户端,clientID 必须是唯一的。


推荐阅读