IoT-Messaging mit MQTT 5 und Java

Mit der HiveMQ-MQTT-Client-Library kann das de-facto Standardprotokoll für IoT in der neuesten Version genutzt werden.

MQTT ist mittlerweile das populärste IoT-Protokoll (Google-Trends-Analyse[1]) für die Kommunikation zwischen Geräten und Applikationen über das Internet. Einige der verschiedenen Anwendungsfälle für das schlanke und leichtgewichtige MQTT sind unter anderem: Industrie 4.0, Connected-Cars, Logistik-Mobile-Apps und leichtgewichtiges Messaging zwischen Microservices. Speziell im Java-Umfeld wird MQTT häufig genutzt, um klassische Enterprise-Anwendungen für das Internet der Dinge fit zu machen. Zu den Gründen hierfür zählen die herausragende Skalierbarkeit von MQTT, das eine Skalierung von einem bis hin zu mehreren Millionen von Geräten und mehreren hunderttausend Nachrichten pro Sekunde erlaubt, oder auch die einfache Möglichkeit MQTT in bestehende Enterprise-Applikationslandschaften zu integrieren. Dieser Artikel beleuchtet die Verwendung des HiveMQ-MQTT-Client, einer Open-Source-Java-Bibliothek mit voller MQTT-5-Unterstützung, die für den Einsatz in professionellen Projekten konzipiert wurde.

 

MQTT – Ökosystem und kurze Einleitung

 

Publish/Subscribe-Architektur von MQTT (Abb. 1)

 

Um die Kommunikation der Clients, die durch das Publish/Subscribe-Paradigma sichergestellt, bidirektional und entkoppelt wurde, in einem MQTT-Deployment zu ermöglichen, wird ein MQTT-Broker benötigt. Je nach konkretem Anwendungsfall rangieren die möglichen MQTT-Broker-Implementierungen von freien Open-Source-Projekten wie Eclipse-Mosquitto[2] bis hin zu kommerziellen Produkten wie den Enterprise-MQTT-Broker HiveMQ[3], der speziell für professionelle Cloud-Deployments entwickelt wurde und sich für die Vernetzung von wenigen Geräten bis hin zu mehreren Millionen IoT-Devices eignet. MQTT-Clients können neben leichtgewichtigen IoT-Geräten mit beschränkten Ressourcen auch Desktop- bzw. Mobile-Applikationen oder Backend-Systeme sein, die unter Verwendung verschiedenster Programmiersprachen mit Hilfe des Standardprotokolls MQTT miteinander kommunizieren können.

Zum jetzigen Zeitpunkt ist MQTT 3.1.1 die am häufigsten verwendete Version des Protokolls. Im Jahr 2018 wurde mit MQTT 5 der offizielle Nachfolger verabschiedet. MQTT 5 bietet eine Reihe an Verbesserungen und neuen Features. Es wird unter anderem durch die Rücksichtnahme auf das Feedback derjenigen Nutzer bereichert, die MQTT 3.1.1 bereits produktiv einsetzen. Eine Liste aller Neuerungen ist auf der HiveMQ-Webseite[4] einsehbar.

HiveMQ-MQTT-Client-Library

Obwohl Java zu den populärsten und am meisten genutzten Programmiersprachen zählt, gab es bisher keine wirklichen Alternativen zu der Java-Bibliothek Eclipse-Paho. Da Eclipse-Paho jedoch für hochskalierbare Anwendungen schlichtweg nicht performant genug und das Threading-Model für die Integrationen in Fremdsysteme nicht ideal ist, kein Backpressure-Handling möglich ist und die APIs aus heutiger Sicht etwas altbacken daherkommen, haben sich dc-square  und BMW Car-IT zusammengetan und die Java-basierte, Open-Source-Bibliothek HiveMQ-MQTT-Client-Library entwickelt. Die Apache-2-lizensierte Bibliothek wurde speziell für MQTT 5 entwickelt (ist jedoch auch mit MQTT 3.1.1 kompatibel) und hat mehrere Projektziele:

 

  • Eine funktional zuverlässige Standardbibliothek für alle MQTT-Projekte mit Java umzusetzen
  • 100% MQTT-5-Support, inklusive aller optionalen Features
  • Implizites und explizites Backpressure-Handling
  • Niedrigster Speicherverbrauch
  • Extrem hoher Nachrichtendurchsatz, sowohl sendend als auch empfangend
  • Leichte Integrierbarkeit in bestehende Java-Frameworks und Applikationen
  • Verschiedene API-Layer: Blocking, Async und RxJava

 

 

Durch ihre Flexibilität ist die Bibliothek von Embedded-Geräten, die über eine eigene JVM verfügen, über Java-basierte Anwendungen bis hin zu hoch performanten Backend-Systemen (Streaming und Big-Data) geeignet. Das flexible und für Entwickler einfache Threading-Model der HiveMQ-MQTT-Client-Library stellt eine unkomplizierte Integrierbarkeit in bestehende Applikationen sicher. Der Fokus der Bibliothek liegt darauf, sinnvolle Default-Einstellungen für Standardanwendungsfälle mitzubringen, sowie den notwendigen Code für Entwickler standardmäßig klein und robust zu halten. Zusätzlich stellt die HiveMQ-MQTT-Client-Library durch ihre Flexibilität sicher, dass selbst tiefe und unübliche Integrationen ohne Verstöße gegen das MQTT-Protokoll möglich sind.

 

