2017-02-25 143 views
1

要するに、うまく機能するPaho/MQTTサンプルセットがありますが、エラーの検出に問題があります。具体的には、私はon_connectコールバックを取得していないし、無効なUserID/Pswdの組み合わせが与えられたとき、それは黙って失敗する。 実際、すべての兆候によって、すべて正常に機能しました!Python Paho/MQTT:接続エラーの検出

私は間違っていますか?ユーザーIDまたは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() 

出力:

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

は、それはいくつかの異なる問題だったことが判明します。

  • 最初に、Connectは真に接続せずに戻ります。 Connectコールバックが受信されるまで、Sleepで待機ループを追加することは非常に重要です。コールバックだけが、Connectが成功したか失敗したかを示します。
  • 第2に、リターンコードを見た後、私は自分のプロトコルバージョンの不一致に失敗しているのを見ました。私のPiが引っ張っていたMosquitto版は、本当に古いものでした。私のシステムに新しいバージョンを指摘した記事を見つけました。バージョンの不一致の問題を解決しました。
  • 第3に、Connectが機能しない前に "loop_start()"を追加します。直感的な場所は適切な場所ではありません。
  • 第4に、Disconnectの前にSleep()呼び出しを追加する必要があります。そうしないと、すべてのコールバックが表示されません。

最終段階では、ドキュメントにAPIの使用方法が示されていますが、本番用に堅牢なプログラムを作成する方法は説明していません。

ブラインドスリープコールを使用するのではなく、すべての機内パブリッシュコールがいつクリアされたかを知る方法を探していますが、私の元の問題は解決されています。

0

mqtt CONNECTパケットを送信すると、CONNACK応答を受け取る必要があります。この応答は以下のコード
0が含まれている - 成功、接続が
1を受け入れた - 接続は拒否し、不正なプロトコル
2 - 拒否し、クライアントIDエラー
3 - 拒否し、サービス利用不能 4 - 拒否し、不正なユーザ名またはパスワード
5 - 拒否されました。許可されていません
あなたの回答はです。しかし、それはゼロです。ブローカーがクレデンシャルをチェックしていない可能性がありますので、メッセージが受け入れられます。クライアントは正常に見えます。

+0

注意1)私は接続応答を全く見ていませんでした。2)QOSを '0'にしていました。 接続は決して成功していませんでした。私は火災と忘れてしまったので、RCは常に ' 0 'である。 QOSレベルを上げると、メッセージの送信エラーが発生しました。また、コールバックを正常に処理すると、接続エラーが「1」(古いMosquittoバージョンは3.11クライアント・プロトコル・バージョンをサポートしていませんでした)というメッセージが表示されました。 – Jeppedy

0

は、このように、この

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

ようwhileループにpublishを配置しようとするとプログラムが終了する前に、コールバック関数を実行することができます。

+0

MQTTの新機能ですが、同じメッセージ。 "sth"とは何ですか? 答えは、それを実現するためのon_publishを探しているようです。 – Jeppedy

+0

ここで、 'publish'を' while'ループに入れないと、プログラムはコールバック関数がトリガされる前に終了します。 'sth'は、ループを制御するのに役立つ任意の条件を意味します。実際に私は同じ状況に遭遇しましたが、解決策についてはっきりと考えることができないことを思い出しました。私はあなたが試してみることをお勧めします。 – LuCima

+0

合意。私の答えの4番目の点を参照してください。現在私はスリープを使用していますが、公開されたすべてのメッセージがいつ処理されたかを知るために、より堅牢で正確な方法が大好きです。 – Jeppedy

関連する問題