我正在编写一个在树莓派上运行并连接到相机的python程序。当我使用MQTT时,当客户端不通过程序连接时冻结。即使客户端没有连接,也有什么办法可以继续运行该程序,即我什么也没收到,但相机仍在运行。
例如,即使客户端未连接,如何打印x?
@objc func tap(_ sender: UITapGestureRecognizer) {
if let sender = sender as? CustomTapGesture {
yourData = sender.data
// do something with your data
}
}
答案 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/)。