MQTT 客户端支持使用某些类型的 QoS 级别,每个级别以不同的方式工作,以确保消息按预期处理。
共有以下 QoS 级别:
mtqsAtMostOnce:(默认情况下)消息按照底层 TCP/IP 网络的最大努力传送。协议中不定义响应和重试语义。消息到达服务器的次数为一次或零次。
mtqsAtLeastOnce:服务器收到消息由 ACKNOWLEDGMENT 消息确认。如果通信链路或发送设备发生已识别的故障,或在指定时间内未收到确认消息,发送方将重新发送消息。消息至少到达服务器一次。QoS 级别 1 的消息在消息中有 ID 参数。
mtqsExactlyOnce:消息确保恰好送达一次。例如,此级别可用于计费系统,因为重复或丢失的消息可能导致错误收费。如果通信链路或发送设备发生故障,或在指定时间内未收到确认消息,发送方将重新发送消息。
您可以处理 OnPubAck 或 OnPubComp 事件,以了解消息是否已被服务器处理;也可以使用方法 PublishAndWait 来确认消息是否已被服务器处理。
PublishAndWait 的使用方式与普通 Publish 方法相同,但现在有一个名为 Timeout 的新参数,如果在一定时间内没有收到服务器的响应,该方法将返回 false。默认情况下,此值为 10 秒。
if mqtt.PublishAndWait('topic', 'text') then
ShowMessage('Message processed')
else
ShowMessage('Message error');