MQTT unter Windows installieren

Wenn man sich mit openHAB oder mit Ortungsdaten beschäftigt, ließt man immer öfters von MQTT. Eine Grundinstallation von MQTT unter Windows ist auch nicht weiter schwierig. Aber wofür ist MQTT eigentlich gut und wofür brauch ich es.

Allgemeines zu MQTT

MQTT steht für “Message Queue Telemetry Transport” und ist meiner Meinung nach schon etwas mehr als ein reines Nachrichtenprotokoll. MQTT sorgt für die Kommunikation zwischen Geräten, die nicht direkt miteinander kommunizieren können. Dabei ist MQTT nicht derjenige der die Daten liefert oder derjenige der die Daten braucht. MQTT nimmt Daten von einem Client an. Diese Daten werden mit einem Betreff (topic) versehen. Ein anderer Client kann sich jetzt bei MQTT für ein bestimmtes Betreff registrieren und bekommt dann die Daten weitergeleitet. Ein Client kann auch Daten senden und sich für den Empfangen registrieren. MQTT speichert diese Daten nur für die Übermittlung im Arbeitsspeicher.

Ich möchte MQTT benutzen um Daten eines Arduino´s an openHAB zu schicken und Änderungen eines Status am Arduino zu erhalten. Das senden geht sicher auch über ein WebRequest aber spätestens wen man auch Informationen bei einer Änderung erhalten möchte, wird es schwierig. Ich habe es auch nach mehreren Tagen nicht geschafft, mich mit dem Arduino an die REST API Schnittstelle so zu registrieren, dass ich Nachrichten von openHAB bei Änderungen erhalte.

Ich versuche als erstes das funktionierende mit MQTT abzubilden. Das senden von Informationen vom Arduino an openHAB. openHAB bietet für MQTT eine Schnittstelle und auch der Arduino hat eine Bibliothek für MQTT.

MQTTbspDiagram
image-272
Installation von MQTT unter Windows

Vorweg möchte ich sagen das die Beispielimplementation so einfach wie möglich gehalten ist. Wenn der Zugriff auch aus dem Internet möglich sein muss, dann sollte man die Authentifizierung und Verschlüsselung einrichten. Von MQT gibt es mehrere Implementierungen. Ich benutze die Umgebung von Mosquitto.

Abhängigkeiten

Ich habe bei neueren Versionen von Mosquitto beim Starten immer die folgenden Fehlemeldungen bekommen:

  • Die Ordnungszahl 314 wurde in der DLL “<PATH>\mosquitto.exe” nicht gefunden.
  • Das Programm kann nict gestartet werden, da pthreadVC2.dll auf dem Computer fehlt.

Das liegt daran, dass bestimmte Bibliotheken nicht im Installationsverzeichnis vorhanden sind. Es ist ratsam das Installationsverzeichnis z.B. “c:\Services\mosquitto” vor der Installation zu erstellen und die Dateien libeay32.dll, pthreadVC2.dll und ssleay32.dll vorher dort hinein zu kopieren. Die bezugsquellen stehen in der Datei readme-windows.txt. Die Datei ist leider erst nach der Installation da. Dadurch kann aber der Windows Dienst nicht eingerichtet werden.
Also am besten Installieren >> prüfen >> DLLs beziehen >> deinstallieren >> Verzeichnis erstellen und kopieren >> Neuinstallieren

MQTT

Von Mosquitto gibt es im Downloadbereich eine Installationsdatei für Windows. Diese Datei einfach herunterladen und Ausführen. Während der Installation muss man nur den Pfad auswählen und entscheiden ob ein Windows Dienst eingerichtet werden soll. Ich habe den Dienst mit eingerichtet. Er ist nach der Installation aber nicht gestartet, steht aber auf Automatisch.

Nach der Installation kann man einen ersten Test durchführen. In einer Eingabeaufforderung startet man den Dienst von Mosquitto (net start mosquitto) und führt eine Registrierung für ein topic aus. Dafür gibt es das Comandline Tool mosquitto_sub.exe. Der gesamte Befehl ist mosquitto_sub -d -t hallo/welt Der parameter -d steht für debug und mit -t wird das topic angegeben.

In einer zweiten Eingabeaufforderung setzt man eine Nachricht mit dem selben topic ab. Dies passiert mit dem Befehl mosquitto_pub -d -t hallo/welt -m “Hallo Mosquitto!”

Die Ausgaben sollte dann wie folgt aussehen:

Install-8-Testnachricht schicken
image-273

 

Wenn man  keine Nachichten sieht oder man möchte wissen welche Informationen der MQTT-Dienst gerade verarbeitet sollte man Mosquitto nicht als Windows-Dienst starten. Wenn man einen Fehler sucht kann man am einfachsten den Dienst beenden und den Server in einer Eingabeaufforderung starten. Danach sieht man alle Anmeldungen und abgesetzte Nachrichten samt topic. Der Parameter -v gibt alle Informationen aus. Einstellungen aus der Konfigurationsdatei werden ignoriert.

MQTTServerstart
image-274

 

OpenHAB und MQTT

Als nächstes kommt die Einbindung von openHAB. Dafür habe ich mir ein aktuelle Snapshot von openHAB geholt. Es reicht das runtime und addon Paket. Nach dem entpacken kommt das “org.openhab.binding.mqtt-1.5.1.jar” AddOn in den Ordner addons von der openHAB runtime. Danach habe ich eine kleine Items und Sitemap Datei erstellt.

test.items


Group All

Switch Test_Switch1 "Schalter 1" (All)
Switch Test_Switch2 "Schalter 2" (All)
Switch Test_Switch3 "Schalter 3" (All)

