# MQTT 保持メッセージ

通常、出版者がトピックにメッセージを公開し、そのトピックに誰も登録していない場合、メッセージはブローカーによって単に破棄されます。

出版者は、保持メッセージフラグを設定することによって、そのトピックに関する最後のメッセージをブローカーに保持させるよう指示することができます。

この機能は非常に便利です。たとえば、状態が変化したときにのみその状態を公開するセンサー（例：ドアセンサー）がある場合、新しい購読者がこの状態に購読した場合はどうなるでしょうか？

保持されたメッセージがなければ、購読者はメッセージを受け取る前にステータスが変更されるのを待たなければならないでしょう。

しかし、保持されたメッセージにより、加入者はセンサーの現在の状態を確認できます。

重要なのは、トピックごとに1つのメッセージだけが保持されるということです。

そのトピックについて次に公開されるメッセージは、そのトピックの最後の保持メッセージを置き換えます。

## MQTT 保持メッセージの例の概要

このチュートリアルでは、Pythonスクリプトを使用してメッセージの公開と購読を行います。

その後、さまざまなフラグとQOS 設定で保持メッセージがどのように機能するかを調査します。

> 重要な点は、クライアントが購読する前にメッセージを公開することです。

混乱を避けるために、クリーンなセッションを使用していることもご留意ください。

クリーンセッションを使用しない場合、保存されているが保持されていないメッセージが表示されることがあります！

基本的なプロセスは次のとおりです：

1. トピックにメッセージを公開し、保持メッセージフラグを設定しないでください
2. トピックに関するメッセージを購読する
3. メッセージを監視し、結果を分析する

私たちは複数のメッセージを公開する方法と、保持されたメッセージを削除または削除する方法についても見ていきます。

以下のスクリーンショットを参照してください：

例 1 - メッセージ保持フラグが設定されておらず、新しいサブスクライバーはメッセージを受け取りません。つまり、メッセージは受信されません。

例 2 - メッセージフラグを保持し、新しいサブスクライバーは受信したメッセージに示される最後のメッセージを受け取ります。

例 3 - メッセージフラグを保持し、いくつかのメッセージOFF、OFF2、OFF3を公開します。しかし、新しいサブスクライバーは最後のメッセージOFF3のみを受け取ります。

