Testes de brokers

HiveMQ MQTT CLI: teste qualquer broker pelo terminal

Use a HiveMQ MQTT CLI open source para testar qualquer broker: instalação, pub/sub, shell interativo e mqtt test para descobrir recursos do broker.

Atualizado · 8 min de leitura

HiveMQ MQTT CLI: teste qualquer broker pelo terminal

A HiveMQ MQTT CLI (mqtt-cli) é um cliente de linha de comando open source, baseado em Java, que funciona com qualquer broker MQTT. O comando é simplesmente mqtt, e quatro subcomandos cobrem quase todo teste pelo terminal: mqtt pub, mqtt sub, o shell interativo mqtt shell e o mqtt test, que verifica o que um broker suporta.

Este guia mostra como instalá-la, conectar a um broker real com TLS e credenciais, usar propriedades do MQTT 5 e rodar o teste de recursos — com comandos prontos para colar.

Instalar o mqtt-cli

PlataformaComando
macOS (Homebrew)brew install hivemq/mqtt-cli/mqtt-cli
Dockerdocker run --rm -it hivemq/mqtt-cli <comando>
Debian / Ubuntu, RPMPacotes na página de releases do hivemq/mqtt-cli no GitHub
Qualquer SO com JavaBaixe o mqtt-cli-<version>.jar e rode java -jar mqtt-cli-<version>.jar

As versões recentes também trazem binários nativos, então nem sempre é preciso ter Java. Confira a instalação com mqtt --version. Com Docker, o entry point da imagem é a CLI, então docker run --rm -it hivemq/mqtt-cli pub -h ... substitui mqtt pub -h ....

Publicar e assinar

Abra dois terminais. Inicie o assinante primeiro, para que ele esteja escutando quando a mensagem chegar:

Terminal 1 — assinar e mostrar os topics
mqtt sub -h broker.connectmq.com -p 1883 \
  -t 'testmqtt/cli/#' -q 1 -T
Terminal 2 — publicar
mqtt pub -h broker.connectmq.com -p 1883 \
  -t 'testmqtt/cli/hello' -m 'Hello from mqtt-cli' -q 1

-T (--showTopics) imprime o topic antes de cada payload, o que é necessário ao assinar com wildcards. As opções mais usadas:

OpçãoSignificado
-h, -pHost e porta (padrão: localhost, 1883)
-tTopic (pub) ou filtro de topic (sub); repita -t para assinar vários
-mPayload da mensagem; -m:file payload.json lê de um arquivo
-qQoS 0, 1 ou 2
-rPublicar como retida
-iClient identifier
-u, -pwUsuário e senha (atenção: -pw, não -P)
-V 3 / -V 5Versão do protocolo; MQTT 5 é o padrão
-d, -vLogs de debug e detalhados, incluindo os pacotes trocados

Duas flags do assinante são úteis em scripts: -J (--jsonOutput) imprime cada mensagem como um objeto JSON com topic, QoS e payload, e -of messages.log (--outputToFile) grava tudo em um arquivo. Passe o JSON pelo jq e você tem uma ferramenta rápida de asserções.

Credenciais e TLS

Publicação autenticada via TLS (porta 8883)
mqtt pub -h broker.connectmq.com -p 8883 -s \
  -u "$MQTT_USER" -pw "$MQTT_PASS" \
  -t 'testmqtt/cli/secure' -m 'over TLS'

-s (--secure) ativa TLS com o trust store do sistema. Para um broker com CA privada, adicione --cafile ca.pem; para TLS mútuo, adicione --cert client.pem --key client.key. Um handshake com falha imprime uma exceção SSL do Java — veja testar a conexão TLS para isolar antes os problemas de certificado com openssl.

WebSocket

Apps de navegador chegam ao broker via WebSocket, e às vezes proxies quebram justamente esse caminho. Teste diretamente:

Assinar via WebSocket seguro
mqtt sub -h broker.connectmq.com -p 8084 -s \
  -ws -ws:path /mqtt \
  -t 'testmqtt/cli/#' -T

Se isso funciona mas o seu app web não, o problema está no navegador (conteúdo misto, CORS, URL errada), não no broker.

Propriedades do MQTT 5

O mqtt pub expõe as propriedades do PUBLISH do MQTT 5 como flags, o que é prático para verificar se um broker as repassa:

Publicar com propriedades do MQTT 5
mqtt pub -h broker.connectmq.com -p 1883 \
  -t 'testmqtt/cli/props' -m '{"cmd":"reboot"}' -q 1 \
  -up 'source=ci' -up 'trace-id=abc123' \
  -ct application/json \
  -e 60 \
  -rt 'testmqtt/cli/replies' -cd 'req-42'

Isso define duas user properties, um content type, um message expiry de 60 segundos, um response topic e correlation data. Rode o assinante com -J e as propriedades aparecem na saída. O guia de testes de recursos do MQTT 5 explica o que cada propriedade deve fazer e como verificar.

O shell interativo

mqtt shell abre um REPL em que você mantém vários clientes conectados ao mesmo tempo e alterna entre eles — perfeito para reproduzir interações como tomada de sessão ou assinaturas no-local sem abrir cinco terminais.

