发布具有mqtt QoS 2的消息时,消息会丢失吗?

时间:2018-11-28 22:40:07

标签: mqtt ios-mqtt-client-framework

我正在尝试使用MQTT-Client Framework实现MQTT客户端。我想确保我尝试发布的每条消息都会到达代理。我无法确切知道QOS2的含义:它指出一条消息将只发送一次。这是否意味着当连接断开时,它将尝试在重新连接后自动重新传输消息?还是应该由应用处理?

还在此库中,默认情况下自动重新连接吗?还是需要检查connectionLost是否发生,然后尝试重新连接?

1 个答案:

答案 0 :(得分:1)

MQTT QoS级别是向接收方传递消息的保证,而不是发送方发送/重新发送消息的频率的保证。请参见QoS section in the MQTT specoverview of MQTT QoS

使用MQTT QoS2发布的消息意味着将只发送一次。消息可以发送一次以上,以实现一次准确的传递保证。

使用PUBLISH / PUBREC握手可实现MQTT的至少一次交付方面。如果发布者没有收到确认其已发布消息的PUBREC数据包,则它将继续重新发送带有DUP标志的发布消息。

使用附加的PUBREL / PUBCOMP握手,可以实现QoS2的一次传送。接收者可以选择转发邮件,并在two different points处丢弃重复的邮件。

  

这是否意味着当连接断开时,它将尝试重新传输   重新连接后自动显示消息?或者这应该是   由应用处理?

MQTT规范涵盖了message delivery retries

  

当客户端在CleanSession设置为0的情况下重新连接时,两个客户端   和服务器必须重新发送任何未确认的发布数据包(其中QoS   > 0)和使用其原始数据包标识符的PUBREL数据包。这是客户端或服务器的唯一情况   需要重新发送邮件。

因此,如果您的客户端遵循规范,并且您正在使用持久性会话(CleanSession = 0),则会重新传输消息。