Guías

mosquitto_pub y mosquitto_sub: ejemplos de comandos y chuleta

Ejemplos de mosquitto_pub y mosquitto_sub para copiar y pegar: tabla de opciones, QoS, mensajes retenidos, auth, TLS, MQTT 5, archivos, modo línea y formato -F.

Actualizado · 7 min de lectura

mosquitto_pub y mosquitto_sub son las navajas suizas de MQTT. Vienen con Mosquitto (en Debian/Ubuntu en el paquete mosquitto-clients — consulta cómo instalar Mosquitto) y funcionan con cualquier broker MQTT, no solo con Mosquitto. Esta chuleta reúne las opciones y los ejemplos que de verdad necesitas.

La ida y vuelta básica

Suscríbete en una terminal y publica en otra:

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'

Pon siempre los topics entre comillas en la shell: # inicia un comentario en bash y zsh, y + o * pueden expandirse de forma inesperada. Las reglas de los comodines se explican en topics y comodines MQTT.

Mira los mensajes en el cliente online

Chuleta de opciones

OpciónHerramientaSignificado
-hambasHost del broker (por defecto localhost)
-pambasPuerto (por defecto 1883, u 8883 con TLS)
-tambasTopic; mosquitto_sub lo acepta varias veces
-mpubPayload del mensaje
-qambasQoS 0, 1 o 2
-rpubActiva el flag retain
-u / -PambasUsuario / contraseña
-iambasClient ID (aleatorio si se omite)
-vsubImprime el topic antes del payload
-dambasDepuración: imprime cada paquete MQTT enviado y recibido
--cafileambasCertificado de CA para TLS (también --capath, --cert, --key)
-V mqttv5ambasVersión del protocolo: mqttv31, mqttv311 (por defecto) o mqttv5
-lpubLee stdin y envía cada línea como un mensaje independiente
-fpubEnvía el contenido de un archivo como un único mensaje
-spubEnvía todo stdin como un único mensaje
-npubEnvía un mensaje vacío (longitud cero)
-WsubTermina tras N segundos
-CsubTermina tras recibir N mensajes
-RsubNo imprime mensajes retenidos antiguos
-FsubFormato de salida personalizado (topic, payload, QoS, marcas de tiempo…)

Ejemplos de mosquitto_pub

QoS 1 con credenciales y un client ID fijo
mosquitto_pub -h broker.example.com -u alice -P 'secret' -i sensor-01 \
  -q 1 -t 'home/livingroom/temp' -m '21.5'
Payload JSON (las comillas simples evitan que la shell lo toque)
mosquitto_pub -t 'devices/42/state' -m '{"on":true,"brightness":80}'
Enviar un archivo, o líneas en streaming desde otro comando
mosquitto_pub -t 'firmware/blob' -f ./payload.bin
tail -f /var/log/app.log | mosquitto_pub -t 'logs/app' -l

Fijar y borrar mensajes retenidos

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

Cada nuevo suscriptor recibe de inmediato el valor retenido hasta que lo borres. Contexto: mensajes retenidos de MQTT.

Ejemplos de mosquitto_sub

Varios topics, salida detallada, QoS 1
mosquitto_sub -h broker.example.com -u alice -P 'secret' -q 1 -v \
  -t 'home/+/temp' -t 'home/+/humidity'
Coger un mensaje y salir (ideal en scripts)
value=$(mosquitto_sub -t 'home/livingroom/temp' -C 1 -W 10)
echo "temperature: $value"
Ignorar mensajes retenidos antiguos
mosquitto_sub -t 'devices/#' -v -R
Formato personalizado con -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 .

Tokens habituales de -F: %t topic, %p payload, %q QoS, %r flag retain, %l longitud del payload, %I hora ISO-8601, %U hora Unix con nanosegundos, %x payload en hexadecimal.

Ejemplos con TLS

Servidor verificado por una CA concreta
mosquitto_sub -h broker.example.com -p 8883 --cafile ca.crt -t 'secure/#' -v
Broker con un certificado público (p. ej. 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'
Certificado de cliente (TLS mutuo)
mosquitto_pub -h broker.example.com -p 8883 --cafile ca.crt \
  --cert client.crt --key client.key -t 'secure/hello' -m 'mTLS'

--insecure omite la verificación del nombre de host — práctico en un laboratorio, peligroso en cualquier otro sitio. Qué puerto es cuál se resume en puertos MQTT.

Ejemplos con MQTT 5

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 fija una propiedad de MQTT 5 para un tipo de paquete concreto. Consulta MQTT 5 vs 3.1.1 para ver qué hacen las nuevas propiedades.

Patrones para scripts

Como ambas herramientas terminan con un código de salida distinto de cero cuando no pueden conectarse, encajan muy bien en scripts de shell, tareas cron y health checks.

Health check sencillo del 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; }
Publicar una lectura cada 10 segundos
while true; do
  mosquitto_pub -t 'lab/cpu/load' -m "$(cut -d' ' -f1 /proc/loadavg)"
  sleep 10
done
Registrar todo en un archivo con marcas de tiempo
mosquitto_sub -h broker.example.com -u alice -P 'secret' -t 'devices/#' \
  -F '%I %t %p' >> mqtt.log

Abrir una conexión nueva para cada mensaje está bien para unos pocos mensajes por segundo. Para tasas más altas, mantén una conexión abierta con -l y envíale líneas por una tubería, o pasa a una librería cliente.

Errores habituales

  • # sin comillas — mosquitto_sub -t devices/# funciona en algunas shells y en otras se convierte silenciosamente en devices/. Ponlo entre comillas.
  • El mismo client ID dos veces — ejecutar dos comandos con el mismo -i hace que el broker desconecte el más antiguo, lo que parece una caída aleatoria. Omite -i salvo que lo necesites, o usa el generador de client ID.
  • Esperar mensajes antiguos — mosquitto_sub solo recibe los mensajes publicados después de suscribirse, más el mensaje retenido de cada topic. No se guarda nada más para una nueva sesión limpia.
  • Payload demasiado grande — los brokers pueden limitar el tamaño de los mensajes; comprueba el tuyo con la calculadora de tamaño de paquete.

¿Y los WebSockets?

Las builds estándar de mosquitto_pub y mosquitto_sub solo hablan MQTT sobre TCP y TLS; no pueden conectarse a un endpoint ws:// o wss://. Para probar el listener WebSocket de un broker, usa el cliente MQTT online o una librería como MQTT.js — y lee MQTT sobre WebSockets para los detalles. Si prefieres un fragmento listo en tu lenguaje, el generador de código MQTT te lo escribe.

Preguntas frecuentes

¿Cómo borro un mensaje retenido con mosquitto_pub?

Publica un mensaje retenido vacío en el mismo topic: mosquitto_pub -t el/topic -r -n. El broker elimina el mensaje retenido almacenado para ese topic.

¿Cómo veo el nombre del topic en la salida de mosquitto_sub?

Añade -v (verbose). Cada línea se imprime entonces como el topic seguido de un espacio y el payload. Para un control total usa -F con una cadena de formato como -F "%t %p".

¿Puede mosquitto_pub conectarse por WebSockets?

No en las builds estándar. mosquitto_pub y mosquitto_sub solo hablan MQTT sobre TCP y TLS. Para probar un endpoint WebSocket, usa un cliente en el navegador o una librería como MQTT.js.