我已经编写了一些python3代码来按顺序执行以下操作;
此外,我希望MQTT连接是持久的,以便可以接收传入的消息。
发生的事情是,经过几次迭代后,MQTT连接断开,最终程序崩溃。
下面是我的while循环代码段;
while True:
try:
if not internet_up():
time.sleep(20)
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect(broker, 1883, 60)
client.loop_start()
if internet_up():
print(read_temp())
client.publish(pub_topic, read_temp())
time.sleep(60*30)
except Exception as err:
logging.info(err)
pass
一个。这里有明显的错误吗?
B中。我不觉得这是最佳的,如何才能使其更有效率,更高效率或更正?
℃。另外,loop_start()
和&之间的区别是什么? loop_forever()
?我已经阅读了文档,但这对我来说并不明显。
答案 0 :(得分:0)
建立barny的评论,我怀疑这里的问题是你在不调用client.loop_stop()或client.disconnect()的情况下反复调用client.loop_start()。
为了测试这个,我使用mosquitto测试服务器写了一个测试脚本:
from time import sleep
import paho.mqtt.client as mqtt
def on_connect(client, userdata, flags, rc):
client.subscribe('$SYS/broker/load/messages/received/1min')
def messages_received(client, userdata, message):
print(message.payload)
while True:
client = mqtt.Client()
client.loop_start()
client.message_callback_add('$SYS/broker/load/messages/received/1min', messages_received)
client.on_connect = on_connect
client.connect("test.mosquitto.org", 1883, 60)
sleep(13)
此脚本在几分钟内失败。但是,如果我将最后一部分更改为包含client.loop_stop()和client.disconnect(),请执行以下操作:
while True:
client = mqtt.Client()
client.loop_start()
client.message_callback_add('$SYS/broker/load/messages/received/1min', messages_received)
client.on_connect = on_connect
client.connect("test.mosquitto.org", 1883, 60)
sleep(3)
client.disconnect()
client.loop_stop()
sleep(10)
它无限期地运行。我是python和paho的新手,所以这里可能还有另外一个问题......我也只用test.mosquitto.org对此进行了测试,因此可能存在代理特定的问题......但要使现有的代码工作我会尝试至少在你的循环中添加client.loop_stop。
但是,由于您希望连接是持久的,因此您可能需要考虑使用client.loop_forever()并将while循环放入on_connect回调或类似的东西。
希望有所帮助!