即使我的MQTT客户端未连接,如何继续运行程序?

时间:2019-03-28 04:21:45

标签: python mqtt

我正在编写一个在树莓派上运行并连接到相机的python程序。当我使用MQTT时,当客户端不通过程序连接时冻结。即使客户端没有连接,也有什么办法可以继续运行该程序,即我什么也没收到,但相机仍在运行。

例如,即使客户端未连接,如何打印x?

@objc func tap(_ sender: UITapGestureRecognizer) {
    if let sender = sender as? CustomTapGesture {
       yourData = sender.data
       // do something with your data
    }
}

1 个答案:

答案 0 :(得分:2)

编辑:我最终运行了您的代码,并且在大约30秒后收到了TimeoutError异常:"A connection attempt failed because the connected party did not properly respond after a period of time"。您需要在代码中处理该异常,以便程序即使无法连接也可以继续运行:

try:
    client.connect("118.138.47.99", 1883, 60)
    client.loop_forever()
except:
    print("failed to connect, moving on")

print("rest of the code here")

这将输出:

failed to connect, moving on
rest of the code here

但是,使用connect()loop_forever()不适合您的需要,因为它们会阻塞函数(也就是说,它们会阻塞代码的执行并阻止其执行其他操作)。使用上面的代码,如果客户端成功连接,由于print("rest of the code here"),将永远无法访问loop_forever()

相反,请尝试将connect_async()loop_start()结合使用以非阻塞方式连接(这意味着您的程序可以在尝试在后台连接时继续做其他事情):

client.connect_async("118.138.47.99", 1883, 60)
client.loop_start()

print("rest of the code here")

while True:
    time.sleep(1)

这将输出rest of the code here,并继续无限期运行(在无限while循环中),无论连接是否成功。

请注意,您的on_connect()定义缺少一个参数。应该是:

on_connect(client, userdata, flags, rc)

另外,最好检查on_connect的返回码,并且仅在连接成功时进行预订:

def on_connect(client, userdata, flags, rc):
    if rc == 0:
        client.connected_flag = True # set flag
        print("Connected OK")
        client.subscribe("demo/test1")
    else:
        print("Bad connection, RC = ", rc)
        mqtt.Client.bad_connection_flag = True

# create flags so you can check the connection status throughout the script
mqtt.Client.connected_flag = False 
mqtt.Client.bad_connection_flag = False

请参见https://www.eclipse.org/paho/clients/python/docs/http://www.steves-internet-guide.com/client-connections-python-mqtt/

要快速测试成功的连接,可以连接到test.mosquitto.org(请参阅https://test.mosquitto.org/)。