Delphi MQTT 客户端——连接到任何 MQTT 3.1 / 5.0 代理

面向 Delphi 和 C++Builder 的原生 MQTT 3.1.1 和 MQTT 5.0 客户端组件。发布、订阅、保留消息、遗嘱、QoS 0/1/2、TLS、共享订阅以及完整的 MQTT 5 属性界面——已针对 HiveMQ、Mosquitto、EMQX、AWS IoT Core 和 Azure IoT Hub 进行验证。

面向 Pascal 的一流 MQTT 客户端

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 代理

原则上,符合规范的客户端是与代理无关的——但现实世界中的代理各有怪癖。我们针对客户实际部署的代理对每个版本进行测试。

HiveMQ 与 HiveMQ Cloud

完整的 MQTT 5 属性界面、共享订阅、增强身份验证和 HiveMQ Cluster。免费的 Cloud 层是端到端试用该组件最简单的方式。

Eclipse Mosquitto

参考的开源代理。使用 docker run -p 1883:1883 eclipse-mosquitto 在本地运行它,30 秒内您就拥有了一个开发目标。

EMQX

带规则引擎、Kafka 桥接和共享订阅的大规模可扩展 Erlang 代理。可在数百万连接的生产环境中投入使用。

AWS IoT Core

X.509 客户端证书、在 443 上 ALPN 协商的 MQTT、SigV4 签名的 WebSocket 以及 AWS IoT 代理配额。请参阅专门的 AWS IoT Core 页面。

Azure IoT Hub

设备 SAS 令牌、孪生/直接方法主题、DPS 预配置。请参阅专门的 Azure IoT Hub 页面。

Google Cloud IoT

端口 8883 上基于 JWT 的设备身份验证。组件会自动生成和轮换 JWT。

RabbitMQ Web-MQTT

端口 15675 上的 RabbitMQ Web-MQTT 插件——同一代理可在单个 TLS 端口上为浏览器和 Delphi 客户端提供服务。

VerneMQ、ActiveMQ、Artemis

都通过集成测试套件。免费的与 AMQP / STOMP / JMS 多协议共存。

QoS、保留、遗嘱、TLS——完整界面

每个线级 MQTT 功能都作为属性、方法或事件公开——没有任何隐藏。

服务质量 0/1/2

即发即弃(QoS 0)、带 PUBACK 的至少一次(QoS 1)以及带四向握手 PUBREC → PUBREL → PUBCOMP 的恰好一次(QoS 2)。按每个 Publish() 调用选择。

保留消息

将发布标记为保留,以便代理将最后已知值传递给任何未来的订阅者——"当前状态"主题的标准模式。

遗嘱(LWT)

LastWillTestament 注册一个主题 + 负载,如果客户端非正常断开,代理将发布该消息——这是经典的设备离线信号。

清理/持久会话

CleanSession 为 false 时,订阅和未交付的 QoS 1/2 消息在重新连接之间保持——在不丢失数据的情况下桥接间歇性连接。

TLS 与 mTLS

使用 OpenSSL 或 SChannel 在 8883 上提供 MQTTS。从磁盘、Windows 证书存储、PKCS#12 包或硬件令牌加载证书。

WebSocket 传输

将组件接入 TsgcWebSocketClient,即可在端口 443 上通过 WSS 运行 MQTT——通过任何 HTTP 感知的负载均衡器或企业代理。

MQTT 5 属性

会话过期、接收最大值、最大包大小、主题别名最大值、用户属性、响应信息——在每个 CONNECT / PUBLISH / SUBSCRIBE / DISCONNECT 上。

共享订阅

$share/<group>/<topic> 跨工作者池循环分发传入消息——免费的水平扩展。

WatchDog 重连

带指数退避的自动重连;订阅和排队的 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 边缘。两种选择都使用相同的组件和事件。

sgcWebSockets 中关于 MQTT 的更多内容

MQTT 协议页面

TsgcWSPClient_MQTT 的完整参考——属性、方法、事件、所有子协议功能。

云端 IoT 代理

AWS IoT Core、Azure IoT Hub、Google Cloud IoT 的专门页面。

实时选择器

何时选择 MQTT 而非 WebSocket、SSE、AMQP 或 HTTP/2 推送。

博客:MQTT 上的请求/响应

使用 MQTT 5 ResponseTopic + CorrelationData 实现异步 RPC。

博客:使用 SigV4 的 AWS IoT

针对 AWS IoT Core 的签名 WebSocket 身份验证。

博客:AWS IoT 自定义身份验证

通过 AWS IoT 自定义授权器进行基于令牌的身份验证。

5 分钟内开始发布

抓取试用版,指向 broker.hivemq.com:1883 并运行随附的演示项目。