我正在使用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。如果有人可以给我提示,最干净,最快的方法是什么,我将非常感激。
您仅应连接到代理,并在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_list
和request_value
数据结构组合到一个列表中可能会更好。