# MQTT ブローカー

> ステーション自身の MQTT ブローカーです。「通信」欄の行、オンとオフ、ポートと接続中の機器、クライアントの認証、MQTT ドライバーに渡すエントリ「このステーション」、そしてしないことです。

**MQTT ブローカー** は、ネットワーク上の機器の MQTT メッセージを受け取ります。そのため試験台や小さな研究室でも、専用のブローカーを入れずに ESP32 のボード、ゲートウェイ、センサーを読み取れます。「サーバー」フォルダーの 3 行目で、[Modbus サーバー](connector-modbus-server) のあとにあります。ドライバーではありません。機器のほうがここに接続して発行し、ステーションは発行された内容を、ほかのブローカーと同じように [MQTT ドライバー](driver-mqtt) で読み取ります。パネルは表題の下にそう書いています。「ネットワーク上の機器の MQTT メッセージを受け取るので、機器ごとにブローカーを用意する必要はありません。接続を受けるだけで、自分からは接続しません。」Connector を表示できる人はこのページを読め、構成できる人は変更できます。

## 欄の中の行 {#the-row-in-the-column}

行は「通信」欄のツリーの「サーバー」フォルダーにあり、Modbus サーバーの下に、ドライバーがプラグを見せる位置にハブのアイコンを付けて並びます。ステーションにはちょうど 1 つあり、作ることも削除することもありません。検索ボックスは名前でこれを見つけ、状態チップは状態で分けます。オフの間はオフに、ポートが使用中か待ち受けられなかった間は問題ありに、それ以外は正常に入ります。名前の横にはブローカーがしていることが表示され、ドットがそれをまとめます。

| 行の表示 | ドット | いつ |
| --- | --- | --- |
| 「オフ」 | 灰色 | ブローカーはオフです。どのステーションもこの状態で始まります。 |
| 「ポート 1883 で待ち受け中」、続いて接続中の機器の数。「接続中のクライアントはありません」「1 台のクライアントが接続中」「3 台のクライアントが接続中」 | 緑 | ブローカーがオンでランタイムが動いています。ポートは開いています。 |
| 「ポート 1883 は使用中です」 | 赤 | ブローカーはオンですが、別のプログラムがポートを使っています。 |
| 「ポート 1883 で待ち受けできませんでした」 | 赤 | ブローカーはオンですが、Windows がほかの理由でポートを開くのを拒みました。 |
| 「ランタイム停止中」 | 灰色 | ブローカーはオンですが、ランタイムが止まっています。ランタイムがまた動くまでポートは閉じたままです。 |

ドットはブローカーだけのものです。ドライバーのフォルダーの集計にもステータスバーにも入りません。そちらはステーションが読む設備についての表示だからです。

## オンとオフ {#turning-it-on-and-off}

| コマンド | すること | 灰色になるとき |
| --- | --- | --- |
| **有効化** | ブローカーをオンにします。「ブローカーをオンにします。ランタイムの動作中はポート 1883 で待ち受け、このステーションがブローカーを読み取るためのエントリが MQTT ドライバーに追加されます。」操作ログ帯には「MQTT ブローカーをオンにしました。」と出ます。 | ブローカーがすでにオン(「ブローカーはすでにオンです。」)のとき、実行記録がステーションを押さえているとき、ランタイムが止まっているとき。 |
| **無効化** | ブローカーをオフにします。「ブローカーをオフにします。ポートを閉じ、すべてのクライアントを切断します。」操作ログ帯には「MQTT ブローカーをオフにしました。」と出ます。 | ブローカーがすでにオフ(「ブローカーはすでにオフです。」)のとき、実行記録がステーションを押さえているとき、ランタイムが止まっているとき。 |

Connector を構成できないロールには、この 2 つのコマンドは描かれません。オンであることはステーションが保持する設定で、待ち受けはランタイムに従います。ブローカーはランタイムが動き出すとポートを開き、ランタイムが止まるとポートを閉じてすべての機器を切断し、ランタイムが戻るとまた開きます。開けないポートはブローカー自身の状態として行とポート欄の下に表示され、ステーションはそれなしで動き続けます。

## ポートとクライアントのカード {#the-port-and-clients-card}

| 欄 | すること | 値と既定 |
| --- | --- | --- |
| **TCP ポート** | ブローカーが待ち受けるポートです。このコンピューターのすべてのアドレス、IPv4 と IPv6 で、TLS なしで待ち受けます。待ち受け中に変えると古いポートを閉じて新しいポートを開くので、すべての機器が切断されます。操作ログ帯には「MQTT ブローカーをポート 1884 に移しました。」と出ます。 | 1 から 65535。既定は 1883 で、TLS なしの MQTT のポートです。 |
| **接続中のクライアント** | いま接続している機器の数です。接続中の機器があれば、表が 1 台ずつ **クライアント ID**、**クライアントのアドレス**(IP アドレスとポート)、**接続時刻** を示します。 | 読み取り専用。 |

