EMQX版本:5.1.6
1、如果QoS等级是1,如果发送方没有接收到PUBLISH,是否会一直发送PUBACK?什么情况下会停止发送PUBACK?
2、如果QoS等级是1,如果接收方离线后上线,还是否会接收到离线前QoS1的消息?
对问题 1 有一些疑问:
- 发送方没有接收到 PUBLISH 是指什么?
问题2:
对于 QoS1 的消息在订阅者离线期间的投递:
如果订阅者开启了会话保持,离线后在会话过期前上线,会收到离线期间的 QoS1 消息。
开启会话保持:
- 连接时使用
clean_session=false
(mqtt v3.1.1) - 连接时使用
clean_startt=false
(mqtt v5.0),且session_expiry_interval>0
不好意思,问题1写反了
应该是:如果QoS等级是1,如果发送方没有接收到PUBACK,是否会一直发送PUBLISH?什么情况下会停止发送PUBLISH?
问题2:默认不开启会话保持是吗?不开启的话,是不是离线期间QoS1消息就被丢了?
问题3:如果Qos等级是2,如果不开启会话保持,是不是也不会收到离线期间的QoS2消息?
Q1:
发送方可以是 MQTT 客户端,也可以是 MQTT Broker.
- 在发送方未接收到 PUBACK/PUBRECV 报文时,可以重发 PUBLISH 报文,但必须将重发标志位 DUP 设为1 (仅限 Qos>=1 的 PUBLISH 报文)。
重发行为是客户端行为,是否重发取决于客户端实现和业务需要。
Q2:
会话保持也是客户端行为,需要在客户端发送 CONNECT 报文进行连接时设置。
Q3:
是的,客户端不开启会话保持,客户端的 Session 状态不会被 Broker 维护,Qos1 或 Qos2 消息也就不会被 Broker 保存。
建议你详细过一遍 MQTT 协议和 EMQX 文档。这些问题在其中都有说明。
一些常见问题列表:
https://www.emqx.io/docs/zh/v5.5/faq/faq.html
MQTT 5.0 协议文档:
一个 MQTT 5.0 协议文档的中文翻译项目: