2016-09-05 32 views
1

パブリッシャーとブローカーが別のシステムで作業しています。私はメッセージの配信にQOS = 2を使用しています。私はpython paho mqtt brokerを使用しています。 MQTTの拡張です。 - クライアントがまだ接続されているかどうかを確認する方法はありますか?paho mqttクライアントブローカ接続

1)メッセージを接続ブローカーに公開するときに、on_publish()コールバックを呼び出すことで私を認識します。ネットワークから別のマシンで実行中のブローカとの接続を切断すると、パブリッシャはローカルマシンにパブリッシュメッセージを格納し、ブローカをネットワークに接続すると、以前のすべてのメッセージをブローカにパブリッシュします。これらのメッセージが機内メッセージである場合、これらのメッセージは格納されていると思います。これらのメッセージは、機内メッセージに関するコードに何も含まれていないため、これらのメッセージの制限があります。

+0

という名前の永続クラスを登録できます。mqtt仕様に追加して、ソースコードhttps://github.com/eclipse/pahoを参照してください。 mqtt.c/blob/master/src/MQTTProtocolClient.c、行142、公開時にメッセージをローカルリストに格納します。 – Jackie

答えて

1

配信されていない(クライアントがPUBRELパケットを受信して​​いない)Mqttメッセージは、そのローカルセッション記憶領域に格納されます。 。同様に、サーバがPUBRELメッセージのPUBCOMP応答を受信しなかった場合、サーバはそのメッセージを未承認として扱い、関連するセッション状態をそのローカルセッション記憶領域に格納しなければならない。

両側(サーバーとクライアント)のキャッシュのサイズは、クライアントまたはサーバーの構成によって直接決定されます。これは、OASIS標準のセクション4.1の始めにある最初の非標準的なコメントに言及されています。

のQoS 2メッセージに対してこのプロセスの適切な説明(たまに混乱する場合)説明がありthe OASIS standard

+0

このローカルストレージは、クライアントが電源に常時接続されている場合にのみ存在し、クライアントが電源電圧から切断すると、すべてのデータが失われます。はいの場合は、これらのデータを格納する方法は何ですか?ブローカに再度クライアントが接続したときにブローカに送信しますか? –

+0

デバイスが切断されているときにストレージデータが失われていないことを確認してください。ある時点では、「まだ送信されていないメッセージを保存する」などの操作はできないため、メッセージの損失を受け入れる必要があります。 メッセージが送信されたが、確認プロセスが完了していない場合は、そのメッセージはサーバーのキャッシュに格納されている必要があります。 QoS 2メッセージの場合、少なくとも。しかし、メッセージが送信される前にネットワークが切断され、電源が切れてもデバイスに永続ストレージがない場合、メッセージは失われます。 –

+0

ありがとうございましたjeff、私はもう1つ質問があります。私のクライアントがブローカから予期せずに切断されたことを検出できる方法はありますか?私はmosquittoのpythonライブラリを使用しています。クライアントが切断後に再びブローカに接続したときに呼び出すon_disconnect()というコールバック関数があります。すぐに呼び出されません。もう1つの機能は、私がブローカをシャットダウンしたときにのみon_disconnect()を呼び出す関数です。ブローカをネットワークから切断するときにコールしません。 –

0

PAHO MQTT Pythonクライアントは、現在のディスクのバッファリングを提供していません。

Paho Javaクライアントの場合、デフォルトで、機内メッセージはメモリ(1)に保存されます。停電後のメッセージを保持するには、MqttDefaultFilePersistence(2

関連する問題