ブローカーが移れないポートは、何かを保存する前に拒まれ、欄の下に理由が出て、欄は有効なポートに戻ります。範囲外の数(「ポートは 1 から 65535 の間にしてください。」)、Web サーバー、エージェントアクセス、OPC UA サーバー、[Modbus サーバー](connector-modbus-server) のポート(「ポート N はすでに Modbus サーバーが使っています。別のポートを選ぶか、先に Modbus サーバーを移してください。」)、そして別のプログラムが使っているポート(「ポート N はこのコンピューターで使用中です。使っているものを閉じるか、別のポートを選んでください。」)です。ステーションのほかのポート欄も、同じようにブローカーのポートを拒みます。「ポート N はすでに MQTT ブローカーが使っています。別のポートを選ぶか、先に MQTT ブローカーを移してください。」

カードの下には注記があります。「TLS なし: 機器はプレーンな MQTT で接続し、同時に 100 台までです。ほかのコンピューターがこのブローカーに届くのは、Windows ファイアウォールが TCP ポート 1883 の受信を許可している場合だけです。許可するかどうかは利用者が決めることで、このステーションが自分で許可することはありません。保持メッセージはステーションが再起動するまで残ります。」

同時に接続できる機器は、ステーション自身のセッションを含めて 100 台までです。それを超える 1 台は、割り当て超過を示す MQTT の理由で拒まれます。自分のクライアント ID で接続し直した機器は、前の場所を取り戻します。保持メッセージはメモリに置かれます。ランタイムが止まってまた動き出したあとも戻りますが、ステーションが再起動すると消えます。

### Windows ファイアウォール {#windows-firewall}

ステーションが Windows ファイアウォールを自分で変えることはありません。注記の下で、ドットと一文が、ブローカー用のステーション自身の受信の規則がポートを通すかどうかを示します。「プライベートネットワークとドメインネットワークで、ポート 1883 への MQTT の受信接続を許可しています。」、「ポート 1883 を許可するこのアプリの規則がないため、ネットワーク上のクライアントが遮断される可能性があります。」、あるいはファイアウォールを管理できない起動、たとえば分離したプロファイルやインストールされたプログラムではないコピーでは「この起動方法では Windows ファイアウォールを操作できません。必要であれば、オペレーティングシステム側で受信を設定してください。」です。規則がない間だけ、**ローカルネットワークを許可** があなたの承認のもとで Windows に「Ganter Lab MQTT broker」という名前の規則を求めます。ポートへの受信の TCP、プライベートとドメインのネットワーク、ローカルのサブネット、このプログラムです。押すのはステーション自身のアプリからで(「ファイアウォールの規則は、ステーションのデスクトップアプリからのみ適用できます。」)、操作ログ帯には「MQTT のポート 1883 向けに、Windows ファイアウォールの許可を要求しています…」、続いて「Windows ファイアウォールは、ポート 1883 での MQTT 接続を許可しました。」と出ます。

## クライアントの認証 {#client-authentication}

**クライアントの認証** のカードが、誰が接続できるかを決めます。

| 選択 | 接続できる機器 |
| --- | --- |
| **匿名** | 「どの機器も、ユーザー名とパスワードの有無にかかわらず接続できます。」どのステーションもここから始まります。 |
| **ユーザー名とパスワード** | 「すべての機器が、下にある 1 組のユーザー名とパスワードでサインインします。」ほかのユーザー名やパスワードで来た機器は拒まれ、診断ログに記録されます。繰り返す失敗と同じようにまとめられます。 |

選択の下には **ユーザー名** とパスワードの欄があり、パスワードのラベルは保存されているかどうかだけを示します。**パスワード（保存済み）** か **パスワード（未保存）** です。保存されたパスワードがページに描き戻されることはありません。欄は空で始まり、「空のままにすると、保存済みのパスワードをそのまま使います。」選択、ユーザー名、パスワードは **適用** でまとめて適用されます。何も変わっていない間は灰色で(「適用するには、認証の設定を変更してください。」)、適用すると操作ログ帯に「MQTT ブローカーの認証を保存しました。」と出ます。ボタンの横の行が警告するとおり、「新しい認証で認められない接続中の機器は切断されます。」

