MQTT保留消息与遗嘱消息理解和应用

保留消息
每个主题只能存储一条保留消息

Retain As Published

Retain As Published = 0
转发时清除Retain标识

Retain As Published = 1
转发时保留原始Retain标识

Retain Handling

Retain handling = 0
订阅建立时发送保留消息

Retain handling = 1
订阅建立时,若该订阅当前不存在则发送保留消息

Retain Handling = 2
订阅建立时不发送保留消息

遗嘱消息

1. 服务端检测到了一个1/O 故障或者网络故障

2. 客户端在 Keep Alive 的时间内未能通讯

3. 客户端在没有发送 Beason Code 为0的DISCONNECT 报文的情况下关闭了网络连接

4. 服务端在没有收到 DISCONNECT 报文的情况下主动关闭了网络连接
实战场景

保留消息

1如何发布保留消息
发布消息时设置Retain 标识为1。

2.保留消息可以被之后订阅的客户端接收
发布保留消息后再进行订阅。收到消息中的 Retain 标识为 1

3.保留消息会被转发给当前的订阅者
保持订阅,再次发布保留消息。收到消息中的 Retain 标识为0

4.一个主题下只能存在一条保留消息
向同一主题发布多条保留消息,订阅后只会收到最后一条保留消息

5.可以通过通配符订阅获取多条保留消息
向多个主题发送保留消息,使用通配符订阅后会收到多条保留消息

6.使用保留消息可能会导致收到重复的消息
    1.订阅 -> 发布保留消息 -> 重连、再次订阅
    2.发布保留消息 -> 订阅-> 重连、再次订阅
    
7.如何清除保留消息
发送 Payload 为空的保留消息,注意当前的订阅者会收到这条消息

8.为保留消息设置过期时间
发布消息时设置Message Expiry lnterval 属性

9.Retain As Published 选项的作用
RAP 设置为0,转发时会清除 Retain 标识。
RAP 设置为1,转发时会保留 Retain 标识,不管是保留消息还是普通消息

10.Retain Handling 选项的作用
RH 设置为 0,只要订阅,就会发送保留消息
RH 设置为 1,订阅建立时,如果该订阅当前不存在,才会发送保留消息。
RH 设置为 2,订阅不会发送保留消息。
MQTTX在重新订阅之前都会先取消订阅,所以这里我们用 paho.mgttpython 来模拟。

遗嘱消息

1.如何设置遗嘱消息
在连接时设置。

2.遗嘱消息的触发
在EMQX中将ACL检查未通过时的动作改为断开连接,然后订阅 $SYS/#

3.遗嘱延迟间隔
在连接时设置 Will Delay Interval 属性

4.将遗嘱消息设置为保留消息
在连接时设置 Will Retain 字段

遗嘱消息和保留消息的配合

首先让客户端A在连接时将遗嘱主题设置为 client/a/status,遗嘱消息内容设置为moffline,并且将 Retain 标识设置为1。

然后只要客户端A成功连接,就向 client/a/status 主题发布一个内容为 Im online的保留消息。

这使得那些订阅了 client/a/status 这个主题的客户端,不管什么时候在线,都能够及时地获取到客户端A的最新状态
  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

如风之夏

感谢,你的鼓励是我前进的动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值