python 3.9 订阅mqtt消息一段时间后,出现重新连接,但不会继续订阅的问题

环境信息

  • emqx:5.0.8
  • win10 22h2:
  • python 3.9

问题描述

我用了这里的示范代码(最后一个订阅代码),并把数据写入数据库

import random
from paho.mqtt import client as mqtt_client

broker = 'broker.emqx.io'
port = 1883
topic = "/python/mqtt"
# generate client ID with pub prefix randomly
client_id = f'python-mqtt-{random.randint(0, 100)}'

def connect_mqtt() -> mqtt_client:
    def on_connect(client, userdata, flags, rc):
        if rc == 0:
            print("Connected to MQTT Broker!")
        else:
            print("Failed to connect, return code %d\n", rc)

    client = mqtt_client.Client(client_id)
    client.on_connect = on_connect
    client.connect(broker, port)
    return client

def subscribe(client: mqtt_client):
    def on_message(client, userdata, msg):
        print(f"Received `{msg.payload.decode()}` from `{msg.topic}` topic")

    client.subscribe(topic)
    client.on_message = on_message

def run():
    client = connect_mqtt()
    subscribe(client)
    client.loop_forever()

if __name__ == '__main__':
    run()

程序会在6-10个小时左右停止运行,具体是出现这样的提示"Connected to MQTT Broker!"
image

这是什么原因?是需要重新连接后,还要重新订阅吗?
恳请帮助,先谢谢了

客户端库有重连机制,断开连接的时候 broker 端订阅关系其实就丢失了,而重连机制只会重新连接,不会重新订阅。

  • 你可以在 connected 的回调里面重新发起订阅,这样不管什么情况下重连都能触发订阅(推荐);
  • 或者将 clean_session 设置为 false,客户端断开后会话有效期内订阅关系都不会丢失。

在 connected 的回调里面重新发起订阅 – 这个烦请在详细帮助下,好吗?比如在我上面的演示代码哪里加入怎样的代码?抱歉哈,我是新手
将 clean_session 设置为 false - 这个明白了。

诚挚的感谢

接在 rc == 0 里面

谢谢了