Guias

mosquitto_pub e mosquitto_sub: exemplos de comandos e colinha

Exemplos prontos de mosquitto_pub e mosquitto_sub: tabela de flags, QoS, mensagens retidas, autenticação, TLS, MQTT 5, arquivos, modo linha e saída com -F.

Atualizado · 7 min de leitura

mosquitto_pub e mosquitto_sub são os canivetes suíços do MQTT. Eles vêm com o Mosquitto (no Debian/Ubuntu, no pacote mosquitto-clients — veja como instalar o Mosquitto) e funcionam com qualquer broker MQTT, não só com o Mosquitto. Esta colinha reúne as flags e os exemplos de que você realmente precisa.

A ida e volta básica

Assine em um terminal e publique em outro:

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'

Sempre coloque os tópicos entre aspas no shell: # inicia um comentário no bash e no zsh, e + ou * podem ser expandidos de forma inesperada. As regras de curingas são explicadas em tópicos e curingas MQTT.

Veja as mensagens no cliente online

Colinha de flags

FlagFerramentaSignificado
-hambasHost do broker (padrão localhost)
-pambasPorta (padrão 1883, ou 8883 com TLS)
-tambasTópico; o mosquitto_sub aceita várias vezes
-mpubPayload da mensagem
-qambasQoS 0, 1 ou 2
-rpubAtiva a flag retain
-u / -PambasUsuário / senha
-iambasClient ID (aleatório se omitido)
-vsubImprime o tópico antes do payload
-dambasDebug: imprime cada pacote MQTT enviado e recebido
--cafileambasCertificado da CA para TLS (também --capath, --cert, --key)
-V mqttv5ambasVersão do protocolo: mqttv31, mqttv311 (padrão) ou mqttv5
-lpubLê o stdin e envia cada linha como uma mensagem separada
-fpubEnvia o conteúdo de um arquivo como uma única mensagem
-spubEnvia todo o stdin como uma única mensagem
-npubEnvia uma mensagem vazia (comprimento zero)
-WsubSai após N segundos
-CsubSai após receber N mensagens
-RsubNão imprime mensagens retidas antigas
-FsubFormato de saída personalizado (tópico, payload, QoS, timestamps…)

Exemplos de mosquitto_pub

QoS 1 com credenciais e client ID fixo
mosquitto_pub -h broker.example.com -u alice -P 'secret' -i sensor-01 \
  -q 1 -t 'home/livingroom/temp' -m '21.5'
Payload JSON (aspas simples evitam que o shell mexa nele)
mosquitto_pub -t 'devices/42/state' -m '{"on":true,"brightness":80}'
Enviar um arquivo, ou transmitir linhas de outro comando
mosquitto_pub -t 'firmware/blob' -f ./payload.bin
tail -f /var/log/app.log | mosquitto_pub -t 'logs/app' -l

Definir e apagar mensagens retidas

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

Todo novo assinante recebe o valor retido imediatamente, até você apagá-lo. Contexto: mensagens retidas (retained) no MQTT.

Exemplos de mosquitto_sub

Vários tópicos, saída detalhada, QoS 1
mosquitto_sub -h broker.example.com -u alice -P 'secret' -q 1 -v \
  -t 'home/+/temp' -t 'home/+/humidity'
Pegar uma mensagem e sair (ótimo em scripts)
value=$(mosquitto_sub -t 'home/livingroom/temp' -C 1 -W 10)
echo "temperature: $value"
Ignorar mensagens retidas antigas
mosquitto_sub -t 'devices/#' -v -R
Formato personalizado com -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 comuns do -F: %t tópico, %p payload, %q QoS, %r flag retain, %l tamanho do payload, %I hora em ISO-8601, %U hora Unix com nanossegundos, %x payload em hexadecimal.

Exemplos com TLS

Servidor verificado por uma CA específica
mosquitto_sub -h broker.example.com -p 8883 --cafile ca.crt -t 'secure/#' -v
Broker com certificado público (ex.: 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 (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 pula a verificação do hostname — útil em laboratório, perigoso em qualquer outro lugar. Qual porta é qual está resumido em portas MQTT.

Exemplos com 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 define uma propriedade do MQTT 5 para um determinado tipo de pacote. Veja MQTT 5 vs 3.1.1 para saber o que as novas propriedades fazem.

Padrões para scripts

Como as duas ferramentas saem com status diferente de zero quando não conseguem conectar, elas se encaixam bem em scripts shell, cron jobs e health checks.

Health check simples do 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 uma leitura a cada 10 segundos
while true; do
  mosquitto_pub -t 'lab/cpu/load' -m "$(cut -d' ' -f1 /proc/loadavg)"
  sleep 10
done
Registrar tudo em um arquivo com timestamps
mosquitto_sub -h broker.example.com -u alice -P 'secret' -t 'devices/#' \
  -F '%I %t %p' >> mqtt.log

Abrir uma nova conexão para cada mensagem não tem problema com poucas mensagens por segundo. Para taxas maiores, mantenha uma conexão aberta com -l e envie linhas para ela por pipe, ou passe a usar uma biblioteca cliente.

Erros comuns

  • # sem aspas — mosquitto_sub -t devices/# funciona em alguns shells e, em outros, vira devices/ sem aviso. Use aspas.
  • O mesmo client ID duas vezes — rodar dois comandos com o mesmo -i faz o broker desconectar o mais antigo, o que parece uma queda aleatória. Omita o -i a menos que precise dele, ou use o gerador de client ID.
  • Esperar mensagens antigas — o mosquitto_sub só recebe mensagens publicadas depois que ele assina, mais a mensagem retida de cada tópico. Nada mais é armazenado para uma nova sessão limpa.
  • Payload grande demais — brokers podem limitar o tamanho das mensagens; confira o seu com a calculadora de tamanho de pacote.

E os WebSockets?

Os builds padrão do mosquitto_pub e do mosquitto_sub falam MQTT apenas sobre TCP e TLS; eles não conseguem se conectar a um endpoint ws:// ou wss://. Para testar o listener WebSocket de um broker, use o cliente MQTT online ou uma biblioteca como o MQTT.js — e leia MQTT sobre WebSockets para os detalhes. Se preferir um snippet pronto na sua linguagem, o gerador de código MQTT escreve um para você.

Perguntas frequentes

Como apago uma mensagem retida com o mosquitto_pub?

Publique uma mensagem retida vazia no mesmo tópico: mosquitto_pub -t the/topic -r -n. O broker remove a mensagem retida armazenada para aquele tópico.

Como vejo o nome do tópico na saída do mosquitto_sub?

Adicione -v (verbose). Cada linha passa a ser impressa como o tópico seguido de um espaço e do payload. Para controle total, use -F com uma string de formato como -F "%t %p".

O mosquitto_pub consegue se conectar via WebSockets?

Não nos builds padrão. mosquitto_pub e mosquitto_sub falam MQTT apenas sobre TCP e TLS. Para testar um endpoint WebSocket, use um cliente no navegador ou uma biblioteca como o MQTT.js.