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