Python Paho/MQTT : 检测连接错误

Python Paho/MQTT : Detecting Connect error

简而言之,我有一个 Paho/MQTT 样本集可以正常工作,但我在检测错误时遇到了问题。具体来说,我没有收到 on_connect 回调,当给出无效的 UserID/Pswd 组合时,它会静默失败。 事实上,从各种迹象来看,一切都很好!

我做错了什么?

(snip)

def on_connect(client, userdata, flags, rc):
    print("Connected with flags [%s] rtn code [%d]"% (flags, rc) )

def on_disconnect(client, userdata, rc):
    print("disconnected with rtn code [%d]"% (rc) )

def on_publish(client, userdata, msgID):
    print("Published with MsgID [%d]"% (msgID) )


mqttc = mqtt.Client()
mqttc.on_connect = on_connect
mqttc.on_disconnect = on_disconnect
mqttc.on_publish = on_publish

mqttc.username_pw_set(Q_USER, Q_PSWD)

rc=mqttc.connect(Q_BROKER, Q_PORT)
print "Return="+str(rc)

mqttc.loop_start()
rc=mqttc.publish(Q_TOPIC, "Hello, World!")
print "Return="+str(rc)

mqttc.disconnect()
mqttc.loop_stop()

UserID或Pswd故意错误时的输出:

Return=0
Published with MsgID [1]
Return=(0, 1)
disconnected with rtn code [0]

事实证明这是几个不同的问题。

  • 首先,在没有真正连接的情况下连接 returns。在收到 Connect 回调之前添加一个带有 Sleep 的等待循环是至关重要的。只有回调告诉您连接成功或失败。
  • 其次,当我看到 return 代码时,我发现我的代码因协议版本不匹配而失败。我的 Pi 拉下的 Mosquitto 版本真的很旧。发现 post 将我的系统指向更新的版本。解决了版本不匹配的问题。
  • 第三,在Connect前加上"loop_start()"是不行的。直观的地方不是正确的地方。
  • 第四,需要在Disconnect之前添加Sleep()调用,否则你将看不到所有的Callbacks。

最重要的是,虽然文档展示了如何使用 API,但它们并未展示如何编写用于生产的可靠程序。

我仍在寻找方法来了解所有正在进行的发布调用何时已清除,而不是使用盲目睡眠调用,但我的原始问题已解决。

当您发送 mqtt CONNECT 数据包时,您应该会收到 CONNACK 响应。此响应包含以下代码
0 - 成功,已接受连接
1 - 连接被拒绝,协议错误
2 - 拒绝,客户 ID 错误
3 - 拒绝,服务不可用 4 - 拒绝,错误的用户名或密码
5 - 拒绝,未授权
如您所见,您的回复应该是 4。但它是。可能是您的经纪人没有检查凭据,所以您的 connect 消息被接受了。客户看起来不错。

尝试将 publish 放入这样的 while 循环中

while True:
    mqttc.loop()
    rc=mqttc.publish(Q_TOPIC, "Hello, World!")
    print("Return=" + str(rc))
    if sth:
        break
mqttc.disconnect()

这样,回调函数可能会在程序结束前执行。