Anleitungen

mosquitto_pub und mosquitto_sub: Befehlsbeispiele & Cheat Sheet

mosquitto_pub- und mosquitto_sub-Beispiele zum Kopieren: Flag-Tabelle, QoS, Retained Messages, Auth, TLS, MQTT 5, Dateien, Zeilenmodus und Ausgabe filtern mit -F.

Aktualisiert · 7 Min. Lesezeit

mosquitto_pub und mosquitto_sub sind die Schweizer Taschenmesser von MQTT. Sie kommen mit Mosquitto (unter Debian/Ubuntu im Paket mosquitto-clients – siehe Mosquitto installieren) und funktionieren mit jedem MQTT-Broker, nicht nur mit Mosquitto. Dieses Cheat Sheet sammelt die Flags und Beispiele, die du wirklich brauchst.

Der grundlegende Round Trip

Subscribe in einem Terminal, publishe in einem anderen:

Terminal 1
mosquitto_sub -h test.mosquitto.org -t 'testmqtt/cheatsheet/#' -v
Terminal 2
mosquitto_pub -h test.mosquitto.org -t 'testmqtt/cheatsheet/hello' -m 'hello world'

Setze Topics in der Shell immer in Anführungszeichen: # leitet in bash und zsh einen Kommentar ein, und + oder * können unerwartet expandiert werden. Die Wildcard-Regeln erklärt MQTT-Topics und Wildcards.

Nachrichten im Online-Client ansehen

Cheat Sheet der Flags

FlagToolBedeutung
-hbeideBroker-Host (Standard localhost)
-pbeidePort (Standard 1883, mit TLS 8883)
-tbeideTopic; mosquitto_sub akzeptiert es mehrfach
-mpubPayload der Nachricht
-qbeideQoS 0, 1 oder 2
-rpubRetain-Flag setzen
-u / -PbeideBenutzername / Passwort
-ibeideClient-ID (zufällig, wenn weggelassen)
-vsubTopic vor der Payload ausgeben
-dbeideDebug: jedes gesendete und empfangene MQTT-Paket ausgeben
--cafilebeideCA-Zertifikat für TLS (außerdem --capath, --cert, --key)
-V mqttv5beideProtokollversion: mqttv31, mqttv311 (Standard) oder mqttv5
-lpubstdin lesen und jede Zeile als eigene Nachricht senden
-fpubDen Inhalt einer Datei als eine Nachricht senden
-spubDen gesamten stdin als eine Nachricht senden
-npubEine leere Nachricht (Länge null) senden
-WsubNach N Sekunden beenden
-CsubNach N empfangenen Nachrichten beenden
-RsubVeraltete Retained Messages nicht ausgeben
-FsubEigenes Ausgabeformat (Topic, Payload, QoS, Zeitstempel…)

Beispiele für mosquitto_pub

QoS 1 mit Zugangsdaten und fester Client-ID
mosquitto_pub -h broker.example.com -u alice -P 'secret' -i sensor-01 \
  -q 1 -t 'home/livingroom/temp' -m '21.5'
JSON-Payload (einfache Anführungszeichen halten die Shell fern)
mosquitto_pub -t 'devices/42/state' -m '{"on":true,"brightness":80}'
Eine Datei senden oder Zeilen aus einem anderen Befehl streamen
mosquitto_pub -t 'firmware/blob' -f ./payload.bin
tail -f /var/log/app.log | mosquitto_pub -t 'logs/app' -l

Retained Messages setzen und löschen

bash
# store "online" as the retained value
mosquitto_pub -t 'devices/42/status' -m 'online' -r

# clear it: empty payload + retain flag
mosquitto_pub -t 'devices/42/status' -r -n

Jeder neue Subscriber bekommt den Retained-Wert sofort, bis du ihn löschst. Hintergrund: MQTT Retained Messages.

Beispiele für mosquitto_sub

Mehrere Topics, ausführliche Ausgabe, QoS 1
mosquitto_sub -h broker.example.com -u alice -P 'secret' -q 1 -v \
  -t 'home/+/temp' -t 'home/+/humidity'
Eine Nachricht abholen und beenden (super in Skripten)
value=$(mosquitto_sub -t 'home/livingroom/temp' -C 1 -W 10)
echo "temperature: $value"
Veraltete Retained Messages ignorieren
mosquitto_sub -t 'devices/#' -v -R
Eigenes Format mit -F
# ISO-8601 timestamp, QoS, topic, payload
mosquitto_sub -t 'devices/#' -F '%I q%q %t %p'

# just the payloads, one per line, e.g. for jq
mosquitto_sub -t 'devices/+/state' -F '%p' | jq .

Gängige -F-Tokens: %t Topic, %p Payload, %q QoS, %r Retain-Flag, %l Länge der Payload, %I ISO-8601-Zeit, %U Unix-Zeit mit Nanosekunden, %x Payload als Hex.

TLS-Beispiele

