python - 如何通过 mqtt 接收来自多个客户端的消息?
问题描述
我正在从一个 python 脚本同时从多个客户端发送许多消息,并尝试在另一个脚本上接收它们。我遇到的问题是消息已收到,但仅来自第一个连接的客户端,并且它继续循环遍历它。我需要的是,我以发布方式从每个客户端获取消息。
import paho.mqtt.client as mqtt
import time
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Connected to broker")
global Connected
Connected = True
else:
print("Connection failed")
def on_message(client, userdata, message):
print ("Message received: " + str(message.payload) + " from " + str(client))
Connected = False
client = mqtt.Client()
client.on_connect= on_connect
client.on_message= on_message
client.connect(host)
client.loop_start()
while Connected != True:
time.sleep(0.1)
client.subscribe("test")
print("subscribed")
client.loop_stop()
解决方案
您误解了回调中的client
参数是什么。on_message
该值是指向已订阅该主题的 MQTT 客户端的本地实例的链接。
MQTT 消息不携带有关发布它们的客户端的任何信息,除非您将其显式编码到有效负载中。像 MQTT 这样的 Pub/Sub 协议的部分意义在于将信息创建者(发布者)与信息消费者(订阅者)完全分离。
此外,您应该将调用移至回调client.subscribe("test")
内部,on_connect()
因为当您拥有它时,您正试图每秒重新订阅同一个主题 10 次,除了在代理上产生不需要的负载外,这将一事无成。
推荐阅读
- node.js - JavaScript:使用回调作为函数参数的原因
- python - 如何使用 Zeep 获得多页 SOAP 响应?
- c# - 如何选择一个实体来显示
- c++ - 将指向结构数组的指针添加到 std::map
- php - 从 PHP Mailer 的标题中修剪电子邮件地址
- c++ - 如何从数组中删除 2 个连续的重复项?C++
- javascript - html5 存储未在页面重新加载时显示数据
- java - 如何去除代码异味:getSessionFactory,仅在必要时创建 SessionFactory
- c - C11 线程.h 库
- python - 如何使用其他按钮增加 QFrame.HLine 行分隔符的宽度和距离?