Suche

Dialog der Maschinen

Subscribe

Nun wollen wir einen weiteren Client implementieren, der die Topics homeautomation/brightness und homeautomation/temperature abonniert. Auch hierzu erzeugen wir ein MqttClient-Objekt und übergeben den Broker URL und die Client-ID. Als Client-ID benutzen wir diesmal die MAC-Adresse mit einem angehängten -sub, damit wir nicht dieselbe Client-ID wie für den Publisher benutzen.

Wir erzeugen nun eine neue Klasse, die das Interface MQTTCallback implementiert. Das MqttCallback-Interface definiert drei Methoden, die es nun zu implementieren gilt: connectionLost, messageArrived und deliveryComplete. connectionLost wird aufgerufen, sobald ein unerwarteter Abbruch der Verbindung mit dem MQTT Broker entsteht. Hier könnte man beispielsweise eine Logik zum erneuten Verbinden zum Broker implementieren. Die Methode messageArrived wird aufgerufen, sobald der Broker eine neue Nachricht sendet. Zuletzt gibt es noch die Methode deliveryComplete, die aufgerufen wird, sobald man eine Nachricht selbst gesendet hat und die Nachricht bei den Clients angekommen ist. Das ist besonders nützlich, wenn als Quality of Service Level 1 oder 2 gewählt wurde, da es unter Umständen ein bisschen dauert, bis alle Nachrichten bei den Empfängern angekommen sind. Wir entscheiden uns, nur die messageArrived-Methode zu implementieren (Listing 4).

Nachdem wir nun den Callback implementiert haben, können wir den Callback dem MqttClient-Objekt übergeben und uns mit dem MQTT Broker verbinden. Danach abonnieren wir das Topic homeautomation inklusive allen Subtopics mittels einer Wildcard (Listing 5).

Listing 4
public class SubscribeCallback implements MqttCallback {
    @Override
    public void connectionLost(Throwable cause) {}

    @Override
    public void messageArrived(MqttTopic topic, MqttMessage message){
        System.out.println("Message arrived. Topic: " + topic.getName() + "  
                            Message: " + message.toString());

        if ("homeautomation/LWT".equals(topic.getName())) {
            System.err.println("Publisher gone!");
        }
    }

    @Override
    public void deliveryComplete(MqttDeliveryToken token) {}
}
Listing 5
 mqttClient.setCallback(new SubscribeCallback());
 mqttClient.connect();
 mqttClient.subscribe("homeautomation/#");
Ausführen der Clients

Nachdem nun sowohl der Publisher als auch der Subscriber implementiert wurden, ist es Zeit, beide Applikationen auszuführen. Wir starten nun zuerst den Subscriber und danach den Publisher. Sobald der Publisher startet, kommen Nachrichten beim Subscriber an. Wenn man das Publisher-Programm nun beendet, wird der Subscriber benachrichtigt, dass der Publisher-Client „gestorben“ ist, da auch das Last Will and Testament Topic abonniert wird. Herzlichen Glückwunsch, Sie haben nun ihre erste M2M-Kommunikation mit MQTT implementiert!

Fazit

Wie wir gesehen haben, ist es möglich, mit sehr wenig Code Programme, die mittels MQTT kommunizieren, selbst zu erstellen. Die Eclipse-Paho-Bibliothek bietet alle Funktionen, die in der MQTT-Spezifikation beschrieben sind, und ermöglicht eine Kommunikation unter Geräten mit sehr wenig Protokoll-Overhead. Die Paho Community ist noch jung, wächst aber mit jedem Tag. Es lohnt sich, die Entwicklung rund um das Projekt zu verfolgen!

Listing 5
Dominik Obermaier entwickelt bei der dc-square GmbH M2M-Lösungen und ist verantwortlich für die Architektur von Webapplikationen auf Basis von JavaEE 6. (Twitter: @dobermai)
Kommentare

Schreibe einen Kommentar

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