IoT Workshop / Mosquitto

Hubert Högl,

2024-07-11

Mosquitto ist ein MQTT-Broker.

Homepage https://projects.eclipse.org/projects/iot.mosquitto

Achtung: Die MQTT und Websocket Verbindungen sind unsicher, da der anonyme Zugang erlaubt wurde und auch keine Verschluesselung (SSL/TLS) verwendet wurde! Somit ist diese Konfiguration nur zum Ueben und Testen in einem lokalen Netz geeignet!

Installation auf PC unter Linux

sudo apt install mosquitto

Nach der Installation läuft der Broker bereits.

Ich verwende zum Test den in Go geschriebenen MQTT Client mqttcli. Dieses Programm vereint die Funktionalität der beiden Programm mosquitto_sub und mosquitto_pub in einem einzigen Werkzeug. Natürlich könnte man auch die beiden mosquitto Tools zum Test nehmen.

Github Repo für mqttcli: https://github.com/shirou/mqttcli

Auf github findet man unter “Releases” eine ausführbare Datei zum Download.

Zum Test Client lokal starten (mit Ctrl-C beenden):

hhoegl@znano:~$ mqttcli sub  -d -t hello/world
INFO[0000] Broker URI: tcp://localhost:1883             
INFO[0000] Topic: hello/world                           
INFO[0000] connecting...                                
INFO[0000] client connected       
<blockiert>

Die mosquitto Konfigurationsdatei ist hier:

/etc/mosquitto/mosquitto.conf

In diese die folgenden Zeilen einfuegen, sonst kann man sich nicht von einem anderen Rechner aus verbinden:

listener 1883
password_file /etc/mosquitto/passwd
allow_anonymous true

Falls man auch Websockets aktivieren moechte, dann muss man noch zusaetzlich die folgenden Zeilen einfuegen:

listener 8080
protocol websockets

Eine leere Passwort-Datei anlegen:

$ sudo touch /etc/mosquitto/passwd

Falls man Änderungen an den Konfigurationsdateien macht sollte man immer den MQTT Broker neu starten mit dem folgenden Kommando:

systemctl restart mosquitto.service

Quelle: https://cedalo.com/blog/enabling-websockets-over-mqtt-with-mosquitto/ (verwendet den MQTT Explorer).

Den Mosquitto Server mit systemd verwalten

Service neu starten:

systemctl restart mosquitto.service

Status abfragen

systemctl status mosquitto.service

Stoppen mit

systemctl stop mosquitto.service

Starten mit

systemctl start mosquitto.service

Logdatei anschauen

sudo less /var/log/mosquitto/mosquitto.log

Clients mosquitto_pub, mosquitto_sub

apt install mosquitto-clients 

Beispiel

In den folgenden Beispielen muss natürlich ihre IP Adresse angepasst werden!

Terminalfenster 1:

$ mqttcli sub --host 192.168.178.89 -d -t hello/world

Terminalfenster 2:

$ mqttcli pub --host 192.168.178.89 -d -t hello/world -m "Hello from Terminal window 2!"

Nun verwende ich nicht mehr mqttcli sondern testweise das mqttx-cli Werkzeug, das es unter https://mqttx.app/cli gibt. Das ist ein freies Kommandozeilenwerkzeug das MQTT 5.0 unterstützt. Es gibt auch ein GUI Programm unter https://mqttx.app.

Mit mqttx-cli sehen die Kommandozeilen in etwa so aus (Die Debug-Option heisst hier --debug):

$ mqttx-cli sub -h 192.168.178.89 -t hello/world
$ mqttx-cli pub -h 192.168.178.89 -t hello/world -m "Hello from Terminal window 2!"

Mit mosquitto_sub/pub würden die Kommandozeilen ähnlich aussehen:

$ mosquitto_sub -d -t hello/world
$ mosquitto_pub -d -t hello/world -m "Hello from Terminal window 2!"

Hilfe zu mosquitto (man pages)

man mosquitto

SEE ALSO
mqtt(7), mosquitto-tls(7), mosquitto.conf(5), hosts_access(5), mosquitto_ctrl(1), 
mosquitto_passwd(1), mosquitto_pub(1), mosquitto_rr(1), mosquitto_sub(1), libmosquitto(3)

Das mqttx-cli Tool kann auch MQTT über Websockets. Hier ist eine Demo:

$ mqttx-cli --version                                   │                             
1.10.0                                                  │INFO[0000] Broker URI: tcp://192.168.178.89:1883        
https://mqttx.app/changelogs/v1.10.0  

# Websocket connection
$ mqttx-cli conn -l ws -h 192.168.178.89 -p 8080

# Websocket (-l ws), mosquitto is configured with port 8080
$ mqttx-cli sub -l ws -p 8080 -h 192.168.178.89 -t hello/world

# Publisher can send eith with mqtt or ws protocol
$ mqttx-cli pub -h 192.168.178.89 -t hello/world -m "Hello from Terminal window 2!"
$ mqttx-cli pub -l ws -p 8080 -h 192.168.178.89 -t hello/world -m "Hello from Terminal window 2!"

Pub/sub mit Python

Abschliessend ist hier noch ein Publisher und ein Subscriber, beide sind in Python geschrieben: