MQTT 保持メッセージ
通常、出版者がトピックにメッセージを公開し、そのトピックに誰も登録していない場合、メッセージはブローカーによって単に破棄されます。
出版者は、保持メッセージフラグを設定することによって、そのトピックに関する最後のメッセージをブローカーに保持させるよう指示することができます。
この機能は非常に便利です。たとえば、状態が変化したときにのみその状態を公開するセンサー(例:ドアセンサー)がある場合、新しい購読者がこの状態に購読した場合はどうなるでしょうか?
保持されたメッセージがなければ、購読者はメッセージを受け取る前にステータスが変更されるのを待たなければならないでしょう。
しかし、保持されたメッセージにより、加入者はセンサーの現在の状態を確認できます。
重要なのは、トピックごとに1つのメッセージだけが保持されるということです。
そのトピックについて次に公開されるメッセージは、そのトピックの最後の保持メッセージを置き換えます。
MQTT 保持メッセージの例の概要
このチュートリアルでは、Pythonスクリプトを使用してメッセージの公開と購読を行います。
その後、さまざまなフラグとQOS 設定で保持メッセージがどのように機能するかを調査します。
重要な点は、クライアントが購読する前にメッセージを公開することです。
混乱を避けるために、クリーンなセッションを使用していることもご留意ください。
クリーンセッションを使用しない場合、保存されているが保持されていないメッセージが表示されることがあります!
基本的なプロセスは次のとおりです:
トピックにメッセージを公開し、保持メッセージフラグを設定しないでください
トピックに関するメッセージを購読する
メッセージを監視し、結果を分析する
私たちは複数のメッセージを公開する方法と、保持されたメッセージを削除または削除する方法についても見ていきます。
以下のスクリーンショットを参照してください:
例 1 - メッセージ保持フラグが設定されておらず、新しいサブスクライバーはメッセージを受け取りません。つまり、メッセージは受信されません。
例 2 - メッセージフラグを保持し、新しいサブスクライバーは受信したメッセージに示される最後のメッセージを受け取ります。
例 3 - メッセージフラグを保持し、いくつかのメッセージOFF、OFF2、OFF3を公開します。しかし、新しいサブスクライバーは最後のメッセージOFF3のみを受け取ります。
QOS 設定と保持メッセージと保持メッセージの削除
以下のスクリーンショットは、QOS 効果を示すための4つの接続例を示しており、その後で保持メッセージを削除する方法を説明しています。
例 1:QOSを0に設定して、QOS 設定が効果があるかどうかを確認します。保持されたメッセージがまだ受信されており、公開されたメッセージのQOSには影響がないことがわかります。
例 2:保持されたメッセージを保持メッセージフラグをFalseに設定して削除しようとします。しかし、メッセージがまだ保持されていることに気づきます。
例 3:メッセージを空白に設定しますが、保持メッセージフラグはFalseのままにします。再び、メッセージは保持されます。
例 4:最後にメッセージを空白に設定し、保持フラグを true
に設定して、保持されたメッセージをクリアします。
以下の表は、QOS、クリーンセッションフラグ、および保持メッセージフラグがトピックの新しいサブスクライバーによって受信されるメッセージにどのように影響するかを示す要約です。
注意:retainフラグの扱い方の一部は、ブローカーの実装に依存します。
ソーステキスト: Pythonコード 翻訳テキスト:
公開するためのコードで、保持フラグが設定されています:
どこで:
検出された保持メッセージ
トピックを購読すると、保持されているメッセージがある場合、そのメッセージはクライアントに配信されます。
クライアントは、以下のコードスニペットに示されているように、on messageコールバックのmessage.retainフラグを調つことで、それが保持メッセージであることを検出できます。
台本
私は、一連のトピックに保持されているメッセージをクリアし、保持メッセージがあるトピックについて報告するPythonスクリプトを作成しました。
ダウンロード
一般的な質問と回答
Q: 保持されたメッセージを削除するにはどうすればいいですか? Translation Text:
A: 保持フラグをtrueに設定して空のメッセージを公開し、保持されたメッセージをクリアします。
Q: メッセージのQOSは保持されたメッセージに影響を与えますか?
A: いいえ、違います。
Q: メッセージが保持されているかどうかはどうすればわかりますか? Translation Text:
A: トピックを購読して、保持フラグを調べるときにのみわかります。
質問: トピックを購読して保持メッセージを受け取った場合、ブローカー/サーバーはそのメッセージを削除しますか?
A: いいえ、保持され、新しいクライアントが登録するときに設定されます。
Q: Fuboで保持されているメッセージをすべて削除またはクリアするにはどうすればいいですか?
A:永続データベースを使用していない場合、もっとも簡単な方法は、mosquittoを停止して再起動することです。それ以外の場合は、すべてのトピックを購読して保持メッセージを確認およびクリアする必要があります。これには私のPythonスクリプトを使用できます。ただし、これは忙しいブローカーではお勧めできません。
いつ保持メッセージを使用するか
通常、メッセージに永続的なデータが含まれている場合、保持フラグが設定されたメッセージを公開します。
たとえば、センサーはファームウェアのバージョン番号、IPアドレス、現在の状態など、自身に関する情報を公開することができます。
この情報は変更される可能性が低いため、retainフラグを使用して一度だけ公開する必要があります。そうすれば、新しいクライアントはその情報を取得できます。
保持メッセージをデータストアとして使用する
私は、保持されたメッセージがデータストアとして使用されているアプリケーションを見たことがあります。
もし私のホームアシスタントとMQTTに関するチュートリアルを見ていただければ、その動作を確認できます。
可能であることは認識していますが、例えば誰かがクリーンアップの一環として保持されているメッセージを削除した場合の結果を考慮する必要があります。
保持メッセージ形式の提案
保持されたメッセージがセミ永続的/永続的なデータストアとして使用されているため、実際のメッセージペイロードと一環して追加情報を公開することが私の意見では有用です。
最低限、タイムスタンプと削除許可フラグを公開する必要があります。そうすれば私たちは
削除ユーティリティはこれらをチェックし、非常に古いメッセージを削除することができますが、削除してはならないメッセージは削除しません。
要約
保持メッセージ機能は、オブジェクトの最後の状態を保持するための便利な機能であり、状態が頻繁に変わらない場合に特に便利です。
サービス品質の設定は保持メッセージに影響しません。
Last updated