设备与物联网平台保持连接时会形成会话状态,会话状态包括订阅的Topic、保留消息、遗嘱消息、平台缓存的QoS1消息等。会话过期是指当设备和物联网平台断开连接,过期后会话会被删除。本文为您介绍MQTT 5.0的新特性会话过期。
背景信息
在MQTT 3.1.1版本中,没有明确的会话过期概念,只有
cleanSession
决定设备重新连接时是否继续之前的会话状态信息。一个会话要么在断开连接时被清除,要么会一直保留直到设备重新连接物联网平台。cleanSession = true
:建连时删除会话,设备需要重新订阅topic,也不会收到物联网平台缓存的QoS1消息。cleanSession = false
:建连时保留会话,设备不需要重新订阅topic,会收到物联网平台缓存的QoS1消息。
在MQTT 5.0中,明确引入会话过期的概念,用
cleanStart
替换cleanSession
,增加会话过期间隔属性Session Expiry Interval
。这两个参数提供了比MQTT 3.1.1 中的cleanSession
更精细的会话控制,可以在设备断开连接后的一段时间内保留会话状态,也可以在不需要会话时删除会话,节约云端的资源开发,避免收到不符预期的消息。cleanStart
是二进制标志位,在设备重新连接物联网平台时,是否开始一个新的会话,并清除任何现有的会话状态信息。cleanStart=true
:建连时删除之前的会话,设备端需要重新订阅topic,也不会收到物联网平台缓存的QoS1消息。cleanStart=false
:如果会话没被删除,则继续使用之前的会话。在设备断开连接后,会话被保留的时长为Session Expiry Interval
。如果设备在保留时长内重新连接物联网平台,则不需要重新订阅topic,会收到物联网平台缓存的QoS1消息。如果设备没有在保留时长内重新连接,则会话被删除,设备需要重新订阅Topic,不会收到物联网平台缓存的QoS1消息。
Session Expiry Interval
代表时间间隔,单位为秒。在这个时间间隔内,设备断开连接后,物联网平台会保留会话状态。如果不设置,时间间隔默认为0。如果设置为0xFFFFFFFF,时间间隔为无限长。根据会话过期间隔属性
Session Expiry Interval
和cleanStart
的不同取值,会出现以上四种情况:cleanStart=true
且Session Expiry Interval=0
。设备断开连接时立即清理会话,设备重新连接时需要建立新的会话。cleanStart=true
且Session Expiry Interval=∞
,与情况一的结果相同。只要cleanStart=true
,设备就会在重新连接时建立新的会话,无论Session Expiry Interval
取值多少。cleanStart=false
,Session Expiry Interval>0
但小于设备断开的时间间隔。会话保留的时间较短,在设备重新连接前物联网平台,会话已被删除。cleanStart=false
,Session Expiry Interval=∞
。会话保留的时间无限长,设备重新连接后继续使用之前的会话。
使用场景
设备频繁掉线
对于车辆等持续移动的设备,如果经常清除会话,会导致频繁的订阅。这种情况适用于上图的情况3,如果设备在一定时间内重连就复用会话,当设备长时间不能连接时清除会话,避免接收处理过期的消息。
消息不能丢失的设备
对于POS机、播报音箱等金融设备,对消息的到达率要求非常高,适用于上图的情况4。
会话从创建到结束保持一致,不会丢失订阅关系和消息。
状态无关的设备
对于广告屏设备,持续更新播放新的广告内容,不需要接收过期消息,适用于上图的情况1。
不保留会话,可以避免收到无效过期的内容,也可以节约云端的资源消耗。