Features

Die HiveMQ-MQTT-Client-Library umfasst eine vollständige Umsetzung aller MQTT-Funktionalitäten laut Spezifikation[5]. Zusätzlich wurde eine Reihe von Features implementiert, die das Leben für Entwickler und die Integration der Bibliothek in bestehende Systeme leichter machen sollen, unter anderem:

 

  • Voller MQTT-3.1.1- und MQTT-5-Support mit allen optionalen Features
  • Sichere und verschlüsselte Kommunikation mit TLS (u.a. TLS 1.3)
  • MQTT-over-Websockets
  • Automatisches Reconnect-Handling
  • Offline-Buffering von Nachrichten
  • Backpressure-Support
  • Optionale Integration von Dropwizard-Metrics
  • Integration mit SLF4J für standardisiertes Logging
  • Pluggable-Thread-Pools
  • HTTP-CONNECT-Support

 

Beispielcode

Je nach spezifischem Anwendungsfall und persönlicher Präferenz des Entwicklers kann eine der drei verschiedenen APIs genutzt werden, die von der HiveMQ-MQTT-Client-Library angeboten werden.

Eine Blocking-API, eine Async-API so wie eine RxJava-API. Dem Nutzer steht sogar zu jedem Zeitpunkt die Möglichkeit offen, zwischen diesen API-Styles zu wechseln. So lässt sich beispielsweise zur Async-API wechseln, um eine Methode aufzurufen, während prinzipiell die Blocking-API verwendet wird.

 

Blocking-API

Die Blocking-API blockt bei allen Remote-Operationen den aktuell ausführenden Thread und ist durch ihren komprimierten, einfachen Stil ideal für Proof-of-Concepts geeignet. Außerdem eignet sie sich für Anwendungsfälle bei denen Performance und Concurrency keine Rolle spielen. Im folgenden Beispiel wird gezeigt wie man mit Hilfe der Blocking-API einen MQTT-Client initialisiert, sich zu einem remote-Broker verbindet, eine Nachricht published und die Verbindung wieder trennt.

 

(Listing 1) – Blocking-MQTT-Client

 

Async-API

Die Async, also asynchrone API, ist für den Großteil aller Use-Cases geeignet, insbesondere wenn Nachrichten asynchron gesendet und empfangen werden sollen oder man mit eigenen Thread-Pools arbeiten möchte. Die meisten Operationen arbeiten mit CompletableFuture, die mit Java 8 neu zum JDK dazu gekommen sind, wodurch sich die Verkettung von asynchronen Operationen miteinander sehr feingranular kontrollieren lässt.

 

Im folgenden Codebeispiel findet sich ein Blocking-Client zu einem MQTT-Broker und anschließend wird durch den Aufruf von toAsync()der API-Style dieses Clients zur Async-API geändert. Ebenso wäre es möglich, direkt einen AsyncClient zu initiieren und sich mit diesem zu verbinden. Der Methode callback() kann jegliche konkrete Callback-Implementierung übergeben werden, die dann jeweils aufgerufen wird, wenn der Client auf dem spezifizierten Topic eine Nachricht erhält.

 

(Listing 2) – Async-MQTT-Client

 

RxJava-API

Neben allen MQTT-5-Funktionalitäten unterstützt die HiveMQ-MQTT-Client-Library auch RxJava 2 bzw. Reactive-Streams. Dies ist besonders deshalb interessant, weil somit auch komplexe reaktive Anwendungen mit der HiveMQ-MQTT-Client-Library realisiert werden können. Beispielsweise erlaubt die reaktive API die Implementierung eines anwendungsspezifischen Backpressure-Handlings. Außerdem bietet die reaktive API beste Performance. Die Verwendung einer reaktiven API in Java ist naturgemäß sehr umfangreich, bietet aber auch die größte Flexibilität. Auf der Projekt-Webseite[6] findet sich eine ausführliche Dokumentation zur Benutzung mit RxJava.

 

Fazit:

Mit dem HiveMQ-MQTT-Client wurde von BMW Car-IT und dc-square eine Library entwickelt, die als MQTT-Standardbibliothek für alle Java-Projekte eingesetzt werden kann. Die Bibliothek ist neben dem Enterprise-MQTT-Broker-HiveMQ mit allen gängigen MQTT-Brokern kompatibel und trotz des großen Feature-Sets sehr schlank. Die Bibliothek ist für neue Projekte genauso geeignet wie für die Ablösung von Eclipse-Paho in bestehenden Applikationen.

 

Mit dem HiveMQ-MQTT-Client

Florian Raschbichler leitet das Support Team bei der dc-square GmbH, dem Softwareherstelller des Enterprise MQTT Brokers HiveMQ, die zu den führenden Experten weltweit im Bereich MQTT zählt. Er unterstützt bei Problemlösungen rund um die Themem MQTT und HiveMQ – daher kennt Florian die Herausforderungen aus erster Hand. Als MQTT Experte teilt er seine Erfahrungen aus mehr als 5 Jahren IoT in Produktion und schreibt Artikel, hält Vorträge oder Workshops rund um das de-facto Standard.Protokoll des Internet of Things.

Anlagen:

 

Victoria Krautter


Leave a Reply