default.sitemap


sitemap default label="Test Menu"
{
Frame {
Switch item=Test_Switch1
Switch item=Test_Switch2
Switch item=Test_Switch3
}
}

openhab.cfg

Danach muss noch das Binding in der openhab.cfg koniguriert werden. Am besten kopiert man hierzu die “openhab_default.cfg” nach “openhab.cfg”. In dem Block von “MQTT Transport” habe ich folgende Zeilen hinzugefügt.

mqtt:localbroker.url=tcp://localhost:1883
mqtt:localbroker.clientId=openHABserver

mqtt-eventbus:broker=localbroker
mqtt-eventbus:commandPublishTopic=/openHAB/out/${item}/command
mqtt-eventbus:statePublishTopic=/openHAB/in/${item}/state

Auch dies ist nur eine lokale Minimalinstallation zum testen. Eine Client-ID ist zwar optional sollte aber gesetzt werden. Es kommt manchmal vor das die ID länger als 23 Zeichen ist und dann funktioniert die registrierung von openHAB an MQTT nicht. Die “mqtt-eventbus” Einträge sorgen dafür das alle Änderungen von allen Items an MQTT übergeben werden. In der Testinstallation ist das sehr schön, da man nicht für jedes Item in der Definition ein Binding eintragen muss. In einer komplexen umgebung kann das übermitteln aller Änderung aber ungewünscht sein. Ich möchte MQTT zum Beispiel ja nur zum Austausch von Informationen mit dem Arduino verwenden.

Um die Installation zu testen starten man in einer Eingabeaufforderung den Mosquitto-Server mit “mosquitto.exe -v”
In einer zweiten Eingabeaufforderung registriert man sich für das topic “mosquitto_sub -d -t /openHAB/out/#”. Damit bekommt man alle Nachrichten unterhalb von “/openHAB/out”. Das # ist eine art Wildcard.
Zuletzt startet man openHAB über die start.bat.

Danach kann man über das Web Interface den Status der Schalter ändern.

MQTTwebInterface
image-275

Die Ausgabe ist dabei in den drei Eingabeaufforderungen zu sehen.

MQTTopenhabtest
image-276

 

Weitere Informationen

 

8 Comments

  1. Fabian

    Vorweg vielen Dank für diese Beschreibung.
    Hab momentan auch OpenHab am laufen und möchte über Mqtt auf einen Arduino mit Lan zugreifen. Genau gesagt möchte ich RGB led’s steuern. Des weiteren will ich einen Mini Bewegungssensor an den Arduino anschließen und den Status +ber Mqtt melden. Leider bin ich noch nicht so erfahren in Java wie auch Arduino. Könntest du vielleicht über die Anbindung an den Arduino auch noch was schreiben. Vielen dank für deine Mühe

    1. blueAdmin

      Hallo Fabian,
      ich habe gerade noch ein Beitrag freigeschaltet. Dort Beschreibe ich wie ein Arduino eine Temperatur an MQTT sendet und den Status eines Schalters von openHAB über MQTT empfängt. Vielleicht hilft dir das weiter. Meine Dioder-Leiste steuere ich im Moment über WebRequests. Das werde ich aber auch umstellen. Dann bekommt der Arduino auch noch ein paar Schalter um diese in openHAB auswerten zu können.
      Viele Grüße,
      Jörg

  2. Pingback: Erste Schritte MQTT unter Windows | Gerhards Make

  3. Naji

    Wessen Sie Wahrscheinlich, warum ich beim mosquitto_pub oder mosquitto_sub Start, die Fehlermeldung “Die Anwendung konnte nicht korrekt gestartet werden(0xc000007b). Klicken Sie auf “OK”, um die Anwendung zu schließen.” bekomme?

  4. eugene

    hallo,

    ich habe auch den fehler:
    Die Ordnungszahl 314 wurde in der DLL „\mosquitto.exe“ nicht gefunden.

    ich habe mosquitto wieder deinstalliert, libeay32.dll, ssleay32.dll und pthreadVC2.dll in den ordner kopiert und mosquitto wieder in den selben ordner installiert.
    hat leider nicht geholfen, immernoch der selbe fehler.

    gibts es noch weitere ansätze oder ideen?

  5. Vielen Dank für den Tipp von wegen erst die DLLs rein kopieren und dann nochmal mosquitto drüber installieren!
    Ich (Windows 7) hatte auch erst die Fehlermeldung mit der Ordnungszahl 314 bekommen – und später auch die mit dem Fehler 0xc000007b.
    Zunächst waren bei meiner OpenSSL Installation die DLLs gar nicht vorhanden. Dafür müsste ich auf die ältere OpenSSL Version v1_0_2_L Light gehen. Nach dieser Installation waren die libeay32.dll und ssleay32.dll im OpenSSL Installationsordner/bin vorhanden (bei mir C:\OpenSSL-Win32\bin).
    Des Weiteren bekam ich die Meldung mit einem Problem bzgl. vcruntime140.dll. Ich hatte zwar gelesen, dass man eine 2015er Visual C++ redistributable installieren soll – dafür hätte man sich aber bei Microsoft anmelden müssen, also hab ich die vcruntime140.dll auf meinem PC (C:\Windows\System32) gesucht und ebenfalls vor der mosquitto Installation in den Ordner kopiert.
    Meine vcruntime140.dll ist vom 26.08.2016. Danach musste ich trotzdem noch mosquitto in der älteren Version 1.3.5 installieren.
    UND SCHON GEHT ES!!!

Schreibe einen Kommentar

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

39 + = 42