Leichtgewichtige M2M-Kommunikation mit MQTT

Dialog der Maschinen

Dominik Obermaier

„Internet of Things“ ist in aller Munde. Durch immer günstigere Einplatinencomputer wie Raspberry Pi und Arduino ist es möglich, kostengünstig Geräte, etwa für die Erhebung und Auswertung für Sensordaten, über das Internet zu vernetzen. Zeit, sich Paho genauer anzusehen, die Referenzimplementierung des leichtgewichtigen MQTT-Protokolls zur M2M-Kommunikation für Java.

Eclipse und das Internet der Dinge

Mehr zum Thema M2M/Internet of Things lesen Sie in der neuen Ausgabe des Eclipse Magazins 1.13.

Ab 23.11. am Kiosk!

Der Begriff „Internet of Things“ wurde bereits 2009 von Kevin Ashton geprägt [1] und bezeichnet die Vernetzung von Dingen der realen Welt über das Internet oder geschlossenen Netzwerken. Die Grundidee ist simpel: Physische Geräte können miteinander kommunizieren und so Daten untereinander austauschen oder gar gesteuert werden. Populär ist dieser Ansatz heute bereits bei der Erhebung von Sensordaten, die daraufhin über das Internet an interessierte Clients gesendet werden. Diese Daten werden dann meist aggregiert und für Menschen lesbar in Form von Charts oder Statistiken aufbereitet.

Die Anwendungsszenarien sind praktisch unbegrenzt. Stellen Sie sich vor, Ihr Wecker würde automatisch zehn Minuten später klingeln, da er benachrichtigt wird, dass Ihre Zugverbindung 15 Minuten Verspätung hat. In der Folge schaltet sich Ihre Kaffeemaschine automatisch auch zehn Minuten später ein, damit Ihr Frühstückskaffee nicht kalt ist, bis Sie aufstehen. Klingt wie Zukunftsmusik? Das alles ist heute schon möglich. Die Firma Ericsson prognostiziert, dass bis 2020 mindestens 50 Milliarden Geräte über das Internet kommunizieren werden [2]. Möglich ist das Ganze durch die zunehmende Verbreitung von IPv6 und offenen Maschine-zu-Maschine- (M2M-)Kommunikationsprotokollen, die leichtgewichtig genug sind, um mit möglichst wenig Protokolloverhead sogar über Mobilfunknetze eine günstige Kommunikation zu erlauben.

MQTT

Das Message Queue Telemetry Transport (MQTT) Protocol wurde 1999 von Andy Stanford-Clark (IBM) und Arlen Nipper (Eurotech) als M2M-Kommunikationsprotokoll mit minimalem Protokolloverhead entwickelt, um vernetzten Geräten eine Möglichkeit zu bieten, möglichst bandbreiten- und batterieschonend zu kommunizieren.

MQTT basiert auf dem Publish-Subscribe-Pattern. Das bedeutet, dass die Clients sich untereinander nicht kennen und einen zentralen Verteiler, einen so genannten Broker, zur Kommunikation nutzen. Der Broker ist dafür zuständig, dass eine gesendete Nachricht alle interessierten Clients erreicht. Wenn ein Client sich mit einem Broker verbindet, teilt er dem Broker mit, für welche Topics er benachrichtigt werden möchte, welche er also abonnieren möchte. Diesen Vorgang nennt man Subscribe. Wenn ein Client eine Nachricht sendet, muss er die Information mitsenden, an welches Topic diese Nachricht gesendet werden soll. Diesen Vorgang nennt man Publish. Durch diese Architektur ist es möglich, hochskalierbare Lösungen mit Tausenden von Clients zu entwickeln, ohne dass Abhängigkeiten zwischen den teilnehmenden Clients entstehen.

Abb. 1: Publish-Subscribe mit MQTT
Topics

Jeder Client kann frei wählen, zu welchem Topic er publishen oder subscriben möchte. Topics sind frei wählbare Strings und können mittels eines „/“ hierarchisch aufgebaut werden. Beispiele wären homeautomation/temperature und homeautomation/brightness. Das Root Topic wäre hier homeautomation und die untergeordneten Topics wären temperature und brightness. Ein Client könnte entweder ein konkretes Kind-Topic abonnieren oder mittels einer Wildcard („#“) alle Kind-Topics eines Eltern-Topics abonnieren. Beispielsweise könnte er homeautomation/# abonnieren, was zur Folge hätte, dass er alle Nachrichten für homeautomation/temperature und homeautomation/brightness zugestellt bekommen würde. Bei den Topic-Namen wird zwischen Groß- und Kleinschreibung unterschieden.

Geschrieben von
Dominik Obermaier
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.