Server, verifiziert durch eine bestimmte CA
mosquitto_sub -h broker.example.com -p 8883 --cafile ca.crt -t 'secure/#' -v
Broker mit öffentlichem Zertifikat (z. B. Let’s Encrypt)
mosquitto_pub -h broker.example.com -p 8883 --capath /etc/ssl/certs \
  -u alice -P 'secret' -t 'secure/hello' -m 'over TLS'
Client-Zertifikat (Mutual TLS)
mosquitto_pub -h broker.example.com -p 8883 --cafile ca.crt \
  --cert client.crt --key client.key -t 'secure/hello' -m 'mTLS'

--insecure überspringt die Hostnamen-Prüfung – praktisch im Labor, überall sonst gefährlich. Welcher Port wofür ist, fasst MQTT-Ports zusammen.

MQTT-5-Beispiele

bash
# publish with a message expiry and content type
mosquitto_pub -V mqttv5 -t 'jobs/1' -m '{"run":true}' \
  -D publish message-expiry-interval 60 \
  -D publish content-type application/json

# subscriber prints properties with -F
mosquitto_sub -V mqttv5 -t 'jobs/#' -F '%t %p (expiry %E)'

-D setzt eine MQTT-5-Property für einen bestimmten Pakettyp. Was die neuen Properties bewirken, erklärt MQTT 5 vs. 3.1.1.

Muster für Skripte

Da beide Tools mit einem Exit-Status ungleich null enden, wenn sie sich nicht verbinden können, passen sie nahtlos in Shell-Skripte, Cronjobs und Health Checks.

Einfacher Health Check für den Broker
#!/usr/bin/env bash
# exits 0 if a message makes the round trip within 5 seconds
TOPIC="health/$(hostname)/$RANDOM"
mosquitto_sub -h broker.example.com -u monitor -P 'secret' -t "$TOPIC" -C 1 -W 5 > /dev/null &
SUB=$!
sleep 1
mosquitto_pub -h broker.example.com -u monitor -P 'secret' -t "$TOPIC" -m ping
wait $SUB && echo "broker OK" || { echo "broker FAILED"; exit 1; }
Alle 10 Sekunden einen Messwert publishen
while true; do
  mosquitto_pub -t 'lab/cpu/load' -m "$(cut -d' ' -f1 /proc/loadavg)"
  sleep 10
done
Alles mit Zeitstempeln in eine Datei loggen
mosquitto_sub -h broker.example.com -u alice -P 'secret' -t 'devices/#' \
  -F '%I %t %p' >> mqtt.log

Für jede Nachricht eine neue Verbindung zu öffnen ist bei ein paar Nachrichten pro Sekunde in Ordnung. Bei höheren Raten hältst du mit -l eine Verbindung offen und pipest Zeilen hinein – oder wechselst zu einer Client-Bibliothek.

Häufige Fehler

  • # ohne Anführungszeichen – mosquitto_sub -t devices/# funktioniert in manchen Shells und wird in anderen stillschweigend zu devices/. Setz es in Anführungszeichen.
  • Dieselbe Client-ID doppelt – laufen zwei Befehle mit demselben -i, trennt der Broker den älteren, was wie ein zufälliger Abbruch aussieht. Lass -i weg, wenn du es nicht brauchst, oder nutze den Client-ID-Generator.
  • Alte Nachrichten erwarten – mosquitto_sub empfängt nur Nachrichten, die nach dem Subscribe gepublisht werden, plus die Retained Message pro Topic. Für eine neue Clean Session wird sonst nichts gespeichert.
  • Payload zu groß – Broker können die Nachrichtengröße begrenzen; prüfe deine mit dem Paketgrößen-Rechner.

Und WebSockets?

Die Standard-Builds von mosquitto_pub und mosquitto_sub sprechen MQTT nur über TCP und TLS; mit einem ws://- oder wss://-Endpunkt können sie sich nicht verbinden. Um den WebSocket-Listener eines Brokers zu testen, nutze den Online-MQTT-Client oder eine Bibliothek wie MQTT.js – Details findest du unter MQTT über WebSockets. Wenn du lieber ein fertiges Snippet in deiner Sprache willst, schreibt dir der MQTT-Code-Generator eins.

Häufig gestellte Fragen

Wie lösche ich eine Retained Message mit mosquitto_pub?

Publishe eine leere Retained Message auf dasselbe Topic: mosquitto_pub -t the/topic -r -n. Der Broker entfernt dann die für dieses Topic gespeicherte Retained Message.

Wie sehe ich den Topic-Namen in der Ausgabe von mosquitto_sub?

Ergänze -v (verbose). Jede Zeile wird dann als Topic, gefolgt von einem Leerzeichen und der Payload, ausgegeben. Volle Kontrolle hast du mit -F und einem Format-String wie -F "%t %p".

Kann sich mosquitto_pub über WebSockets verbinden?

In den Standard-Builds nicht. mosquitto_pub und mosquitto_sub sprechen MQTT nur über TCP und TLS. Um einen WebSocket-Endpunkt zu testen, nutze einen browserbasierten Client oder eine Bibliothek wie MQTT.js.