Ü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
Client/Server Aufbau

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)

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)

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)

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
Durchschnittliche Datenmenge, die pro Nachricht für unterschiedliche Anzahlen von Nachrichten übertragen wird
  • mehr als 90% des Traffics ist für den Aufbau und Beenden einer Verbindung
  • vorteil gegenüber HTTP bei wiederverwendung von bestehender Verbindung
Übertragungszeit für verschiedene Nachrichtengrößen
  • 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

Bildquellen