2016-03-19 8 views
0

私はこのコードを無期限に実行する必要がありますが、それはありません。クライアントの側から数時間ごとに停止し続けます(公開を停止し、ループは継続しますが、ブローカでは何も受信されません)。もう一度やり直すだけです。MQTTループ関数用のmax_packetsの適切な値

here私はループ機能のmax_packetsの数を増やすようにアドバイスされましたが、動作しておらず、クライアントは続行せずにランダムに公開をやめます。何をすべきか?私は1、3、5、50、1000の値を試しましたが、使用はありません。

コード:公開されているアプリケーションのメッセージ/サブスクライブに加えて

client = mqtt.Client() 
client.connect(address, 1883, 60) 

while True: 
    data = getdata() 
    client.publish("$ahmed/",data,0) 
    client.loop(timeout=1.0, max_packets = 1) # what should be the parameters here so it doesn't stop publishing? 
    time.sleep(0.2) 
+1

あなたは全くの加入者を言及していないような何か、どのようにあなたは何もブローカーに到着されていない知っていますか? – hardillb

+0

@hardillbああ私の悪いですが、ブローカーで実行されている私のコードは、メッセージが受信されるたびに印刷されるようにしています。 –

+1

max_packetsパラメータはもう使用されません。設定しないでください。 – ralight

答えて

2

、MQTTもハーフオープンTCP接続(1)の問題を回避するために、内部のキープアライブを持っています。キープアライブが送信されることを確認するのはクライアントの責任です。仕様に従って、ブローカはキープアライブを送信しないクライアントと、キープアライブの時間間隔の半分(他のメッセージがない場合)で切断します。

メッセージの送信に加えて、loop()*機能は、ブローカとクライアント間のこのキープアライブトラフィックフローも維持します。

ランダムな試行:whileループでloop()を呼び出す代わりに、loop_start()を1回試してみてください。例えば。

client = mqtt.Client() 
client.connect(address) 
#runs a thread in background to call loop function internally. 
#In addition, this also reconnects to broker on a lost connection. 
client.loop_start() 

while True: 
    data = getdata() 
    client.publish("$ahmed",data) 
client.loop_stop() 
+0

私はこのコードをテスト用に含めました。私はそれがうまくいく場合正解としてそ​​れを選ぶでしょう。 –

-1

ループが通過するたびにクライアントを接続するだけです。私はそれをテストしてブローカに接続しても、フローに大きな余分な遅延はありません。私はプログラムをもう一度やり直す必要があるので、クライアントをループに再接続するかもしれないので、私はそれを自分でやる必要はありません。これは私が思いつくことができる最も初期のアイデアです。問題なく動作しているようです。

client = mqtt.Client() 
client.connect(address, 1883, 60) 

while True: 
    client.connect(address, 1883, 60) # just let it reconnect every time it loops ;)! 
    data = getdata() 
    client.publish("$ahmed/",data,0) 
    client.loop(timeout=1.0, max_packets = 1) 
    time.sleep(0.2) 
+1

これを行うには、接続を行い、公開し、すべてを一度に切断する 'single'関数を使用します。https://eclipse.org/paho/clients/python/docs/#global-helper-functions – hardillb

+0

してくださいこれをしないでください。 – ralight

+0

@ralightあまり説明してもらえませんか? –

1

クライアントは切断されていますか?あなたのコードで

あなたは、クライアントがブローカーから切断されたときにと呼ばれるon_disconnect(client, userdata, rc)ようany callbackを処理していません。

def on_disconnect_handler(client, userdata, rc): 
    if rc != 0: 
     print("Unexpected disconnection.") 

client.on_disconnect = on_disconnect_handler 

またloop()return valueをチェックされていません。
戻り値は、成功したMQTT_ERR_SUCCESS。
エラーの場合は0を返します。

あなたが何をすべき

while True: 
    rc = client.loop(timeout=1.0) 
    if rc: 
     # handle loop error here 
関連する問題