2017-02-25 261 views
1

總之,我有一個Paho/MQTT示例集可以正常工作,但我在檢測錯誤時遇到了問題。具體來說,我沒有獲得on_connect回調,並且當給出無效的UserID/Pswd組合時,它會自動失敗。事實上,每一個跡象都表明它一切正常!Python Paho/MQTT:檢測連接錯誤

我在做什麼錯?

(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() 

輸出時,用戶名或PSWD是故意錯誤:

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

添加到混淆......如果我在connect()調用之前移動loop_start(),則郵件無法正確發送。仍然沒有錯誤跡象 – Jeppedy

+1

您正在使用哪個代理,您是如何配置身份驗證的?例如如果mosquitto是'allow_anonymous'是真的? – hardillb

+0

請注意,connect()調用之前的loop_start()會導致未定義的結果。 – Jeppedy

回答

1

事實證明,它是幾個不同的問題。

  • 首先,連接返回時沒有真正連接。使用睡眠模式添加一個等待循環,直到接收到連接回調是至關重要的。只有回調告訴你連接成功或失敗。
  • 其次,一旦我看到返回碼,我看到我的協議版本不匹配失敗。我Pi的蚊子版本被拉下來真是老了。找到一篇文章指出我的系統是一個更新的版本。解決了版本不匹配問題。
  • 第三,在Connect之前添加「loop_start()」不起作用。直觀的地方不是正確的地方。
  • 第四,需要在Disconnect之前添加Sleep()調用,否則您將看不到所有的回調。

底線,雖然文檔展示瞭如何使用這些API,但它們不會告訴您如何編寫一個用於生產用途的強大程序。

我仍然在尋找方法來了解何時所有機上發佈呼叫已清除,而不是使用盲睡眠呼叫,但我的原始問題已解決。

0

當您發送mqtt CONNECT包時,您應該收到CONNACK響應。該響應包括以下代碼
0 - 成功,連接接受
1 - 連接被拒絕,壞協議
2 - 拒絕,客戶端ID錯誤
3 - 拒絕,服務不可用 4 - 拒絕,錯誤的用戶名或密碼
5 - 拒絕,未授權
正如您所見,您的回覆應爲。但它是。這可能是因爲你的經紀人沒有檢查憑證,所以你的連接消息被接受。客戶看起來很好。

+0

注意1)我根本沒有看到連接響應,並且2)我使用'0'的QOS 因此,連接從未成功,並且由於我發送的是「忘卻遺忘」,因此RC始終是' 0' 。一旦我提高了QOS級別,我收到了消息發送錯誤。此外,一旦我成功處理回調,我看到我得到'1'的連接錯誤(舊的Mosquitto版本不支持3.11客戶端協議版本) – Jeppedy

0

嘗試把publishwhile循環這樣

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

這樣,回調函數可以被執行程序結束之前。

+0

我是MQTT的新手,但對我來說,這將重複發佈相同的信息。什麼是「......」? 答案似乎在尋找on_publish來通過。 – Jeppedy

+0

這裏我的意思是如果你不把'publish'放到'while'循環中,程序將在回調函數觸發前終止。這裏的'sth'意味着任何可以幫助控制循環的條件。其實我記得我遇到過同樣的情況,但不能清楚地想到解決方案。我建議你試試看。 – LuCima

+0

同意。請參閱我的答案中的第四點。目前我使用睡眠,但會喜歡更強大和準確的方式來知道何時發佈所有已發佈的消息。 – Jeppedy