Skip to main content

MQTT

MQTT, Message Queueing Telemetrie Transport, ist ein offenes Netzwerkprotokoll um vorwiegend kleine Datenpakete (etwa Telemetriedaten) zwischen Geräten ermöglicht.

Hierbei gibt es immer einen Hauptserver, den sogenannten Broker. Ein solcher ist etwa auf berta installiert, in diesem Fall handelt es sich um mosquitto. Dieser Broker sammelt Daten der Client-Geräte ein und verteilt sie wiederum. Dafür können sich Client-Geräte beim Broker für gewisse Themen ("topics") anmelden ("subscriben"). Ändert sich ein Parameter, also etwa ein Messwert in einem topic, sendet der Broker diese neuen Werte an alle Subscriber. Topics sind ähnlich einer Ordnerstruktur geordnet, etwa "house/livingroom/temperature" bezeichnet den Temperatursensor im Wohnzimmer des Hauses. Die Ordnung kann/darf man sich selbst aufbauen, sie sollte nur konsequent für alle beteiligten Geräte bleiben.

Konkret: ein Client könnte etwa eine kleine Wetterstation draußen sein. Diese sammelt jede Stunde Temperatur-, Luftfeuchte- und Luftdruckdaten sowie Daten zur Sonneneinstrahlung. Diese Daten sendet es dann als Datenpaket(e) mit dem topic "weather" an den Broker. Der Broker registriert diese und schickt sie an alle, die sich für das topic "weather" subscribed haben. So jemand könnte zum Beispiel ein Gerät sein, welches die Rolläden je nach Sonneneinstrahlung steuert. Vielleicht interessieren dieses Gerät dann auch gar nicht die anderen Daten der Wetterstation (Luftdruck, Luftfeuchte, Temperatur) und es ist nur am topic "weather/sun" interessiert.

Besonderheiten

  • "Last will": ein "last will" eines Clients wird im Broker gespeichert. Stirbt der Client (etwa weil Batterie leer, Abbruch der WiFi-Verbindung, ...) sendet der Broker diesen "last will" an alle Subscriber des Clients. Der "last will" könnte etwa lauten "client xyz disconnected". Andere Clients könnten dann auf diesen letzten Willen entsprechend reagieren.
  • "Wildcard subscriptions": das "+"-Zeichen oder das "#" können als sog. Wildcards verwendet werden. Gibt es das topic "temperature" etwa in allen Räumen eines Hauses (house/livingroom/temperature, house/bathroom/temperature, house/kitchen/temperature, house/sleepingroom/temperature...) und man möchte alle Temperaturen auf einmal abfragen, könnte dies so aussehen: house/+/temperature. Ebenso können alle sub-topics einer Hierarchie angesehen werden durch Verwendung von "#": "house/#" gibt alle topics wieder, die unter "house" ablaufen.