MQTT クライアント
外部 IIoT broker (HiveMQ / Mosquitto / EMQX / AWS IoT / Azure IoT Hub など) の topic に ゲートウェイが クライアントとして outbound 接続 し、subscribe / publish します。到着したメッセージは in-memory キャッシュに保存され、タグの収集周期ごとにキャッシュ値が読み出されます。
| 状況 | どのモードを使うか |
|---|---|
| 外部 IT システムが REST POST で値を送ってくる場合 | HTTP プッシュ |
| 外部サーバーが WebSocket で push する場合 | WebSocket クライアント |
| 外部 IIoT MQTT broker が topic で push する場合 | MQTT クライアント (このページ) |
| Sparkplug B 標準 (NBIRTH/DBIRTH/DCMD) | Sparkplug B |
| 社内 PLC の値を直接読む場合 | Modbus / OPC-UA など |
登録フォームの入力値
| 入力欄 | 記入内容 | 例 |
|---|---|---|
| IP アドレス | MQTT broker ホスト | broker.hivemq.com, 10.0.0.50 |
| ポート | MQTT broker ポート (平文 1883、TLS 8883) | 1883, 8883 |
| USERNAME | broker 認証ユーザー名 (オプション) | iotuser |
| PASSWORD | broker 認証パスワード (オプション) | s3cret |
| TLS | 平文 / TLS の選択 | false (tcp) / true (ssl) |
| QoS | subscribe / publish QoS | 0 / 1 / 2 |
| KEEP ALIVE | keep-alive 周期 (秒) | 60 |
| CLEAN SESSION | clean session フラグ | true (既定) / false |
| CLIENT ID | 明示的な client id (オプション) | edge-plant-01 |
| 収集周期 | キャッシュされた値をゲートウェイが読み出す周期 (ms) | 1000 |
実際の broker URL: <scheme>://<host>:<port> (例: tcp://broker.hivemq.com:1883,
ssl://10.0.0.50:8883)。
CLIENT ID を指定しない場合は PP-<opc_id>-<random6> 形式で自動生成されます (MQTT v3.1 の
23 文字推奨長の範囲内)。
タグの PLC アドレス表記 — 4-mode JSON
タグの PLC アドレス = MQTT topic + 4-mode JSON デコーダ。WebSocket / Apache Kafka と同一の spec です。
| モード | 形式 | 動作 |
|---|---|---|
| SCALAR | factory/line1/temp または factory/line1/temp.value | メッセージ全体を String として扱う。メッセージが JSON object の場合は raw フォールバック。 |
| KEY | sensors/multi:temperature | top-level JSON key の値 (例: {"temperature":25.3,"humidity":60} → 25.3) |
| PATH | sensors/multi:$.data.tags.T1 | JSON Pointer による動的 evaluate (ネストした key に対応) |
| RAW | sensors/multi:_raw_ | 最後のメッセージ全体 (デバッグ用) |
Wildcard subscribe にも対応:
| タグの PLC アドレス | 意味 |
|---|---|
device/+/status | 1 階層の wildcard (sensor01/sensor02/... すべて) |
factory/# | マルチ wildcard (factory 配下の全体 — 最後に到着したメッセージが優先) |
read の初回呼び出しは lazy subscribe です (空文字列を返します)。次の polling cycle からキャッシュ値が入ります。
よく使うケース
| ケース | 方法 |
|---|---|
| HiveMQ Cloud / public broker | host = broker.hivemq.com 1883 (平文)、8883 (TLS+認証) |
| 社内 Mosquitto / EMQX | host = 社内 IP、1883 / 8883。username/password を登録 |
| AWS IoT Core | host = <account>-ats.iot.<region>.amazonaws.com、8883 + X.509 (truststore の個別設定が必要) |
| Azure IoT Hub | host = <hub>.azure-devices.net、8883 + SAS トークン (username/password) |
| QoS=1 保証 | QoS=1 を選択 — broker が ack まで再送。処理コスト ↑ |
| 永続セッション | CLEAN SESSION=false + 固定 CLIENT ID — broker が未受信メッセージを保管 |
write (publish)
タグページまたは REST API から値を 書き込む と、broker の該当 topic へ即時 publish されます (retain=false)。value の String がそのまま payload として送信されます — JSON / 平文のいずれも可能です。
plc_address = factory/line1/cmd
value = ON
→ MQTT publish: topic="factory/line1/cmd" payload="ON"
plc_address = devices/dev01/setpoint
value = {"sp":42.5,"unit":"degC"}
→ MQTT publish: topic="devices/dev01/setpoint" payload='{"sp":42.5,"unit":"degC"}'
よくある問題と解決
| 症状 | 原因 | 解決 |
|---|---|---|
| 値が入ってこない | broker がメッセージを publish していない | mosquitto_sub -h <host> -p 1883 -t '<topic>' -v で直接受信し、行が出力されるか確認 |
[MQTT] connect 실패: not authorized | username/password の誤り | broker のユーザー/パスワードを再確認。ACL 制限を確認 |
[MQTT] connect 실패: timeout | ファイアウォール / ポート閉塞 | telnet <host> 1883、openssl s_client -connect <host>:8883 で検証 |
| TLS ハンドシェイク失敗 | 自己署名 / cacerts の不足 | 運用では正式な証明書の使用を推奨。暫定対応の場合はシステム管理者に truststore 追加を依頼 |
| Wildcard が一度しか入ってこない | wildcard は最後に到着したメッセージが優先 | トピックごとに分けて登録 (各トピックに個別のタグ) |
さらに詳しい技術文書
- 高度 — ドライバ: MQTT クライアント
- Sparkplug B (MQTT + 標準 NBIRTH/DBIRTH/DCMD ペイロード)
- Eclipse Paho 公式ドキュメント