MQTT + Cumulocity IoT Plattform

MQTT Zusammenfassung [Quelle: Wikipedia]

MQTT (Message Queuing Telemetry Transport) ist ein offenes Nachrichtenprotokoll für Machine-to-Machine-Kommunikation (M2M), das die Übertragung von Telemetriedaten in Form von Nachrichten zwischen Geräten z.B. Sensoren ermöglicht.
Die Internet Assigned Numbers Authority (IANA) reserviert für MQTT die Ports 1883 und 8883. MQTT-Nachrichten können mit dem TLS-Protokoll verschlüsselt werden.
Die MQTT-Spezifikation unterscheidet TCP/IP-basierte und Nicht-TCP/IP-Netzwerke.
MQTT ist ein Client-Server-Protokoll. Clients senden dem Server (“Broker”) nach Verbindungsaufbau Nachrichten mit einem Topic, welches die Nachricht hierarchisch einstuft; zum Beispiel Küche/Kühlschrank/Temperatur oder Auto/Rad/3/Luftdruck. Clients können diese Topics abonnieren, wobei der Server die empfangenen Nachrichten an die entsprechenden Abonnenten weiterleitet.

Interessant ist, dass ein MQTT-Server („Broker“) die gesamte Datenlage seiner Kommunikationspartner hält, und so als Zustands-Datenbank benutzt werden kann. So ist es möglich, kleine unperformante MQTT-Geräte mit einem MQTT-Broker zu verbinden, wobei die Geräte Daten einsammeln und/oder Befehle entgegennehmen, während ein komplexes Lagebild nur auf dem MQTT-Broker entsteht und hier oder durch einen leistungsfähigen Kommunikationspartner ausgewertet werden kann.

Nachrichten bestehen immer aus einem Topic und dem Nachrichteninhalt. Nachrichten werden mit einem definierbaren Quality of Service versendet:

  • at most once: die Nachricht wird einmal gesendet und kommt bei Verbindungsunterbrechung möglicherweise nicht an
  • at least once: die Nachricht wird so lange gesendet, bis der Empfang bestätigt wird, und kann beim Empfänger mehrfach ankommen
  • exactly once: hierbei wird sichergestellt, dass die Nachricht auch bei Verbindungsunterbrechung genau einmal ankommt

Außerdem kann mit dem Retain-Flag der Server angewiesen werden, die Nachricht zu diesem Topic zwischenzuspeichern.

Beim Verbindungsaufbau können Clients einen „letzten Willen“ in Form einer Nachricht definieren. Falls die Verbindung zum Client verloren geht, wird diese Nachricht publiziert und dabei an die entsprechenden Abonnenten gesendet.

MQTT wird üblicherweise über TCP benutzt und hat einen 2-Byte-Header. Das erste Byte enthält den Nachrichtentyp (4 Bit), den Quality of Service (2 Bit) und ein Retain-Flag. Das zweite Byte enthält die Länge des restlichen MQTT-Pakets. Daran schließt sich ein variabler Teil an, der das MQTT-Topic, also das Thema enthält. Abschließend kommt der Payload, also der Dateninhalt, der unter dem Thema veröffentlicht wird.

Es gibt folgende Nachrichten-Typen:

  • CONNECT
  • CONNACK
  • PUBLISH
  • PUBACK
  • PUBREC
  • PUBREL
  • PUBCOMP
  • SUBSCRIBE
  • SUBACK
  • UNSUBSCRIBE
  • UNSUBACK
  • PINGREQ
  • PINGRESP
  • DISCONNECT

Die fett markierten Nachrichten-Typen sind innerhalb der folgenden Kommunikation wieder zu finden:

Topics können wildcards beinhalten:

  • Single level wildcard (+): Haus/+/Kühlschrank/Temperatur
  • Multi level wildcard am Ende (#): Küche/Kühlschrank/#

Installation von MQTTBox

MQTTBox ist ein MQTT Client der uns unter anderem die Möglichkeit gibt, neue Topics zu erstellen und/oder bestehende Topics zu abonnieren.

Konfiguration von MQTTBox zwecks Kommunikation mit der Cummulocity (C8Y) IoT-Plattform:

Anhand der MQTT Client Id können zukünftige Anfragen einem bestehenden Device mit der oben genannten ID zugeordnet werden. Ich greife etwas vor und zeige, wo sich diese Id nach der Erstellung eines Devices befindet:

Anschließend kann eine Verbindung zur C8Y hergestellt werden.

Device Erstellung innerhalb der C8Y IoT-Platform via MQTT

Ein Device kann mit Hilfe eines vordefinierten C8Y MQTT-Templates mit der Templatenummer ‚100‘ erstell werden.

100, deviceName, deviceType

Es besteht die Möglichkeit, weiter Templates innerhalb des Payloads innerhalb einer neuen Zeile mit anzugeben. Zum Beispiel kann mit dem Template 110 folgende Attribute mit angegeben werden: serialNumber, model, revision

Liste der Template IDs

Eine ausführliche Beschreibung der Templates und deren Parameter findet man unter der folgenden URL.

100Device creation
101Child device creation
105Get child devices
106Get children of device
110Configure Hardware
111Configure Mobile
112Configure Position
113Set Configuration
114Set supported operations
115Set firmware
116Set software list
117Set required availability
200Create custom measurement
210Create signal strength measurement 
211Create temperature measurement 
212Create battery measurement
301Create CRITICAL alarm
302Create MAJOR alarm 
303Create MINOR alarm
304Create WARNING alarm
305Update severity of existing alarm
306Clear existing alarm
400Create basic event
401Create location update event
402Create location update event with device update 
500Get PENDING operations
501Set operation to EXECUTING
502Set operation to FAILED
503Set operation to SUCCESSFUL
510Restart 
511Command 
513Configuration 
515Firmware 
516Software list 
517Measurement request operation
518Relay 
519RelayArray
520Upload configuration file
521Download configuration file
522Logfile request
523Communication mode

Das folgende Bild zeigt die Erstellung eines MQTT Gerätes:

Das Gerät wird anschließend innerhalb von ‚Device Management‘ angezeigt:

Wie man oben aus den Template IDs erkennen kann, wurde mit der ID 100 ein neues Device erstellt. Mit der ID 117 wurde der ‚response intervall‘ festgelegt und die ID 212 repräsentiert den Akku Ladestatus. Dabei steht 97 für 97%. Durch Eingabe von z.B. 212,95 & 212,85 & 212,65 & 212,57 können wir eine Batterie-Entladung simulieren.
Ich habe zuvor Topic ’s/e‘ abonniert, um den Batterie-Status auszulesen.

Innerhalb der Plattform sieht die Batterie-Entladung wie folgt aus: