在paho-mqtt中订阅和发布多个主题的最佳方法是什么?

问题描述 投票:0回答:1

我正在使用MQTT来干扰网络中的消息,并且对将多条消息发布和订阅到代理的最干净的方式有疑问。首先,我有两个列表:

request_list = [('sensors/system/temperature', 0), 
                ('sensors/system/gyroscope', 1), 
                ('sensors/system/acceleration', 2)]

其中包含我要发布消息的主题。我的第二个列表定义了我要发布的消息以及要获得响应的主题(==我必须订阅才能获得答案的主题)。

request_value = ['{"response":"similarity/sensors/system/temperature","duration":"60s"}',
                  {"response":"similarity/sensors/system/gyroscope","duration":"60s"}', 
                 '{"response":"similarity/sensors/system/acceleration","duration":"60s"}'] 

对于每个主题,我的代理都是相同的,并且在PORT =“ 8083”上使用HOST =“ 192.168.137.1”进行了定义。现在,我正在使用for循环,订阅一个主题,发布我的消息,然后等待消息进入。因为我必须等待每个订阅并发布,以免浪费时间。我当前代码的伪代码如下:

list_measurments = []
for topic in request_list:
    client.connect("Broker","Host")
    client.loop_start() 
    client.subscribe("sub_topic")
    client.pub("pub_topic","pub_message")
    client.callback("append list_measurements")
    client.loop_stop() #stop the loop
    client.disconnect

我试图从问题here中使用线程,但事实证明,线程的正常使用是将同一条消息发布给许多不同的代理。我也想到了multiple subscribtions。如果有人可以给我提示,最干净,最快的方法是什么,我将非常感激。

python performance mqtt publish-subscribe paho
1个回答
1
投票

您仅应连接到代理,并在for循环外启动客户端循环。

每次都设置和断开与代理的连接将增加大量的开销,并留出了很多空间来错过消息。

您还应该只在启动时订阅所有想要的主题。好的,您可以根据需要添加更多或取消订阅,但是如果它们始终相同,则在连接时只需进行订阅即可。

基本的通用方法应如下所示。

def on_connect(client, userdata, flags, rc):
  for i in request_value:
    client.subscribe(i.response)

  for i in request_list:
    //this loop needs to be a bit more complicated
    //as you need to pull the topic from the request_list
    //and the payload from request_value
    client.publish(i)

def on_message(client, userdata, message):
  if message.topic == "similarity/sensors/system/temperature":
    //update temperature
  elif message.topic == "similarity/sensors/system/gyroscope":
    //update gyro
  elif message.topic == "similarity/sensors/system/acceleration":
    //update accel

client.on_connect = on_connect
client.on_message = on_message
client.connect("BrokerIP")
client.loop_start()

[如果需要,您也可以再次运行发布循环(因为您一次只请求60s的数据)。将request_listrequest_value数据结构组合到一个列表中可能会更好。

© www.soinside.com 2019 - 2024. All rights reserved.