python paho-mqtt循环& persistan连接到经纪人

时间:2017-03-16 15:23:05

标签: python-3.x raspberry-pi mqtt paho

我已经编写了一些python3代码来按顺序执行以下操作;

  1. 检查是否上网
  2. 如果互联网连接到MQTT经纪人
  3. 每隔30分钟将消息发布到pub_topic
  4. 并循环到第一步&重复
  5. 此外,我希望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()?我已经阅读了文档,但这对我来说并不明显。

1 个答案:

答案 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回调或类似的东西。

希望有所帮助!