Sessão do mqtt shell
mqtt> con -i sensor-1 -h broker.connectmq.com -p 1883
sensor-1@broker.connectmq.com> sub -t testmqtt/cli/commands -q 1
sensor-1@broker.connectmq.com> con -i backend-1 -h broker.connectmq.com -p 1883
backend-1@broker.connectmq.com> pub -t testmqtt/cli/commands -m 'restart'
backend-1@broker.connectmq.com> switch sensor-1
sensor-1@broker.connectmq.com> ls
sensor-1@broker.connectmq.com> dis
mqtt> exit

con conecta um novo cliente e o torna o contexto ativo; pub, sub e unsub agem sobre o cliente ativo; switch troca o contexto; ls lista os clientes conectados; dis desconecta. As mensagens recebidas por um cliente assinante são impressas no shell assim que chegam. Um experimento rápido: conecte um segundo cliente com o mesmo -i sensor-1 e veja o primeiro ser desconectado — o sintoma clássico de client ID duplicado.

mqtt test: descubra o que o broker suporta

O mqtt test se conecta a um broker e informa quais recursos do MQTT funcionam. É a forma mais rápida de responder "esse broker suporta MQTT 5, QoS 2, mensagens retidas e assinaturas compartilhadas?"

Rodar o teste de recursos
mqtt test -h broker.connectmq.com -p 1883 -u "$MQTT_USER" -pw "$MQTT_PASS"

A saída tem uma seção por versão do protocolo. O layout exato depende da versão da CLI, mas é parecido com isto (os valores variam conforme o broker e a configuração):

Formato da saída
MQTT 3: OK
	- Maximum topic length: ... bytes
	- QoS 0: Received .../10 publishes in ...ms
	- QoS 1: ...
	- QoS 2: ...
	- Retain: OK
	- Wildcard subscriptions: OK
	- Shared subscriptions: OK
	- Payload size: >= ... bytes
	- Maximum client id length: ... bytes
MQTT 5: OK
	- Connect restrictions:
		> Retain: OK
		> Wildcard subscriptions: OK
		> Shared subscriptions: OK
		> Subscription identifiers: OK
		> Maximum QoS: 2
		> Receive maximum: ...
		> Maximum packet size: ... bytes
		> Topic alias maximum: ...
		> Session expiry interval: ...
		> Server keep alive: ...

As "connect restrictions" do MQTT 5 vêm direto das propriedades do CONNACK enviadas pelo broker; as linhas do MQTT 3 são medidas publicando e assinando de verdade. Adicione -a (--all) para também rodar os testes do MQTT 3 quando o MQTT 5 funcionar, e -V 3 ou -V 5 para limitar o teste a uma versão. Se você precisa da mesma informação nas suas próprias ferramentas, teste quais recursos do MQTT um broker suporta mostra como construir a sonda em Python.

Padrões e scripts

Digitar -h broker.connectmq.com -p 8883 -s toda hora cansa. O mqtt-cli lê valores padrão como host, porta, versão do protocolo e prefixo do client ID de um arquivo de propriedades em ~/.mqtt-cli/ — consulte a documentação da sua versão para as chaves exatas. Com os padrões definidos, mqtt pub -t x -m y vai para o seu broker.

Um smoke test mínimo para um script de shell ou job de CI:

smoke.sh
#!/usr/bin/env bash
set -euo pipefail
TOPIC="testmqtt/cli/smoke-$RANDOM"

mqtt pub -h broker.connectmq.com -p 1883 -t "$TOPIC" -m 'ping' -r -q 1
# uma mensagem retida é entregue logo ao assinar; escutar por 5 s
OUT=$(timeout 5 mqtt sub -h broker.connectmq.com -p 1883 -t "$TOPIC" -q 1 || true)
echo "$OUT" | grep -q 'ping' && echo "OK" || { echo "FAIL: '$OUT'"; exit 1; }
# limpar a mensagem retida
mqtt pub -h broker.connectmq.com -p 1883 -t "$TOPIC" -m '' -r

A mensagem retida torna o teste independente de timing: o assinante a recebe assim que a assinatura fica ativa. Para mais padrões, veja scripts MQTT em bash e os exemplos de mosquitto_pub e mosquitto_sub; o cliente online é um jeito rápido de acompanhar o mesmo topic pelo navegador enquanto o script roda.

Veja o tráfego do mqtt-cli no navegador

O mqtt-cli é um ótimo cliente de terminal padrão: flags completas para MQTT 5, um shell para cenários com vários clientes e um teste de recursos do broker embutido. Guarde alguns comandos no repositório e qualquer pessoa do time vai conseguir reproduzir um problema do broker do mesmo jeito.

Perguntas frequentes

A HiveMQ MQTT CLI só funciona com HiveMQ?

Não. Os comandos pub, sub, shell e test são clientes MQTT comuns e funcionam com qualquer broker compatível com o padrão, como Mosquitto, EMQX, VerneMQ e serviços gerenciados. Só os subcomandos hivemq e swarm são específicos de produtos HiveMQ.

Por que o mqtt sub não imprime nada?

Normalmente o filtro de topic não dá match, o broker rejeitou a assinatura por causa de uma ACL ou o publisher usou outro broker ou porta. Adicione -T para mostrar os topics, use -d para saída de debug e confira o reason code do SUBACK.

Qual a diferença entre mqtt-cli e mosquitto_pub?

Ambos publicam e assinam pelo terminal. O mqtt-cli adiciona um shell interativo com vários clientes nomeados, um teste de recursos do broker, saída em JSON e flags para todas as propriedades do MQTT 5, enquanto mosquitto_pub e mosquitto_sub são menores e estão instalados em quase todo lugar onde há Mosquitto.