Python Paho/MQTT:检测连接错误

Python Paho/MQTT:检测连接错误,python,mqtt,paho,Python,Mqtt,Paho,简而言之,我有一个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_d

简而言之,我有一个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()
用户ID或Pswd故意错误时的输出:

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

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

  • 首先,Connect返回,但没有真正连接。在收到Connect回调之前添加一个带有休眠的等待循环是至关重要的。只有回调告诉您连接成功或失败
  • 第二,当我看到返回代码时,我发现我的代码在协议版本不匹配方面失败了。我的Pi所用的Mosquitto版本真的很旧了。找到一篇将我的系统指向更新版本的帖子。解决了版本不匹配的问题
  • 第三,在连接之前添加“loop_start()”不起作用。直觉的地方不是正确的地方
  • 第四,需要在断开连接之前添加Sleep()调用,否则将看不到所有回调
一句话,虽然这些文档展示了如何使用API,但它们并没有向您展示如何为生产使用编写健壮的程序


我仍在寻找方法,以了解所有飞行中的发布呼叫何时已清除,而不是使用盲睡眠呼叫,但我原来的问题已得到解决。

当您发送mqtt CONNECT数据包时,您应该会收到CONNACK响应。此响应包含以下代码
0-成功,已接受连接
1-连接被拒绝,协议错误
2-被拒绝,客户端id错误
3-拒绝,服务不可用 4-被拒绝,用户名或密码错误
5-拒绝,未授权

如您所见,您的回答应该是4。但它是零。这可能是因为您的代理不检查凭据,所以您的connect消息被接受。客户端看起来很好。

尝试将
发布
放入
中,同时像这样执行
循环

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

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

为了增加混淆。。。如果在connect()调用之前移动循环_start(),则消息不会正确发布。仍然没有错误指示您使用的代理以及如何配置身份验证?e、 g.如果MOSQUITO是
allow_anonymous
true?请注意,在connect()调用之前的loop_start()会产生未定义的结果。在python中使用paho MQTT时,除了on_conenct callback rc参数外,是否有办法确定到MQTT代理的连接是否成功?我对MQTT不熟悉,但对我来说,这将重复发布同一消息。什么是“某物”?答案似乎是寻找on_publish来完成。这里我的意思是,如果你不在
循环期间将
publish
放入
中,程序将在触发回调函数之前终止
sth
这里指的是有助于控制循环的任何条件。事实上,我记得我也遇到过同样的情况,但无法清楚地想到解决办法。我建议你试试。同意。请看我答案中的第四点。目前我使用睡眠,但希望有一种更可靠、更准确的方法来知道所有已发布消息的地址。注意1)我根本看不到连接响应,2)我使用的QOS为“0”,因此连接从未成功过,因为我以fire and forget发送,RC将始终为“0”。一旦我提高了QOS级别,我得到了消息发送错误。另外,一旦我成功处理了回调,我看到我收到了一个连接错误“1”(旧的Mosquito版本不支持3.11客户端协议版本),您是否能够生成一个工作代码来获取状态代码?