Übersicht über den MQTT Standard
Was ist MQTT?
- MQTT ist ein OASIS-Standard-Messaging-Protokoll für das Internet der Dinge (IoT).
- Läuft über TCP
- extrem leichter Publish- / Subscribe-Messaging-Transport
- Verbinden von Remote-Geräten mit geringem Code-Footprint und minimaler Netzwerkbandbreite
- MQTT wird in vielen Branchen eingesetzt (Automobilindustrie, Fertigung, Telekommunikation, Öl und Gas usw.)
Client/Server
- Es gibt einen Server (genannt Broker)
- Da MQTT nur ein Standard ist gibt es viele verschiedenen Implementierungen für Broker
- Alles andere sind Clients
- Clients können entweder publishen
- Oder auf einer Topic subscriben

Protokoll
Features
Topics
- String, welcher vom Broker benutzt wird, um Nachrichten an die Clients zu filtern
- kann mit Slash ( / ) in Unter-Topics (Levels) separiert werden, bspw. SmartHome/Erdgeschoss/Wohnzimmer/Temperatur
- Wildcards:
- einzelnes Level mit +, bspw. SmartHome/Erdgeschoss/+/Temperatur > Temperatur aus allen Räumen im Erdgeschoss
- mehrere Level mit #, bspw. SmartHome/Erdgeschoss/# > alle Nachrichten vom Erdgeschoss
Persistent Sessions
- automatischer Neuaufbau der Verbindung bei Abbruch
“last will and testament”
- Nachricht, welche gesendet wird wenn ein Client unerwartet die Verbindung trennt (um mit dieser Information andere Clients darüber zu informieren)
Verschiedene Qualitäts-Levels
Vorteil von MQTT: Nachrichten werden garantiert gesendet, auch, wenn die verwendete Verbindung unzuverlässig ist sog. Quality of service levels (von oben nach unten: sicherer, aber langsamer)
- At most once (0)
- At least once (1)
- Exactly once (2).
Levels können von den Clients selbst ausgewählt werden
QoS 0 (at most once)

- keine Garantie, dass die Nachricht empfangen wurde
- der Sender speichert die Nachricht nicht und kann sie somit auch nicht nochmal senden
- der Empfänger sendet keine Empfangsbestätigung
QoS 1 (at least once)

- Garantie, dass Nachricht mindestens einmal empfangen wurde
- Sender speichert Nachricht solange, bis PUBACK vom Empfänger zurückkommt
- bis dahin wird die Nachricht periodisch versendet
QoS 2 (exactly once)

- Garantie, dass Nachricht genau einmal empfangen wurde
- Client sendet solange, bis vom Broker eine Antwort kommt
- Broker wartet mit Weiterverarbeitung, bis Sendung abgeschlossen ist
- weitere zwei Packages, um den Empfang zu quittieren
Bedeutung der einzelnen Pakete
- PUBLISH = Nachricht wird gesendet
- PUBREC = publish received (Nachricht wurde empfangen, keine Nachrichten weitersenden)
- PUBREL = message release (Nachricht wird nicht weiter gesendet Nachricht kann aus Queue des Brokers entfernt und an Subscriber weitergesendet werden)
- PUBCOMP = publish complete (Nachricht wird nicht erneut vom Client gesendet)
Demo: Publish/Subscribe über einen lokalen Broker
- In der Demo nutzen wir Mosquitto als Broker
- Broker starten : ”docker run -it -p 1883:1883 eclipse-mosquitto”
- IP des Broker/Server herausfinden:
“docker inspect -f ‚{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}‘ {containerId}”
- Subscriben von Nachrichten: “mosquitto_sub –host {ip-address} –topic ‚SmartHome/EG/+/Temp‘ -v -d”
- Publishen von Küche und Gang: “mosquitto_pub –host {ip-address} –topic ‚SmartHome/EG/Gang/Temp‘ -m ’23°C”
- Man sieht Publisher verbindet sich mit Broker
- Man sieht anhand Packages: QOS 0 (default)
- Wechsel zu QOS 2 via ”-q 2” bei beiden
Skalierbarkeit und Effizienz
MQTT kann skaliert werden, um eine Verbindung mit Millionen von IoT-Geräten herzustellen. Je nach Anzahl von Publishern und Subscribern ist stärkere Hardware notwendig (Vertikale Skalierung). Horizontale Skalierbarkeit ist auch möglich, allerdings nicht mit jeder Broker-Implementierung.
HTTP VS MQTT
- 10% weniger Traffic mit MQTT
- 22% Energie effizienter als HTTP
- 15% Ressourcen effizienter als HTTP

