# MQTT (/ja/docs/requests/mqtt)

MQTTリクエストは、ブローカーに接続し、トピックフィルタをサブスクライブし、メッセージをパブリッシュします。作業中は接続したままで、ログには追跡しているトピックのすべてのメッセージが表示されます。
EcholotはMQTT 3.1.1と5.0に対応しています。

<Shot id="requests-mqtt-log" alt="ローカルのブローカーに接続したRealtime › Warehouse sensors：QoS 1でwarehouses/+/temperatureをサブスクライブしたタブと、トピックごとの温度の値が並ぶメッセージログ" />

<Callout title="Alpenglowで試す">
  **Realtime › Warehouse sensors**は、ドキュメントリポジトリの`examples/servers`フォルダにある`localhost`のローカルブローカーに接続します（`bun run realtime`）。
</Callout>

## 接続する [#connect]

1. <strong>ファイル › 新規MQTTリクエスト</strong>を選ぶか、サイドバーの<strong>リクエスト</strong>の横にある<strong>+</strong>メニューから<strong>新規MQTTリクエスト</strong>を選びます。
2. ブローカーのアドレスを入力します。
3. アドレスの前にある**MQTT**バッジのメニューでプロトコルを選びます：**MQTT 5.0**（デフォルト）または**MQTT 3.1.1**。
4. **接続**（<kbd>⌘</kbd><kbd>R</kbd>）を選びます。接続中は**接続解除**と表示されます。

| アドレス | 接続方法 | デフォルトのポート |
| --- | --- | --- |
| `mqtt://broker` | TCP | 1883 |
| `mqtts://broker` | TLS | 8883 |
| `ws://broker` | WebSocket。アドレスにパスがなければ`/mqtt` | ほかの`ws://`アドレスと同じ |
| `wss://broker` | TLS上のWebSocket。アドレスにパスがなければ`/mqtt` | ほかの`wss://`アドレスと同じ |

アドレスには`{{variables}}`が使えます。Alpenglowのセンサーのリクエストは`mqtt://{{mqttHost}}`を使っています。

エディタのタブは次のとおりです：**ドキュメント**、**サブスクライブ**、**パブリッシュ**、**接続**、**認証**、**変数**、**テスト**、**スクリプト**、**設定**。
TLSの検証、プロキシ、証明書などの設定は、[HTTPリクエスト](/docs/requests/settings)と同じように適用されます。

## ユーザー名とパスワード [#user-name-and-password]

MQTTのユーザー名とパスワードは、**認証**タブにあるリクエストの**Basic**認証です。パスワードは[シークレット変数](/docs/workspaces/secrets)（`{{mqttPassword}}`など）に入れると、
キーチェーンに保存され、リクエストファイルには残りません。ほかの認証と同じく、フォルダやワークスペースに一度設定することもできます。ほかの種類の認証はMQTTには適用されません。

## 接続 [#the-connection]

**接続**タブには、CONNECTのそのほかの項目があります：

| フィールド | 内容 |
| --- | --- |
| **クライアントID** | クライアントのID。`{{variables}}`が使えます。空にすると`echolot-`とランダムな接尾辞が使われます |
| **クリーンスタート**（5.0）または**クリーンセッション**（3.1.1） | このクライアントIDのためにブローカーが保持していたサブスクリプションとメッセージを使わずに開始します。デフォルトでオン |
| **キープアライブ** | pingの間隔（秒）。0で無効。デフォルトは60 |
| **Will** | **接続が切れたときにWillメッセージをパブリッシュ**。**Willトピック**、**Willペイロード**、QoS、**Retain**を指定します。このクライアントが挨拶なしに去ったときに、ブローカーがパブリッシュするメッセージです |

## サブスクライブ [#subscribe]

**サブスクライブ**タブには、リクエストがサブスクライブするトピックフィルタが一覧されます：

1. 下の欄にフィルタを入力します。たとえば`warehouses/+/temperature`です。`+`は1階層に、`#`は残りすべてに一致します（`logs/#`など）。
2. **QoS 0**、**QoS 1**、**QoS 2**のいずれかを選びます。
3. 一度だけサブスクライブするには<strong>サブスクライブ</strong>を、フィルタをリクエストとともに保存するには<strong>+</strong>を選びます。

**接続時にサブスクライブ**にチェックを入れた保存済みのフィルタは、リクエストが接続するたびにサブスクライブされます。アプリ内でも、実行時も、コマンドラインからも、エージェントでも同様です。
接続中は、保存した各フィルタに**サブスクライブ**と**サブスクライブ解除**のボタンが表示されます。MQTT 5.0では、**No Local**を使うと、このクライアント自身がパブリッシュしたメッセージが除外されます。

## パブリッシュ [#publish]

**パブリッシュ**タブでは、メッセージを送信します：

1. トピックとペイロードを入力します。どちらにも`{{variables}}`が使えます。
2. QoSを選び、ブローカーに後からサブスクライブする人のためにメッセージを保持してもらうには**Retain**にチェックを入れます。
3. **パブリッシュ**を選びます。

メッセージをリクエストとともに保存するには、<strong>+</strong>を選びます。<strong>実行時にパブリッシュ</strong>にチェックを入れた保存済みのメッセージは、リクエストがあなたの操作なしに実行されるとき、順番にパブリッシュされます。
[ランナー](/docs/requests/runner)とコマンドラインは、接続し、有効なフィルタをサブスクライブし、有効なメッセージをパブリッシュし、10秒間待ち受けて、閉じます。

## メッセージログ [#the-message-log]

レスポンスペインの**メッセージ**タブには、セッションが表示されます。受信したメッセージとパブリッシュしたメッセージ、サブスクリプション、ブローカーの確認応答が、新しいものが最後に、それぞれ時刻とサイズ付きで並びます。

- メッセージには、トピック、QoS、保持されていたかどうか、パケットIDが表示されます。
- **すべてのトピック**で、ログを1つのトピックに絞り込めます。
- **すべて**、**送信**、**受信**で方向によって絞り込み、**メッセージをフィルタ**でテキストからメッセージを探せます。
- **その他**は、JSONのペイロードを整形して表示します。
- 最初の行には、どのクライアントIDがどのプロトコルで接続したか、ブローカーが以前のセッションを保持していたかどうかが表示されます。ブローカーが接続を切ったときは、MQTTの理由コード付きで、その理由がログに表示されます。

QoS 1と2の配信の確認応答は、どちらの方向も自動で行われます。

接続が閉じると、セッションはログをレスポンスのボディとして[履歴](/docs/workspaces/history)に保存されるので、**ボディ**に対するチェックを使えます。

## MQTT 5.0 [#mqtt-50]

ブローカーの理由コードは、`Success`や`Not authorized`のように、ログと、接続が拒否されたときに名前で表示されます。これは両方のバージョンで同じです。**MQTT 5.0**を選んだ場合：

- サブスクリプションの**No Local**は、このクライアント自身のメッセージを除外します。
- **クリーンスタート**は、3.1.1の**クリーンセッション**に代わります。
- 保存したメッセージにはコンテンツタイプ（リクエストファイルの`content-type`）を付けられ、Content Typeプロパティとして送信されます。

## コマンドラインから [#from-the-command-line]

`echolot mqtt subscribe`と`echolot mqtt publish`は、パスワードを`ECHOLOT_MQTT_PASSWORD`に入れて、ターミナルからブローカーと通信します。[echolot mqtt](/docs/cli/mqtt)を参照してください。
