Skip to content
mobius1qwe edited this page Oct 27, 2026 · 1 revision

Home > MQTT > Cliente MQTT

Cliente MQTT

Important

Em desenvolvimento (2.0). Ainda não está numa versão lançada e pode mudar.

Nível: iniciante

Em uma frase: o TRALMQTTClient conecta a qualquer broker MQTT, assina tópicos e publica mensagens, configurado no Object Inspector.

Você vai precisar: o pacote RALModuleMQTTPackage; para mqtts:// e wss://, a OpenSSL ao lado do executável.

Na IDE, sem código

  1. Coloque um TRALMQTTClient (paleta RAL - Client).
  2. Em BrokerURL, o endereço do broker: mqtt://test.mosquitto.org:1883, mqtts://meu-broker:8883 ou ws://meu-broker:8080/mqtt.
  3. Clique com o botão direito no componente e escolha Testar conexão: aparece a versão aceita e o que o broker anunciou, ou o motivo da falha. O componente em si não é conectado pela IDE.
  4. Em Subscriptions, adicione um item por filtro (casa/#), com o QoS.
    • Para ver o que chega sem código: ligue MessagesControl do item a um TMemo, TListBox ou TComboBox do formulário. MessagesFormat escolhe só o conteúdo, tópico=conteúdo ou com a hora; MessagesMaxCount (1000) limita a lista.
  5. Em Publications, adicione as mensagens que o programa manda (Name, Topic, Payload, QoS, Retain). Num TActionList, crie uma ação TRALMQTTPublish, ligue Client e escolha a publicação em Publication; ligue a ação a um botão.
  6. Active := True conecta ao abrir o formulário. Ou use as ações TRALMQTTConnect e TRALMQTTDisconnect.

Quer as mensagens num grid? Instale o RALModuleMQTTDBPackage, coloque um TRALMQTTDataSetLink (paleta RAL - DAO), ligue Client, DataSet (um memtable com campos Topic, Payload, QoS, Retain, Received, os que quiser) e, se quiser só um filtro, Subscription. MaxRows (1000) limita as linhas.

Por código

procedure TForm1.FormCreate(Sender: TObject);
begin
  RALMQTTClient1.BrokerURL := 'mqtt://localhost:1883';
  RALMQTTClient1.Subscriptions.Add('casa/#', mqQoS1);
  RALMQTTClient1.OnMessage := Chegou;
  RALMQTTClient1.Connect;   // espera o CONNACK; levanta ERALMQTTError se falhar
  RALMQTTClient1.Publish('casa/sala/luz', 'ligada', mqQoS1, True);
end;

procedure TForm1.Chegou(Sender: TObject; AMessage: TRALMQTTMessage);
begin
  Memo1.Lines.Add(AMessage.Topic + ' = ' + AMessage.AsString);
end;
  • Publish não espera: QoS 0 sai na hora; QoS 1 e 2 são gravados antes e enviados; o fim de cada um chega em OnPublished. PublishWait espera a confirmação.
  • Há sobrecargas de Publish com TBytes e TStream; a mensagem recebida tem AsString, AsBytes, AsStream, AsJSON e SaveToFile.
  • Mode: cmPublisher (não assina), cmSubscriber (recusa publicar) ou cmBoth.
  • Os eventos rodam na thread principal (SynchronizeEvents); num programa de console, na thread do cliente.

Quando a conexão cai

AutoReconnect (ligado) tenta de novo com espera crescente entre MinDelay e MaxDelay; MaxAttempts 0 é sem limite. Com CleanStart False e SessionExpiry (um dia, por padrão), o broker guarda as assinaturas e as mensagens enquanto você está fora, e o cliente guarda as que você mandou e não foram confirmadas (SessionStore: arquivo em SessionFolder, ou memória). O que você publica desconectado espera na fila (OfflineQueueSize).

Erros comuns

sintoma causa o que fazer
"Not authorized" / "Bad user name or password" o broker exige usuário UserName/Password ou um componente de autenticação (segurança)
conecta em 3.1.1 e não em 5.0 broker antigo deixe VersionFallback ligado, ou ProtocolVersion := mv311
mqtts:// falha com erro de certificado certificado autoassinado ou de outro nome SSL.Pins com a impressão digital, ou SSL.CAFile (segurança)
mensagens repetidas com QoS 1 é o que QoS 1 promete ("pelo menos uma vez") QoS 2, ou trate o repetido (rede ruim)
Publish levanta em cmSubscriber o Mode proíbe cmBoth

Veja também

Clone this wiki locally