裝置與物聯網平台保持串連時會形成工作階段狀態,工作階段狀態包括訂閱的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。
不保留會話,可以避免收到無效到期的內容,也可以節約雲端的資源消耗。