paho-MQTT python:如何让loop_forever支持订阅消息?

时间:2016-05-14 11:04:59

标签: python mqtt

我已经在paho-mqtt上测试了示例程序,我知道函数loop_forever()可以处理重新连接。但我的问题是,尽管loop_forever()可以重新连接,但它无法重新订阅。当服务器突然崩溃时,这应该是一个问题,在这种情况下,客户端仍在监听,但是当服务器重新启动时,客户端可以重新连接,但不能再订阅消息。我想也许我应该重写loop_forever()函数,但我不确定我是否正确,以及如何做到这一点。

import sys
try:
    import paho.mqtt.client as mqtt
except ImportError:
    # This part is only required to run the example from within the examples
    # directory when the module itself is not installed.
    #
    # If you have the module installed, just use "import paho.mqtt.client"
    import os
    import inspect
    cmd_subfolder = os.path.realpath(os.path.abspath(os.path.join(os.path.split(inspect.getfile( inspect.currentframe() ))[0],"../src")))
    if cmd_subfolder not in sys.path:
        sys.path.insert(0, cmd_subfolder)
    import paho.mqtt.client as mqtt

def on_connect(mqttc, obj, flags, rc):
    print("rc: "+str(rc))

def on_message(mqttc, obj, msg):
    print(msg.topic+" "+str(msg.qos)+" "+str(msg.payload))

def on_publish(mqttc, obj, mid):
    print("mid: "+str(mid))

def on_subscribe(mqttc, obj, mid, granted_qos):
    print("Subscribed: "+str(mid)+" "+str(granted_qos))

def on_log(mqttc, obj, level, string):
    print(string)

# If you want to use a specific client id, use
# mqttc = mqtt.Client("client-id")
# but note that the client id must be unique on the broker. Leaving the client
# id parameter empty will generate a random id for you.
mqttc = mqtt.Client()
mqttc.on_message = on_message
mqttc.on_connect = on_connect
mqttc.on_publish = on_publish
mqttc.on_subscribe = on_subscribe
# Uncomment to enable debug messages
#mqttc.on_log = on_log
mqttc.connect("m2m.eclipse.org", 1883, 60)
mqttc.subscribe("$SYS/#", 0)


mqttc.loop_forever()

2 个答案:

答案 0 :(得分:2)

处理此问题的简单方法是在on_connect回调中进行订阅,然后在重新连接时也会恢复所有订阅。

答案 1 :(得分:0)

在实例化你的mqtt客户端时,你可以设置" clean session"标志为假。

mqttc = mqtt.Client(clean_session=False)

来自mosquitto手册的引文:

清理会话/持久连接

在连接时,客户端设置"清洁会话"旗帜,有时也被称为"干净的开始"旗。如果clean session设置为false,则将连接视为持久。这意味着当客户端断开连接时,它将保留所有订阅,并且将存储任何后续的QoS 1或2消息,直到将来再次连接为止。如果clean session为true,那么当客户端断开连接时,将删除所有订阅。