简而言之,我有一个工作正常的 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]
事实证明这是几个不同的问题。
- 首先,Connect 返回时并未真正连接。添加带有 Sleep 的等待循环,直到收到 Connect 回调至关重要。只有回调告诉您连接成功或失败。
- 其次,当我看到返回代码时,我发现我的返回代码因协议(protocol)版本不匹配而失败。我的 Pi 所使用的 Mosquitto 版本真的很旧。发现一篇文章将我的系统指向更新版本。解决了版本不匹配的问题。
- 第三,在Connect之前添加“loop_start()”不起作用。直觉的地方并不是正确的地方。
- 第四,需要在 Disconnect 之前添加 Sleep() 调用,否则您将看不到所有回调。
底线是,虽然文档展示了如何使用 API,但它们并没有展示如何编写用于生产的健壮程序。
我仍在寻找方法来了解所有正在进行的发布调用何时已清除,而不是使用盲目的 Sleep 调用,但我原来的问题已解决。
我是一名优秀的程序员,十分优秀!