[!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.
TRALMQTTClient (paleta RAL - Client).BrokerURL, o endereço do broker: mqtt://test.mosquitto.org:1883,mqtts://meu-broker:8883 ou ws://meu-broker:8080/mqtt.Subscriptions, adicione um item por filtro (casa/#), com o QoS.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.Publications, adicione as mensagens que o programa manda (Name, Topic,Payload, QoS, Retain). Num TActionList, crie uma ação TRALMQTTPublish,Client e escolha a publicação em Publication; ligue a ação a um botão.Active := True conecta ao abrir o formulário. Ou use as ações TRALMQTTConnect eTRALMQTTDisconnect.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.
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; oOnPublished. PublishWait espera a confirmação.Publish com TBytes e TStream; a mensagem recebida temAsString, AsBytes, AsStream, AsJSON e SaveToFile.Mode: cmPublisher (não assina), cmSubscriber (recusa publicar) ou cmBoth.SynchronizeEvents); num programa de console,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).
| 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 |