我正在尝试使用MQTT-Client Framework实现MQTT客户端。我想确保我尝试发布的每条消息都会到达代理。我无法确切知道QOS2的含义:它指出一条消息将只发送一次。这是否意味着当连接断开时,它将尝试在重新连接后自动重新传输消息?还是应该由应用处理?
还在此库中,默认情况下自动重新连接吗?还是需要检查connectionLost是否发生,然后尝试重新连接?
答案 0 :(得分:1)
MQTT QoS级别是向接收方传递消息的保证,而不是发送方发送/重新发送消息的频率的保证。请参见QoS section in the MQTT spec和overview 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),则会重新传输消息。