Python paho-mqtt延迟连接状态

Python paho-mqtt delayed connection status

这段代码片段:

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

表示从 connect() return 起,连接状态尚未更新。文档 (https://pypi.org/project/paho-mqtt/#connect-reconnect-disconnect) 显示 connect() 函数将客户端连接到代理。这是一个阻塞函数。 这表明状态在 connect() 的 return 应该是准确的。我错过了什么吗?还有其他方法可以测试 client 是否已连接吗?

连接到代理是一个两阶段过程:

  • 建立连接(TCP/TLS/Websocket等)
  • 执行 MQTT 连接握手 (CONNECT/CONNACK)

正在查看 the source it appears that when you call client.connect('localhost') the first step (establish network connection) is completed before the function returns but the second is not (the CONNECT packet is sent but the function does not wait for the CONNACK)。

连接状态(由 client.is_connected() 报告)仅在处理 CONNACK 数据包时更新(这在 loop 中完成)。

文档没有尽其所能地涵盖这一点(并且已经提出了一些问题,例如 this and this)。

Is there another way to test if client is connected?

更好的方法是使用 on_connect 回调(如 examples). 所示,提供了更多信息。