- mehr als 90% des Traffics ist für den Aufbau und Beenden einer Verbindung
- vorteil gegenüber HTTP bei wiederverwendung von bestehender Verbindung

- höchste Effizienz möglich bei hoher dichte der payload message
Sicherheit
Möglichkeiten zur sicheren Kommunikation
- eigener Broker ist Sicherste weg
- initialen Verbindungsaufbau zu einem MQTT-Broker Authentifizieren
- mit Benutzernamen und Passwort
- komplexere Authentifizierungsmethoden wie OAuth 2.0
- Authorisierung
- bösartiger Client Nachrichten von allen Topics abonnieren und damit unberechtigterweise Daten mitlesen
- Broker entscheidet
- Darf ein Client auf einem bestimmten Topic eine Retained Message versenden?
- Welches QoS-Level darf der Client senden oder abonnieren?
- Welche Topics darf der Client benutzen?
- Darf der Client auf einem bestimmten Topic abonnieren, senden oder gar beides?
- Einschränkungen konfigurieren (maximale Nachrichtengröße der Clients und die maximale Bandbreite MQTT-Sender)
Verschlüsselung
- Client initialisiert selbst verbindung mit Broker
- kein Öffnen der Verbindungen von außen möglich
- Brute-Force- und Denial-of-Service-Attacken auf einzelne Geräte sind schwierig durchzuführen
- TLS einsetzten
- Man-In-The-Middle-Attacken weitgehend vermeiden
- Verschlüsselte Verbindung
Use Cases
Matternet
- Vernetzung von Drohnen und Landestationen über HiveMQ-Broker
- Bereitstellung von Telemetrieinformationen (Flugstatus) in Echtzeit
- Kommunikation über ggf. unzuverlässiges LTE Netzwerk wird durch Protokoll verbessert
- Bediener können dadurch auch mit Drohnen interagieren (obwohl sie nicht darin fliegen)
BMW Mobility Services
- Carsharing-Anwendung
- Benutzt als alternative Messaging Lösung (anstatt SMS und HTTP)
- Nutzen: Geringere Kosten durch weniger Datenübertragung, höhere Zuverlässigkeit durch QoS Levels
Der Blogpost ist auch als Foliensatz verfügbar
Download: Übersicht über den MQTT Standard
Quellen
- https://www.informatik-aktuell.de/betrieb/netzwerke/mqtt-leitfaden-zum-protokoll-fuer-das-internet-der-dinge.html
- https://www.hivemq.com/blog/mqtt-essentials-part-5-mqtt-topics-best-practices/
- https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels/
- https://flespi.com/blog/http-vs-mqtt-performance-tests
- https://cloud.google.com/blog/products/iot-devices/http-vs-mqtt-a-tale-of-two-iot-protocols
- https://m.heise.de/developer/artikel/Sichere-IoT-Kommunikation-mit-MQTT-Teil-1-Grundlagen-3645209.html
Bildquellen
- https://www.hivemq.com/img/blog/qos-levels_qos0.svg
- https://www.hivemq.com/img/blog/qos-levels_qos1.svg
- https://www.hivemq.com/img/blog/qos-levels_qos2.svg
- https://storage.googleapis.com/gweb-cloudblog-publish/images/diagram.max-1400×1400.png
- https://storage.googleapis.com/gweb-cloudblog-publish/images/Transmission.max-1400×1400.png