メインコンテンツまでスキップ

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
USERNAMEbroker 認証ユーザー名 (オプション)iotuser
PASSWORDbroker 認証パスワード (オプション)s3cret
TLS平文 / TLS の選択false (tcp) / true (ssl)
QoSsubscribe / publish QoS0 / 1 / 2
KEEP ALIVEkeep-alive 周期 (秒)60
CLEAN SESSIONclean 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 です。

モード形式動作
SCALARfactory/line1/temp または factory/line1/temp.valueメッセージ全体を String として扱う。メッセージが JSON object の場合は raw フォールバック。
KEYsensors/multi:temperaturetop-level JSON key の値 (例: {"temperature":25.3,"humidity":60}25.3)
PATHsensors/multi:$.data.tags.T1JSON Pointer による動的 evaluate (ネストした key に対応)
RAWsensors/multi:_raw_最後のメッセージ全体 (デバッグ用)

Wildcard subscribe にも対応:

タグの PLC アドレス意味
device/+/status1 階層の wildcard (sensor01/sensor02/... すべて)
factory/#マルチ wildcard (factory 配下の全体 — 最後に到着したメッセージが優先)

read の初回呼び出しは lazy subscribe です (空文字列を返します)。次の polling cycle からキャッシュ値が入ります。


よく使うケース

ケース方法
HiveMQ Cloud / public brokerhost = broker.hivemq.com 1883 (平文)、8883 (TLS+認証)
社内 Mosquitto / EMQXhost = 社内 IP、1883 / 8883。username/password を登録
AWS IoT Corehost = <account>-ats.iot.<region>.amazonaws.com、8883 + X.509 (truststore の個別設定が必要)
Azure IoT Hubhost = <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 authorizedusername/password の誤りbroker のユーザー/パスワードを再確認。ACL 制限を確認
[MQTT] connect 실패: timeoutファイアウォール / ポート閉塞telnet <host> 1883openssl s_client -connect <host>:8883 で検証
TLS ハンドシェイク失敗自己署名 / cacerts の不足運用では正式な証明書の使用を推奨。暫定対応の場合はシステム管理者に truststore 追加を依頼
Wildcard が一度しか入ってこないwildcard は最後に到着したメッセージが優先トピックごとに分けて登録 (各トピックに個別のタグ)

さらに詳しい技術文書