MQTT:消息详解
目录
- 一、保留消息
- 1.1 概述
- 1.2 存储方式
- 1.3 删除方式
- 1.4 注意事项
- 二、消息过期时间
- 三、遗嘱消息
- 四、延迟发布
- 五、用户属性
一、保留消息
1.1 概述
普通消息:普通消息在发送之前,如果主题不存在订阅者,MQTT会直接将消息丢弃。
保留消息:保留消息可以保存在MQTT服务器中,如果有新的订阅者订阅这个主题,都会立即接收到消息,即使这个主题是在订阅之前发布的。
应用场景:
- 智能家居设备的状态,平时只有设备状态变更的时候才会上报,但是控制端需要再上线之后就能获取到设备状态。
- 传感器上报数据间隔多长,订阅者需要在订阅之后就获取最新的数据。
- 传感器版本号、序列号等不会经常变更的属性,上线后发布一条保留消息告知后续的所有订阅者。
1.2 存储方式
发送消息的时候选中Retain
,这条消息就是一条保留消息。
保留消息默认的存储方式是内存存储,当服务重启之后,数据会丢失,可以在设置中修改为磁盘存储,修改完成之后需要重启服务。
1.3 删除方式
- 在发送保留消息的时候,发送一个空数据
- 在EMQX Dashboard中进行删除
- 设置保留消息的过期时间
1.4 注意事项
- MQTT服务器会为每一个主题保留
最新的一条保留消息
。 - 在保留消息发布前订阅,将不会收到保留消息(此时收到的是一条普通消息),需要等到保留消息发布后,重新订阅主题,才会收到保留消息。
二、消息过期时间
通过设置消息的过期时间可以设置消息在多少时间段内失效,只要是在这个时间段内订阅主题,都可以接收到订阅的数据。
需要注意的是,这里需要将Qos设置成1或者是2。
三、遗嘱消息
通过遗嘱消息可以感知客户端是意外断开的,设置遗嘱消息步骤如下:设置遗嘱消息的主题、遗嘱消息的类型、遗嘱消息的内容以及遗嘱消息的延迟时间等。
当正常关闭连接时,遗嘱消息是不会触发的,只有当窗口异常关闭的情况下,遗嘱消息才会触发,例如:可以将pub在新窗口中打开,并且进行连接,然后直接关闭窗口查看sub订阅主题的状态
四、延迟发布
MQTT服务端收到发布者发布的消息后,会延迟一段时间之后再把消息转发给订阅者。
应用场景:
- 农业智能化场景:清晨或傍晚的时候执行灌溉
- 能源管理与自动化控制:智能家居或智能建筑中的照明、供暖、通风等。
- 公共设施:广告牌特定时间发放
延迟发布主题格式:$delayed/{DelayInterval}/{TopicName}
$delayed
:使用$delayed
作为主题前缀的消息都将被视为延迟发布的消息。
DelayInterval:延迟发布的时间间隔,单位是秒(s)。允许的最大间隔4294967秒,大约49.710266 天,如果DelayInterval不是一个整形数字,EMQX会直接丢弃该消息。
TopicName:MQTT消息的主题名称。
$delayed/15/x/y:15秒之后将MQTT消息发布到主题 x/y
$delayed/60/a/b:1分钟后将MQTT消息发布到主题a/b
首先需要再EMQX中设置延迟发布
在发送主题的时候增加前缀$delayed
五、用户属性
用户属性是MQTT5.0之后版本引入的一个新特性,允许在Publish(发布)、Subscribe(订阅)Connect(连接)等报文中携带附加信息。
应用场景:
- 日志记录:在发布、订阅报文中增加用户属性,可以帮助记录操作信息、操作时间、原因说明等
- 消息分类与标记:用户属性可以用来给消息增加标签或分类信息,如消息类型等,使得接收方能够根据这些属性进行过滤、排序或特殊处理。
发布消息的时候需要配置用户属性,点击加号(+)可以增加多个用户属性:
发布成功之后的消息:
接收成功之后的消息: