mqtt - 多个 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?我一次只能拥有其中一个。
解决方案
代码需要很少的改动:
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 必须是唯一的。
推荐阅读
- java - array without repetitions, algorithm
- aws-lambda - AWS AppSync 获取另一个表的计数(例如计算帖子的点赞数)
- sql - 在数据透视表中绘制两个数据
- python - 如何将 blob 名称传递给不同的 azure python 函数
- shopify - 在 Liquid shopify 中使用变量和文本字符串作为键
- html - 清晰属性 CSS[style="clear:both;" ]
- python - Python DistributionNotFound 问题
- javascript - location.href 刷新而不是重定向
- html - 在 css 中加载的字体没有显示在网站上
- netlogo - 当我的海龟品种开始更快地移动并限制海龟可以长到多大时,设置能量下降