一流的 MQTT 实现,可在 Delphi / .NET 运行时支持的所有环境中运行 — 从桌面服务到移动设备,与任何符合标准的 MQTT 代理进行通信。
TsgcWSPClient_MQTT
Windows、macOS、Linux、iOS、Android
Standard / Professional / Enterprise
MQTT 的每一项线级特性 — 不仅仅是发布与订阅。
即发即弃、至少一次和恰好一次投递。QoS 2 的四步握手(PUBLISH → PUBREC → PUBREL → PUBCOMP)通过事件完整暴露,便于实现重试 / 审计逻辑。
将 Client 属性连接到 TsgcWebSocketClient 即可通过 WebSocket 运行 MQTT,或在端口 1883 / 8883 上使用原生 MQTT TCP 传输 — 相同组件,相同 API。
将发布消息标记为保留,代理会向后续任何订阅者投递最后已知值。可在 Publish 调用中按调用设置或清除 retain 标志。
LastWillTestament 注册一个主题 + 负载,当客户端非正常断开时代理会发布它 — 这是发送设备离线事件的标准方式。
支持带 +(单层)和 #(多层)通配符的主题过滤器:sensors/+/temperature 或 devices/#。
会话过期、接收最大值、最大数据包大小、主题别名最大值、请求响应信息、用户属性 — 全部可通过 ConnectProperties、PublishProperties 和 SubscribeProperties 访问。
MQTT 5 允许客户端(与代理)用 2 字节整数别名替换重复发布的长主题名称 — 在高频遥测流中显著节省带宽。
MQTT 5 的 $share/<group>/<topic> 在一组订阅者之间轮询分发收到的消息 — 是横向扩展工作池的基本构件。
MQTT 5 的 ResponseTopic 与 CorrelationData 属性将发布-订阅变为异步 RPC — 内置于事件中,无需额外封装。
MQTT 5 的 AUTH 数据包,配合 AuthenticationMethod / AuthenticationData 实现 SCRAM 风格质询 — 调用 Auth,并处理 OnMQTTAuth 事件。
HeartBeat 按可调间隔发送 PINGREQ。WatchDog 以指数退避自动重连,并恢复订阅。
在 8883 端口运行 MQTTS(原始 TCP+TLS),或在 443 端口上运行带客户端证书的 WSS。TLSOptions.IOHandler 可选择 OpenSSL(跨平台)或 SChannel(Windows 内核 TLS)。
轻量封装、低开销和有状态会话使 MQTT 成为以下场景的默认选择。
传感器通过保活的 MQTT 会话流式传输温度、振动、GPS 和电池读数 — 即便在不稳定的 LTE/Cat-M/NB-IoT 链路上也能可靠工作。
面向车队跟踪器、OBD 网关和电动车充电桩的双向命令通道,使用 QoS 1 — 断线重连后无需丢失已发布消息。
用事件驱动的发布-订阅取代 OPC-UA 轮询。主题别名与共享订阅可扩展到数千台 PLC 和现场设备。
照明、暖通空调、门锁和存在传感器通过 Mosquitto 或 Home Assistant 通信 — Delphi 客户端集成起来就像任何嵌入式节点一样简单。
同一组件可与 AWS IoT Core、Azure IoT Hub、Google Cloud IoT、IBM Watson、HiveMQ Cloud 与 EMQX 通信 — 使用 X.509 客户端证书或 SAS 令牌。
RabbitMQ Web-MQTT(端口 15675)上的 MQTT-over-WebSocket 允许同一代理通过单一 TLS 端口同时推送给 Delphi 客户端和 JS 仪表板。
iOS/Android 上的长连接 MQTT 会话结合遗嘱消息,可在不依赖特定厂商提供商的情况下实现在线状态与轻量推送。
通过中央代理解耦生产者和消费者。共享订阅在一组 Delphi 工作服务之间轮询分发任务。
符合规范的客户端 — 在客户实际部署的代理上经过验证。
X.509 客户端证书、WebSocket 上的 SigV4 以及 AWS IoT 代理配额。请参见专属的 AWS IoT 页面。
设备 SAS 令牌、孪生 / 方法主题以及 DPS 预配。请参见 Azure IoT Hub 页面。
完整的 MQTT 5 属性支持、共享订阅、增强认证及 HiveMQ Cluster。
参考实现的开源代理 — 支持 MQTT 3.1.1 与 5.0,TCP 或 WebSocket 传输。
大规模可扩展代理,支持共享订阅、规则引擎以及与 Kafka 的桥接。即插即用。
端口 15675 上的 MQTT-over-WebSocket 插件 — 浏览器 + Delphi 仪表板的标准组合。
基于 Erlang/OTP 构建的集群 MQTT 代理 — MQTT 3.1.1 和 5.0 两种模式均通过测试套件。
Apache ActiveMQ 内置的 MQTT 监听器与 Artemis 代理 — 可与 AMQP、STOMP 和 JMS 多协议共存。
将 TsgcWebSocketClient 与 TsgcWSPClient_MQTT 配对,连接 OnMQTTConnect / OnMQTTPublish,然后 Subscribe 和 Publish。
uses
sgcWebSocket, sgcWebSocket_Protocol_MQTT_Client,
sgcWebSocket_Protocol_MQTT_Message;
var
WSClient: TsgcWebSocketClient;
MQTT: TsgcWSPClient_MQTT;
begin
WSClient := TsgcWebSocketClient.Create(nil);
WSClient.Host := 'www.esegece.com';
WSClient.Port := 15675;
MQTT := TsgcWSPClient_MQTT.Create(nil);
MQTT.Client := WSClient;
MQTT.Authentication.Enabled := True;
MQTT.Authentication.UserName := 'sgc';
MQTT.Authentication.Password := 'sgc';
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/#');
end;
procedure TForm1.MQTTPublish(Connection: TsgcWSConnection;
aTopic, aText: string;
PublishProperties: TsgcWSMQTTPublishProperties);
begin
Memo1.Lines.Add(aTopic + ': ' + aText);
end;
// 发布一条保留的 QoS 1 消息
MQTT.Publish('sensors/temperature/room1',
'{"value":22.5,"unit":"C"}', mtqsAtLeastOnce, True);
// uses: sgcWebSocket, sgcWebSocket_Protocol_MQTT_Client
TsgcWebSocketClient *WSClient = new TsgcWebSocketClient(this);
WSClient->Host = "www.esegece.com";
WSClient->Port = 15675;
TsgcWSPClient_MQTT *MQTT = new TsgcWSPClient_MQTT(this);
MQTT->Client = WSClient;
MQTT->Authentication->Enabled = true;
MQTT->Authentication->UserName = "sgc";
MQTT->Authentication->Password = "sgc";
MQTT->OnMQTTConnect = MQTTConnect;
MQTT->OnMQTTPublish = MQTTPublish;
WSClient->Active = true;
void __fastcall TForm1::MQTTPublish(TsgcWSConnection *Connection,
UnicodeString aTopic, UnicodeString aText,
TsgcWSMQTTPublishProperties PublishProperties)
{
Memo1->Lines->Add(aTopic + ": " + aText);
}
MQTT->Publish("sensors/temperature/room1",
"{\"value\":22.5,\"unit\":\"C\"}", mtqsAtLeastOnce, true);
using esegece.sgcWebSockets;
var WSClient = new TsgcWebSocketClient();
WSClient.Options.Parameters = "/ws";
var MQTT = new TsgcWSPClient_MQTT();
MQTT.Client = WSClient;
MQTT.Authentication.Enabled = true;
MQTT.Authentication.UserName = "sgc";
MQTT.Authentication.Password = "sgc";
MQTT.HeartBeat.Enabled = true;
MQTT.HeartBeat.Interval = 5;
MQTT.OnMQTTConnect += (conn, session, code, name, props) => MQTT.Subscribe("sensors/temperature/#");
MQTT.OnMQTTPublish += (conn, topic, text, props) => Console.WriteLine(topic + ": " + text);
WSClient.Host = "www.esegece.com";
WSClient.Port = 15675;
WSClient.Active = true;
MQTT.Publish("sensors/temperature/room1",
"{\"value\":22.5,\"unit\":\"C\"}", TmqttQoS.mtqsAtLeastOnce, true);
本组件所实现协议的权威来源。