| 入力 | 拒まれるときの文 |
| --- | --- |
| ユーザー名かパスワードが空のままユーザー名とパスワードを選んだ | 「ブローカーが求める前に、ユーザー名とパスワードを入力してください。」 |
| ユーザー名とパスワードが有効な間にユーザー名を消した | 「ブローカーはすべての機器にユーザー名を求めるため、空にはできません。消すには先に「匿名」を選んでください。」 |
| 128 文字を超えるユーザー名かパスワード | 「ユーザー名は 128 文字までです。」 |

匿名の間も、ユーザー名とパスワードは次の機会のために保存されたままです。パスワードは、ステーションが読むブローカーのパスワードと同じように、この Windows アカウント用に保護して保存されます。別のコンピューターや別のアカウントで開いたバックアップにはパスワードが含まれず、入力し直すまでどの機器もサインインできず、カードには「この Windows アカウントでは読み取れません。入力したコンピューターと Windows アカウントでしか開けないためです。ここでもう一度入力してください。」と出ます。

## このステーション {#this-station}

パネルの最後のカード **このステーション** は、ブローカーが MQTT ドライバーに渡すものを示します。「オンにすると、ブローカーは MQTT ドライバーの下にエントリ このステーション を作ります。このステーションは、ここに発行する機器をこのエントリ経由で、127.0.0.1 上でブローカーのポートと認証を使って読み取ります。それらの機器は、スキャンか手作業で このステーション の下に追加してください。ブローカーをオフにしても、このステーション とその機器は切断された状態でそのまま残ります。」

| とき | 起きること |
| --- | --- |
| ブローカーをオンにしたとき、ステーションにエントリがない | MQTT ドライバーがステーションに追加され、ブローカー **このステーション** が加わります。127.0.0.1、ブローカーのポート、TLS なし、有効で、認証がユーザー名とパスワードならブローカーのユーザー名とパスワードを持ちます。 |
| ポートか認証が変わったとき | エントリが追随します。ホスト、ポート、認証はブローカーのものになります。名前、クライアント ID、キープアライブ、有効かどうかは、あなたが決めたままです。エントリ自身のパネルには「このエントリは、このステーションが自身の MQTT ブローカー (サーバー、MQTT ブローカー) を読み取るためのものです。ホスト、ポート、認証はそのブローカーに従い、ブローカーがオンの間は残ります。」と出ます。 |
| ブローカーがオンの間 | エントリは削除できません。コマンドバー、右クリックのメニュー、ドライバーの表で **ブローカーを削除** は灰色のままで、「ブローカー「このステーション」は、このステーションが自身の MQTT ブローカーを読み取るためのものなので、そのブローカーがオンの間は残ります。先に「サーバー」で MQTT ブローカーをオフにしてください。」と示します。 |
| ブローカーをオフにしたとき | エントリとその機器は切断されたままその場に残ります。そこで削除すると、次にブローカーをオンにしたときにまた作られます。 |

エントリの下に何かが自動で加わることはありません。ブローカーに発行する機器は、ほかの [MQTT ドライバーのブローカー](driver-mqtt#the-broker) と同じく、ブローカーのスキャンか手作業で追加してください。ブローカーがオフの間、ステーション自身のセッションは試行の間隔を広げるので、ブローカーをオンにしてからエントリがオンラインになるまで最大 30 秒かかることがあります。このステーションにも、どのブローカーにもある[発行のカード](driver-mqtt#the-publish-card)があります。ステーションが自分のデータを自分のブローカーに発行するためのものです。

## エージェントアクセス {#agent-access}

| ツール | すること |
| --- | --- |
| `station_broker_status` | ブローカーを報告します。オンかオフか、ポート、状態、パスワードを除いた認証、接続中の機器、エントリ「このステーション」です。ランタイムが止まっていても使えます。 |
| `station_broker_configure` | パネルと同じ規則で、ブローカーをオンとオフにし、ポートを移し、認証を変えます。 |

どちらの名前も、ステーションが読むブローカーのツールである `mqtt_broker_` では始まりません。どちらもほかのすべてのツールと一緒に [ツール](agent-tools) で説明しています。

## しないこと {#what-it-does-not-do}

- TLS も WebSocket もありません。機器は TCP 上のプレーンな MQTT で接続します。
- ユーザー名とパスワードはすべての機器で 1 組だけで、機器ごとにはなりません。
- 永続セッションはなく、保持メッセージはステーションの再起動を越えて残りません。
- ステーションと一緒に止まります。ステーションがオフの間も発行し続ける機器には、専用のブローカーが必要です([ブローカーをインストールする](driver-mqtt#installing-a-broker))。
