Das MQTT Protokoll – Praxis (Teil 2)

Während unser erster Blog-Artikel zum Thema MQTT eher theoretischer Natur war, möchten wir uns nun dem praktischen Teil widmen.

Alles was wir dazu benötigen ist eine MQTT-Client Library sowie einen Broker. Eine große Auswahl an verschiedenen Client- und Broker Implementierung bietet das Eclipse Paho Projekt. Zur Zeit stellt es Implementierungen für C, Java, Javascript, Python, Lua, C++, Embedded C und bald auch Objective-C bereit. Als Broker empfehlen wir die kostenlose Lösung von Mosquitto. Wer Probleme mit der Installation hat, sollte sich diesen Link zu Gemüte führen: Guide to Installing Mosquitto MQTT. Zu Demonstrationszwecke oder einfachen Versuchen, lohnt es sich allerdings die sogennanten Public-Brokers zu verwenden. Eine kleine Auswahl an solchen ist hier zu finden: Public Brokers.

In diesem Beispiel werden wir anhand des MQTT-Clients von Paho zeigen wie einfach das Protokoll einzusetzen ist. Die typische Aufgabe eines MQTT-Clients ist das Sammeln und die Übermittlung von Informationen eines Gerätes an einen Server. Er kann allerdings auch Topics abonnieren und empfangen um beispielsweise Aktionen auf einem Gerät auszuführen.

Die MQTT Client API ist sehr simpel gehalten und besteht im Grunde genommen aus nur folgenden Methoden:

  • connect
  • disconnect
  • subscribe
  • unsubscribe
  • publish

Die Herangehensweise eines MQTT Clients ist dabei meist die folgende:

  1. Erzeugen eines MQTT Client Objektes
  2. Setzen der Verbindungs-Optionen (Last Will)
  3. Registrierung der Callbacks
  4. Abonieren von Topics (falls benötigt)
  5. Veröffentlichung von Nachrichten

1. Bevor ein Client mit dem subscriben oder publishen von Nachrichten beginnen kann, muss dieser zunächst eine Verbindung zu einem Broker aufbauen. Hierzu wird die URL, der Port und die Client-Id benötigt. Optional kann dem Konstruktor noch die MemoryPersistance-Klasse hinzugefügt werden, diese sorgt für das Zwischenspeichern von Nachrichten, die Aufgrund eines Verbindungsproblems nicht versendet werden konnten.

MqttClient client = new MqttClient(
 "tcp:/iot.eclipse.org:1883", 
 "1234TestClient1234",
 new MemoryPersistence()
);

2. Im nächsten Schritt werden die optionalen Verbindungsoptionen festgelegt. Dazu wird eine Instanz von MqttConnectOptions erzeugt und die gewünschten Properties gesetzt. Interessant ist hierbei der „Last Will“. Mittels diesem kann der Client festlegen, was nach einem unerwarteten Verbindungsabbruch an seine Subscriber gesendet werden soll. In unserem Beispiel sagen wir, dass sobald wir offline sind, eine Nachricht an das Topic „status“ mit dem Wert „offline“ gesendet werden soll.

MqttConnectOptions connectOptions = new MqttConnectOptions(); 
connectOptions.setCleanSession(cleanSession); 
connectOptions.setKeepAliveInterval(5);
connectOptions.setWill("status", "offline".getBytes(), 2, true);

3. Im dritten Schritt, wird das MqttCallback-Interface am Client registriert. Dieser informiert uns wann eine Verbindung zum Broker abgerissen ist, eine Nachricht erfolgreich veröffentlicht oder eine Nachricht erhalten wurde.

@Override
public void messageArrived(String topic, MqttMessage msg) 
 throws Exception {
}
            
@Override
public void deliveryComplete(IMqttDeliveryToken topken) {
}
             
@Override
public void connectionLost(Throwable throwable) {
}

4. Sobald die Verbindung zum Broker steht, kann der Client mit dem subscriben und publishen von Nachrichten beginnen. Das Abonieren von Topics funktioniert über die subsrcibe Methode. Diese erhält als Parameter den Topic für den man sich registrieren möchte, sowie den Quality of Service unter welchem die Subscribtion verschickt werden soll.

client.subscribe("flotteHN/fahrzeug1/#", 2);

5. Das folgende Code-Beispiel zeigt, wie eine Nachricht veröffentlicht wird. Die Funktionsweise ist ähnlich wie die beim subscriben. Es wird erneut ein Topic und eine Quality of Service Angabe benötigt unter welcher die Nachricht gepublished wird. Hinzu kommt allerdings noch der „retained message“ Parameter. Dieser ist zuständig, das Nachricht automatisch an alle neuen Clients gesendet wird, die sich für dieses Topic registriert haben. Somit wird sichergestellt, dass jeder Subscribende Client, über den zuletzt bekannten Wert informiert wird.

client.publish("flotteHN/fahrzeug1", payload.getBytes(), 2, true);

Wie man sieht ist die Umsetzung wirklich einfach und die Anzahl an Anwendungsgebieten scheinbar grenzenlos. Denn nicht nur im M2M Bereich macht es Sinn MQTT als Protokoll einzusetzen. Facebook zum Beispiel nutzt MQTT für ihren Chat. Durch die geringe Latenzzeit, die minimale Beanspruchung der Bandbreite und die Ressourcensparende Implementierung eignet es sich hervorragend für diesen Use-Case.

Für diejenigen die sich MQTT etwas genauer ansehen oder damit etwas rumspielen möchten, denen empfehle ich unser Beispiel-Projekt: MQTT_Example

 

Bewerte diesen Beitrag
0 Kommentare

Dein Kommentar

Want to join the discussion?
Feel free to contribute!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

  Newsletter abonnieren (Jederzeit wieder abbestellbar)