Python Paho / MQTT:检测连接错误

时间:2017-02-25 02:49:03

标签: 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_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]

3 个答案:

答案 0 :(得分:2)

原来这是一些不同的问题。

  • 首先,Connect没有真正连接就返回。添加具有休眠的等待循环直到收到Connect回调是至关重要的。只有回调告诉您Connect连接成功或失败。
  • 其次,一旦我看到返回代码,我就看到我的协议版本不匹配失败了。我的Pi正在拉下来的Mosquitto版本真的很老了。找到了一个将我的系统指向更新版本的帖子。解决了版本不匹配的问题。
  • 第三,添加" loop_start()"之前Connect不起作用。直观的地方不是正确的地方。
  • 第四,需要在Disconnect之前添加Sleep()调用,否则您将看不到所有的Callback。

最重要的是,虽然文档展示了如何使用API​​,但他们并没有向您展示如何编写一个强大的程序供生产使用。

我仍然在寻找方法知道所有正在进行的发布呼叫何时清除,而不是使用盲目睡眠呼叫,但我的原始问题已得到解决。

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

尝试将publish置于while这样的循环中

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

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