MQTT Client
TsgcWSPClient_MQTT 是一个原生的 MQTT 3.1.1 和 MQTT 5.0 客户端。支持 QoS 0、1 和 2 的发布与订阅、保留消息、Last Will and Testament、持久会话,以及 MQTT 5 新增的原因码、用户属性、主题别名、共享订阅和增强身份验证。在 Delphi 和 C++ Builder 中是同一个组件、同一套 API。
TsgcWSPClient_MQTT 是一个原生的 MQTT 3.1.1 和 MQTT 5.0 客户端。支持 QoS 0、1 和 2 的发布与订阅、保留消息、Last Will and Testament、持久会话,以及 MQTT 5 新增的原因码、用户属性、主题别名、共享订阅和增强身份验证。在 Delphi 和 C++ Builder 中是同一个组件、同一套 API。
把一个 TsgcTCPClient 赋给 Client,用 MQTTVersion 选择协议版本,接好 OnMQTTConnect 和 OnMQTTPublish,然后调用 Subscribe 和 Publish。
TsgcWSPClient_MQTT
OASIS MQTT 3.1.1 和 MQTT 5.0
TCP (1883) 或 TLS (8883)
Delphi、C++ Builder
传输:纯 TCP 和 TLS。sgcMQ 通过纯 TCP 和 TLS 连接。如果您需要 MQTT over WebSocket,则需要 sgcWebSockets 包,它提供 WebSocket 客户端。
把 TsgcTCPClient 赋到 Client 属性上,MQTT 就直接跑在 TCP 套接字之上。要连接加密的消息代理,请打开 TLS 并把端口指向 8883。
uses
sgcTCP_Client_WS, sgcWebSocket_Classes, sgcWebSocket_Types,
sgcWebSocket_Protocols, sgcWebSocket_Protocol_MQTT_Client,
sgcWebSocket_Protocol_MQTT_Message;
var
TCPClient: TsgcTCPClient;
MQTT: TsgcWSPClient_MQTT;
begin
TCPClient := TsgcTCPClient.Create(nil);
TCPClient.Host := 'broker.example.com';
TCPClient.Port := 1883;
TCPClient.WatchDog.Enabled := True;
MQTT := TsgcWSPClient_MQTT.Create(nil);
MQTT.Client := TCPClient;
MQTT.MQTTVersion := mqtt5;
MQTT.Authentication.Enabled := True;
MQTT.Authentication.UserName := 'sgc';
MQTT.Authentication.Password := 'sgc';
MQTT.LastWillTestament.Enabled := True;
MQTT.LastWillTestament.Topic := 'devices/sensor-01/status';
MQTT.LastWillTestament.Message := 'offline';
MQTT.LastWillTestament.QoS := mtqsAtLeastOnce;
MQTT.LastWillTestament.Retain := True;
MQTT.OnMQTTConnect := MQTTConnect;
MQTT.OnMQTTPublish := MQTTPublish;
TCPClient.Active := True;
end;
procedure TForm1.MQTTConnect(Connection: TsgcWSConnection;
const Session: Boolean; const ReasonCode: Integer;
const ReasonName: string;
const ConnectProperties: TsgcWSMQTTCONNACKProperties);
begin
MQTT.Subscribe('sensors/+/temperature', mtqsAtLeastOnce);
MQTT.Publish('devices/sensor-01/status',
'online', mtqsAtLeastOnce, True);
end;
procedure TForm1.MQTTPublish(Connection: TsgcWSConnection;
aTopic, aText: string;
PublishProperties: TsgcWSMQTTPublishProperties);
begin
Memo1.Lines.Add(aTopic + ' = ' + aText);
end;
// include: sgcTCP_Client_WS.hpp, sgcWebSocket_Protocols.hpp,
// sgcWebSocket_Protocol_MQTT_Client.hpp
TsgcTCPClient *TCPClient = new TsgcTCPClient(this);
TCPClient->Host = "broker.example.com";
TCPClient->Port = 1883;
TCPClient->WatchDog->Enabled = true;
TsgcWSPClient_MQTT *MQTT = new TsgcWSPClient_MQTT(this);
MQTT->Client = TCPClient;
MQTT->MQTTVersion = mqtt5;
MQTT->Authentication->Enabled = true;
MQTT->Authentication->UserName = "sgc";
MQTT->Authentication->Password = "sgc";
MQTT->OnMQTTConnect = MQTTConnect;
MQTT->OnMQTTPublish = MQTTPublish;
TCPClient->Active = true;
void __fastcall TForm1::MQTTPublish(TsgcWSConnection *Connection,
UnicodeString aTopic, UnicodeString aText,
TsgcWSMQTTPublishProperties PublishProperties)
{
Memo1->Lines->Add(aTopic + " = " + aText);
}
// In the OnMQTTConnect handler:
MQTT->Subscribe("sensors/+/temperature", mtqsAtLeastOnce);
MQTT->Publish("devices/sensor-01/status",
"online", mtqsAtLeastOnce, true);
您最常使用的成员。
Client 接受持有套接字的 TsgcTCPClient。它的 Host、Port、TLS、TLSOptions 和 WatchDog 决定字节如何传输。
MQTTVersion 用于选择 mqtt311 或 mqtt5。只有选择版本 5 时,MQTT 5 的属性和原因码才会出现在线路上。
Authentication.Enabled、UserName 和 Password 填充 CONNECT 数据包。对于 MQTT 5 的质询/响应方案,请配合使用 Auth 和 OnMQTTAuth。
Publish(topic, text, qos, retain) 发送一条消息,并提供用于二进制负载的 TStream 重载。PublishAndWait 会阻塞直到消息代理确认该数据包。
Subscribe(topic, qos) 接受单个过滤器或一个 TsgcWSTopics 列表,UnSubscribe 与之对应。通配符 + 匹配一层,# 匹配其余部分。
OnMQTTPublish 送达入站消息。QoS 2 的握手以 OnMQTTPubRec、OnMQTTPubRel 和 OnMQTTPubComp 形式暴露,QoS 1 则对应 OnMQTTPubAck。
LastWillTestament 携带主题、消息、QoS 和 retain 标志;如果连接在没有正常 DISCONNECT 的情况下断开,消息代理会代您发布它们。
ConnectProperties 设置 MQTT 5 的会话过期时间和各项上限。HeartBeat 驱动保活 PINGREQ,收到响应时触发 OnMQTTPing。
QoS 属性控制在确认尚未返回期间,出站的 QoS 1 和 2 消息如何存储和重试。