Zum Hauptinhalt springen

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.

SituationWelcher Modus
Externes IT-System sendet Werte per REST POSTHTTP-Push
Externer Server pusht per WebSocketWebSocket-Client
Externer IIoT-MQTT-Broker pusht über TopicsMQTT-Client (diese Seite)
Sparkplug B-Standard (NBIRTH/DBIRTH/DCMD)Sparkplug B
Werte werden direkt aus der werkseigenen PLC gelesenModbus / OPC-UA usw.

Eingabefelder des Registrierungsformulars

EingabefeldWas wird eingetragenBeispiel
IP-AdresseHost des MQTT-Brokersbroker.hivemq.com, 10.0.0.50
PortPort des MQTT-Brokers (unverschlüsselt 1883, TLS 8883)1883, 8883
USERNAMEBenutzername für die Broker-Authentifizierung (optional)iotuser
PASSWORDPasswort für die Broker-Authentifizierung (optional)s3cret
TLSAuswahl unverschlüsselt / TLSfalse (tcp) / true (ssl)
QoSQoS für Subscribe / Publish0 / 1 / 2
KEEP ALIVEKeep-alive-Intervall (Sekunden)60
CLEAN SESSIONClean-Session-Flagtrue (Standard) / false
CLIENT IDExplizite Client-ID (optional)edge-plant-01
ErfassungsintervallIntervall, 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.

ModusFormatVerhalten
SCALARfactory/line1/temp oder factory/line1/temp.valueGesamte Nachricht als String. Ist die Nachricht ein JSON-Objekt, Fallback auf raw.
KEYsensors/multi:temperatureWert eines Top-Level-JSON-Keys (z. B. {"temperature":25.3,"humidity":60}25.3)
PATHsensors/multi:$.data.tags.T1Dynamische Auswertung per JSON Pointer (verschachtelte Keys unterstützt)
RAWsensors/multi:_raw_Komplette letzte Nachricht (Debugging)

Wildcard-Subscribe wird ebenfalls unterstützt:

PLC-Adresse des TagsBedeutung
device/+/statusEinstufige 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

AnwendungsfallVorgehen
HiveMQ Cloud / Public Brokerhost = broker.hivemq.com 1883 (unverschlüsselt), 8883 (TLS + Authentifizierung)
Werkseigenes Mosquitto / EMQXhost = interne IP, 1883 / 8883. username/password registrieren
AWS IoT Corehost = <account>-ats.iot.<region>.amazonaws.com, 8883 + X.509 (separate Truststore-Konfiguration)
Azure IoT Hubhost = <hub>.azure-devices.net, 8883 + SAS-Token (username/password)
QoS=1 garantierenQoS=1 wählen — der Broker sendet bis zum Ack erneut. Höherer Verarbeitungsaufwand ↑
Persistente SessionCLEAN 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

SymptomUrsacheLösung
Es kommen keine Werte anBroker publiziert keine NachrichtenMit mosquitto_sub -h <host> -p 1883 -t '<topic>' -v direkt mitlesen und prüfen, ob Zeilen erscheinen
[MQTT] connect 실패: not authorizedFehler bei username/passwordBroker-Benutzer/Passwort prüfen. ACL-Einschränkungen prüfen
[MQTT] connect 실패: timeoutFirewall / Port blockiertMit telnet <host> 1883, openssl s_client -connect <host>:8883 verifizieren
TLS-Handshake schlägt fehlSelbstsigniertes Zertifikat / fehlendes cacertsIm Produktivbetrieb offizielles Zertifikat empfohlen. Übergangsweise beim Systemadministrator die Aufnahme in den Truststore anfordern
Wildcard liefert nur sporadisch WerteBei Wildcards hat die zuletzt eingetroffene Nachricht VorrangGetrennt pro Topic registrieren (je Topic ein eigener Tag)

Weiterführende technische Dokumentation