MQTT-Client
Topics eines externen IIoT-Brokers (HiveMQ / Mosquitto / EMQX / AWS IoT / Azure IoT Hub usw.) werden vom Gateway per Outbound-Verbindung als Client abonniert bzw. beschrieben. Eintreffende Nachrichten werden in einem In-Memory-Cache abgelegt; im Erfassungsintervall des Tags wird der Cache-Wert ausgelesen.
| Situation | Welcher Modus |
|---|---|
| Externes IT-System sendet Werte per REST POST | HTTP-Push |
| Externer Server pusht per WebSocket | WebSocket-Client |
| Externer IIoT-MQTT-Broker pusht über Topics | MQTT-Client (diese Seite) |
| Sparkplug B-Standard (NBIRTH/DBIRTH/DCMD) | Sparkplug B |
| Werte werden direkt aus der werkseigenen PLC gelesen | Modbus / OPC-UA usw. |
Eingabefelder des Registrierungsformulars
| Eingabefeld | Was wird eingetragen | Beispiel |
|---|---|---|
| IP-Adresse | Host des MQTT-Brokers | broker.hivemq.com, 10.0.0.50 |
| Port | Port des MQTT-Brokers (unverschlüsselt 1883, TLS 8883) | 1883, 8883 |
| USERNAME | Benutzername für die Broker-Authentifizierung (optional) | iotuser |
| PASSWORD | Passwort für die Broker-Authentifizierung (optional) | s3cret |
| TLS | Auswahl unverschlüsselt / TLS | false (tcp) / true (ssl) |
| QoS | QoS für Subscribe / Publish | 0 / 1 / 2 |
| KEEP ALIVE | Keep-alive-Intervall (Sekunden) | 60 |
| CLEAN SESSION | Clean-Session-Flag | true (Standard) / false |
| CLIENT ID | Explizite Client-ID (optional) | edge-plant-01 |
| Erfassungsintervall | Intervall, in dem das Gateway den Cache-Wert ausliest (ms) | 1000 |
Tatsächliche Broker-URL: <scheme>://<host>:<port> (z. B. tcp://broker.hivemq.com:1883,
ssl://10.0.0.50:8883).
Ohne Angabe einer CLIENT ID wird sie automatisch im Format PP-<opc_id>-<random6> erzeugt (innerhalb der
in MQTT v3.1 empfohlenen Länge von 23 Zeichen).
PLC-Adressnotation des Tags — 4-Mode-JSON
PLC-Adresse des Tags = MQTT-Topic + 4-Mode-JSON-Decoder. Identische Spezifikation wie bei WebSocket / Apache Kafka.
| Modus | Format | Verhalten |
|---|---|---|
| SCALAR | factory/line1/temp oder factory/line1/temp.value | Gesamte Nachricht als String. Ist die Nachricht ein JSON-Objekt, Fallback auf raw. |
| KEY | sensors/multi:temperature | Wert eines Top-Level-JSON-Keys (z. B. {"temperature":25.3,"humidity":60} → 25.3) |
| PATH | sensors/multi:$.data.tags.T1 | Dynamische Auswertung per JSON Pointer (verschachtelte Keys unterstützt) |
| RAW | sensors/multi:_raw_ | Komplette letzte Nachricht (Debugging) |
Wildcard-Subscribe wird ebenfalls unterstützt:
| PLC-Adresse des Tags | Bedeutung |
|---|---|
device/+/status | Einstufige Wildcard (sensor01/sensor02/... alle) |
factory/# | Mehrstufige Wildcard (alles unterhalb von factory — zuletzt eingetroffene Nachricht hat Vorrang) |
Der erste read-Aufruf löst ein Lazy Subscribe aus (liefert einen leeren String). Ab dem nächsten Polling-Zyklus stehen die Cache-Werte zur Verfügung.
Häufige Anwendungsfälle
| Anwendungsfall | Vorgehen |
|---|---|
| HiveMQ Cloud / Public Broker | host = broker.hivemq.com 1883 (unverschlüsselt), 8883 (TLS + Authentifizierung) |
| Werkseigenes Mosquitto / EMQX | host = interne IP, 1883 / 8883. username/password registrieren |
| AWS IoT Core | host = <account>-ats.iot.<region>.amazonaws.com, 8883 + X.509 (separate Truststore-Konfiguration) |
| Azure IoT Hub | host = <hub>.azure-devices.net, 8883 + SAS-Token (username/password) |
| QoS=1 garantieren | QoS=1 wählen — der Broker sendet bis zum Ack erneut. Höherer Verarbeitungsaufwand ↑ |
| Persistente Session | CLEAN SESSION=false + feste CLIENT ID — der Broker hält nicht empfangene Nachrichten vor |
write (publish)
Wird ein Wert über die Tag-Seite oder die REST API geschrieben, erfolgt sofort ein Publish auf das entsprechende Topic des Brokers (retain=false). Der String des Werts wird unverändert als Payload gesendet — JSON wie Klartext sind möglich.
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"}'
Häufige Probleme und Lösungen
| Symptom | Ursache | Lösung |
|---|---|---|
| Es kommen keine Werte an | Broker publiziert keine Nachrichten | Mit mosquitto_sub -h <host> -p 1883 -t '<topic>' -v direkt mitlesen und prüfen, ob Zeilen erscheinen |
[MQTT] connect 실패: not authorized | Fehler bei username/password | Broker-Benutzer/Passwort prüfen. ACL-Einschränkungen prüfen |
[MQTT] connect 실패: timeout | Firewall / Port blockiert | Mit telnet <host> 1883, openssl s_client -connect <host>:8883 verifizieren |
| TLS-Handshake schlägt fehl | Selbstsigniertes Zertifikat / fehlendes cacerts | Im Produktivbetrieb offizielles Zertifikat empfohlen. Übergangsweise beim Systemadministrator die Aufnahme in den Truststore anfordern |
| Wildcard liefert nur sporadisch Werte | Bei Wildcards hat die zuletzt eingetroffene Nachricht Vorrang | Getrennt pro Topic registrieren (je Topic ein eigener Tag) |
Weiterführende technische Dokumentation
- Erweitert — Treiber: MQTT-Client
- Sparkplug B (MQTT + standardisierte NBIRTH/DBIRTH/DCMD-Payloads)
- Offizielle Eclipse Paho-Dokumentation