MQTT 是 IoT、遥测、移动推送和联网车辆事实上的消息传递协议。无需编写一个字节的帧解析,即可将其引入您的 Delphi 代码库。
Delphi MQTT 客户端让您的 VCL 或 FMX 应用程序能够使用 OASIS MQTT 协议——这是一种为受约束设备和低带宽、高延迟网络设计的轻量级发布/订阅协议。借助 sgcWebSockets,您可以获得作为单个非可视组件 TsgcWSPClient_MQTT 的完整客户端界面,可在 Delphi 7 至 Delphi 13 以及每个 Embarcadero 目标平台(Win32、Win64、Linux64、macOS、iOS、Android)上运行。
该组件在同一代码路径中实现了两个主要 MQTT 版本:长期部署的 MQTT 3.1.1(OASIS 标准,自 2014 年以来几乎每个 IoT 代理都在使用)和现代的 MQTT 5.0(带主题别名、会话过期、用户属性、增强身份验证、请求/响应和共享订阅)。一个属性——Version——即可在它们之间切换。
TsgcWSPClient_MQTT
原生 TCP(1883 / 8883)、WebSocket(80 / 443)、通过 OpenSSL 或 SChannel 实现 TLS
MQTT 3.1.1 与 MQTT 5.0
Windows、macOS、Linux、iOS、Android、.NET
原则上,符合规范的客户端是与代理无关的——但现实世界中的代理各有怪癖。我们针对客户实际部署的代理对每个版本进行测试。
完整的 MQTT 5 属性界面、共享订阅、增强身份验证和 HiveMQ Cluster。免费的 Cloud 层是端到端试用该组件最简单的方式。
参考的开源代理。使用 docker run -p 1883:1883 eclipse-mosquitto 在本地运行它,30 秒内您就拥有了一个开发目标。
带规则引擎、Kafka 桥接和共享订阅的大规模可扩展 Erlang 代理。可在数百万连接的生产环境中投入使用。
X.509 客户端证书、在 443 上 ALPN 协商的 MQTT、SigV4 签名的 WebSocket 以及 AWS IoT 代理配额。请参阅专门的 AWS IoT Core 页面。
设备 SAS 令牌、孪生/直接方法主题、DPS 预配置。请参阅专门的 Azure IoT Hub 页面。
端口 8883 上基于 JWT 的设备身份验证。组件会自动生成和轮换 JWT。
端口 15675 上的 RabbitMQ Web-MQTT 插件——同一代理可在单个 TLS 端口上为浏览器和 Delphi 客户端提供服务。
都通过集成测试套件。免费的与 AMQP / STOMP / JMS 多协议共存。
每个线级 MQTT 功能都作为属性、方法或事件公开——没有任何隐藏。
即发即弃(QoS 0)、带 PUBACK 的至少一次(QoS 1)以及带四向握手 PUBREC → PUBREL → PUBCOMP 的恰好一次(QoS 2)。按每个 Publish() 调用选择。
将发布标记为保留,以便代理将最后已知值传递给任何未来的订阅者——"当前状态"主题的标准模式。
LastWillTestament 注册一个主题 + 负载,如果客户端非正常断开,代理将发布该消息——这是经典的设备离线信号。
当 CleanSession 为 false 时,订阅和未交付的 QoS 1/2 消息在重新连接之间保持——在不丢失数据的情况下桥接间歇性连接。
使用 OpenSSL 或 SChannel 在 8883 上提供 MQTTS。从磁盘、Windows 证书存储、PKCS#12 包或硬件令牌加载证书。
将组件接入 TsgcWebSocketClient,即可在端口 443 上通过 WSS 运行 MQTT——通过任何 HTTP 感知的负载均衡器或企业代理。
会话过期、接收最大值、最大包大小、主题别名最大值、用户属性、响应信息——在每个 CONNECT / PUBLISH / SUBSCRIBE / DISCONNECT 上。
$share/<group>/<topic> 跨工作者池循环分发传入消息——免费的水平扩展。
带指数退避的自动重连;订阅和排队的 QoS 1/2 发布在恢复时重放。
放置组件、连接两个事件、设置 Active。
uses
sgcWebSocket, sgcWebSocket_Protocol_MQTT_Client,
sgcWebSocket_Protocol_MQTT_Message;
var
WSClient: TsgcWebSocketClient;
MQTT: TsgcWSPClient_MQTT;
begin
WSClient := TsgcWebSocketClient.Create(nil);
WSClient.Host := 'broker.hivemq.com';
WSClient.Port := 1883;
WSClient.WatchDog.Enabled := True;
MQTT := TsgcWSPClient_MQTT.Create(nil);
MQTT.Client := WSClient;
MQTT.Version := mqtt50;
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;
WSClient.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);
// Retained “online” message
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;
开箱即用地支持所有四种代理身份验证模式:简单用户名/密码(在 CONNECT 包中发送)、X.509 客户端证书(mTLS)、JWT(Google Cloud IoT、自定义代理)和 SAS 令牌(Azure IoT Hub)。MQTT 5 增强身份验证通过 OnMQTTAuth 公开 AUTH 包,用于 SCRAM 式的挑战/响应流。
对于传输,您可以在标准的 1883(明文)或 8883(TLS)端口上运行原生 MQTT-over-TCP,或者通过 WebSocket 隧道 MQTT(Client 属性接受任何 TsgcWebSocketClient)以穿越严格的仅 HTTP 防火墙和 CDN 边缘。两种选择都使用相同的组件和事件。
TsgcWSPClient_MQTT 的完整参考——属性、方法、事件、所有子协议功能。
AWS IoT Core、Azure IoT Hub、Google Cloud IoT 的专门页面。
何时选择 MQTT 而非 WebSocket、SSE、AMQP 或 HTTP/2 推送。
使用 MQTT 5 ResponseTopic + CorrelationData 实现异步 RPC。
针对 AWS IoT Core 的签名 WebSocket 身份验证。
通过 AWS IoT 自定义授权器进行基于令牌的身份验证。