会话过期

设备与物联网平台保持连接时会形成会话状态,会话状态包括订阅的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 更精细的会话控制,可以在设备断开连接后的一段时间内保留会话状态,也可以在不需要会话时删除会话,节约云端的资源开发,避免收到不符预期的消息。

    image..png

    • cleanStart是二进制标志位,在设备重新连接物联网平台时,是否开始一个新的会话,并清除任何现有的会话状态信息。

      • cleanStart=true:建连时删除之前的会话,设备端需要重新订阅topic,也不会收到物联网平台缓存的QoS1消息。

      • cleanStart=false:如果会话没被删除,则继续使用之前的会话。在设备断开连接后,会话被保留的时长为Session Expiry Interval。如果设备在保留时长内重新连接物联网平台,则不需要重新订阅topic,会收到物联网平台缓存的QoS1消息。如果设备没有在保留时长内重新连接,则会话被删除,设备需要重新订阅Topic,不会收到物联网平台缓存的QoS1消息。

    • Session Expiry Interval代表时间间隔,单位为秒。在这个时间间隔内,设备断开连接后,物联网平台会保留会话状态。如果不设置,时间间隔默认为0。如果设置为0xFFFFFFFF,时间间隔为无限长。

    • 根据会话过期间隔属性Session Expiry IntervalcleanStart的不同取值,会出现以上四种情况:

      1. cleanStart=trueSession Expiry Interval=0。设备断开连接时立即清理会话,设备重新连接时需要建立新的会话。

      2. cleanStart=trueSession Expiry Interval=∞,与情况一的结果相同。只要cleanStart=true,设备就会在重新连接时建立新的会话,无论Session Expiry Interval取值多少。

      3. cleanStart=falseSession Expiry Interval>0但小于设备断开的时间间隔。会话保留的时间较短,在设备重新连接前物联网平台,会话已被删除。

      4. cleanStart=falseSession Expiry Interval=∞。会话保留的时间无限长,设备重新连接后继续使用之前的会话。

使用场景

设备频繁掉线

对于车辆等持续移动的设备,如果经常清除会话,会导致频繁的订阅。这种情况适用于上图的情况3,如果设备在一定时间内重连就复用会话,当设备长时间不能连接时清除会话,避免接收处理过期的消息。

消息不能丢失的设备

对于POS机、播报音箱等金融设备,对消息的到达率要求非常高,适用于上图的情况4。

会话从创建到结束保持一致,不会丢失订阅关系和消息。

状态无关的设备

对于广告屏设备,持续更新播放新的广告内容,不需要接收过期消息,适用于上图的情况1。

不保留会话,可以避免收到无效过期的内容,也可以节约云端的资源消耗。