[![retain-message-1](https://github.com/Fubo-Group/docs/raw/main/images/retain-message-1.jpg)](https://github.com/Fubo-Group/docs/blob/main/images/retain-message-1.jpg)

### QOS 設定と保持メッセージと保持メッセージの削除

以下のスクリーンショットは、QOS 効果を示すための4つの接続例を示しており、その後で保持メッセージを削除する方法を説明しています。

例 1：QOSを0に設定して、QOS 設定が効果があるかどうかを確認します。保持されたメッセージがまだ受信されており、公開されたメッセージのQOSには影響がないことがわかります。

例 2：保持されたメッセージを保持メッセージフラグをFalseに設定して削除しようとします。しかし、メッセージがまだ保持されていることに気づきます。

例 3：メッセージを空白に設定しますが、保持メッセージフラグはFalseのままにします。再び、メッセージは保持されます。

例 4：最後にメッセージを空白に設定し、保持フラグを `true` に設定して、保持されたメッセージをクリアします。

[![retain-message-2](https://github.com/Fubo-Group/docs/raw/main/images/retain-message-2.jpg)](https://github.com/Fubo-Group/docs/blob/main/images/retain-message-2.jpg)

以下の表は、QOS、クリーンセッションフラグ、および保持メッセージフラグがトピックの新しいサブスクライバーによって受信されるメッセージにどのように影響するかを示す要約です。

[![mqtt-qos-retain-clean-session-table](https://github.com/Fubo-Group/docs/raw/main/images/MQTT-qos-retain-clean-session-table.jpg)](https://github.com/Fubo-Group/docs/blob/main/images/MQTT-qos-retain-clean-session-table.jpg)

> 注意：retainフラグの扱い方の一部は、ブローカーの実装に依存します。

## &#x20;ソーステキスト: Pythonコード 翻訳テキスト:

公開するためのコードで、保持フラグが設定されています：

```
client.publish(“bulb1”,”test message “,qos=0,retain=True)
```

&#x20;どこで：

```
topic=bulb
nessage =test mesage
QOS=0
Reatained message Flag=True
```

## 検出された保持メッセージ

トピックを購読すると、保持されているメッセージがある場合、そのメッセージはクライアントに配信されます。

クライアントは、以下のコードスニペットに示されているように、on messageコールバックのmessage.retainフラグを調つことで、それが保持メッセージであることを検出できます。

```python
def on_message(client, userdata, message):
    print("message received  ",str(message.payload.decode("utf-8")),\
          "topic",message.topic,"retained ",message.retain)
    if message.retain==1:
        print("This is a retained message")
```

## &#x20;台本

私は、一連のトピックに保持されているメッセージをクリアし、保持メッセージがあるトピックについて報告するPythonスクリプトを作成しました。

&#x20;ダウンロード

## 一般的な質問と回答

**Q: 保持されたメッセージを削除するにはどうすればいいですか？ Translation Text:**

* A: 保持フラグをtrueに設定して空のメッセージを公開し、保持されたメッセージをクリアします。

**Q: メッセージのQOSは保持されたメッセージに影響を与えますか？**

* A: いいえ、違います。

**Q: メッセージが保持されているかどうかはどうすればわかりますか？ Translation Text:**

* A: トピックを購読して、保持フラグを調べるときにのみわかります。
* 質問: トピックを購読して保持メッセージを受け取った場合、ブローカー/サーバーはそのメッセージを削除しますか？
* A: いいえ、保持され、新しいクライアントが登録するときに設定されます。
* Q: Fuboで保持されているメッセージをすべて削除またはクリアするにはどうすればいいですか？
* A：永続データベースを使用していない場合、もっとも簡単な方法は、mosquittoを停止して再起動することです。それ以外の場合は、すべてのトピックを購読して保持メッセージを確認およびクリアする必要があります。これには私のPythonスクリプトを使用できます。ただし、これは忙しいブローカーではお勧めできません。

## いつ保持メッセージを使用するか

通常、メッセージに永続的なデータが含まれている場合、保持フラグが設定されたメッセージを公開します。

たとえば、センサーはファームウェアのバージョン番号、IPアドレス、現在の状態など、自身に関する情報を公開することができます。

この情報は変更される可能性が低いため、retainフラグを使用して一度だけ公開する必要があります。そうすれば、新しいクライアントはその情報を取得できます。

## 保持メッセージをデータストアとして使用する

私は、保持されたメッセージがデータストアとして使用されているアプリケーションを見たことがあります。

もし私のホームアシスタントとMQTTに関するチュートリアルを見ていただければ、その動作を確認できます。

可能であることは認識していますが、例えば誰かがクリーンアップの一環として保持されているメッセージを削除した場合の結果を考慮する必要があります。

## 保持メッセージ形式の提案

保持されたメッセージがセミ永続的/永続的なデータストアとして使用されているため、実際のメッセージペイロードと一環して追加情報を公開することが私の意見では有用です。

最低限、タイムスタンプと削除許可フラグを公開する必要があります。そうすれば私たちは

```
{"payload":payload,"timestamp":timestamp,"delete_allowed":True/False}
```

削除ユーティリティはこれらをチェックし、非常に古いメッセージを削除することができますが、削除してはならないメッセージは削除しません。

## &#x20;要約

保持メッセージ機能は、オブジェクトの最後の状態を保持するための便利な機能であり、状態が頻繁に変わらない場合に特に便利です。

サービス品質の設定は保持メッセージに影響しません。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.fubogroup.com/natopikku/mqtt-messji.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
