此代码片段:
import paho.mqtt.client as mqtt
client = mqtt.Client()
client.connect('localhost')
print(client.is_connected())
while not client.is_connected():
client.loop()
print(client.is_connected())
print(client.is_connected())
client.disconnect()
生产:
False
False
True
True
其指示在从CCD_ 1返回时连接状态尚未更新。文件(https://pypi.org/project/paho-mqtt/#connect-connect()函数将客户端连接到代理。这是一个阻塞函数这表明从connect()
返回时的状态应该是准确的。我是不是错过了什么?是否有其他方法可以测试client
是否已连接?
连接到代理是一个分两个阶段的过程:
- 建立连接(TCP/TLS/Websocket等)
- 执行MQTT连接握手(
CONNECT
/CONNACK
)
查看来源,当您调用client.connect('localhost')
时,第一步(建立网络连接)似乎在函数返回之前完成,但第二步没有完成(发送了CONNECT
数据包,但函数没有等待CONNACK
)。
连接状态(如client.is_connected()
所报告的)仅在处理了connect()
0数据包时更新(这在loop
中完成)。
文档没有尽可能好地涵盖这一点(已经提出了一些问题,例如这个和这个编辑-我创建了一个PR来更新文档)。
是否有其他方法可以测试客户端是否已连接?
更好的方法是使用on_connect
回调(如示例所示)。此答案提供了更多信息。