天天看點

2021-07-14目的及技術要點

MQTT離線消息接收測試實作

  • 目的及技術要點
    • 測試環境搭建及測試過程

目的及技術要點

目的 :

測試MQTT用戶端斷線,重新上線後,補全離線後所訂閱的離線消息。

技術要點:

Mqtt5支援離線消息接收的幾個核心設定:

ClientId

CleanStart: false

SessionExpiry

Qos:2

CONNACK中的session present flag

ClientId用于唯一辨別使用者session。

CleanStart設定為0,表示建立一個持久會話,在用戶端斷開連接配接時,會話仍然保持并儲存離線消息,直到會話逾時登出。CleanStart設定為1,表示建立一個新的臨時會話,在用戶端斷開時,會話自動銷毀。

SessionExpiry即指定在CleanStart為0時,會話的儲存時長,如果用戶端未在使用者定義的時間段内連接配接,則可以丢棄狀态(例如,訂閱和緩沖的消息)而無需進行清理。

Qos即消息的Quality of Service,若要支援離線消息,需要訂閱端、釋出端Qos >= 1

session present即在connect到mqtt伺服器的傳回結果ConnAck中,包含session present辨別,該辨別表示目前clientId是否存在之前的持久會話(persistent session),若之前已存在session(此時千萬不要再次重複訂閱topic,若再次訂閱則之前的消息都将收不到),則session會保留之前的訂閱關系、用戶端離線時的消息(Qos>=1)、未ack的消息。重點說明一下session present的使用,在用戶端連接配接到mqtt伺服器并擷取到connack中的isSessionPresent辨別時,若isSessionPresent=true則已存在會話,此時無需再重複訂閱topic(訂閱關系已儲存到session中,若再重複訂閱則收不到之前的離線消息),可通過全局接收來處理離線消息和之後的新消息;若isSessionPresent=false則不存在session(又或者session已超期),此時需要重新訂閱topic,且之前離線的消息都已接收不到,隻能通過其他方式擷取離線消息(例如IM後端服務的全量同步服務)。

如ClientId=1, CleanStart=false, SessionExpiry=3600s, Qos=2即指定clientId=1的會話為持久會話,使用者在離線後3600s的的離線消息都會被Mqtt伺服器儲存,使用者在離線時間不超過3600s且再次以ClientId=1重新上線時,是可以收到離線期間消息的補充推送的,同時Qos=2(exactly once)保證消息隻會被用戶端收到一次且一定一次。

————————————————

版權聲明:本文為CSDN部落客「羅小爬EX」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。

原文連結:https://blog.csdn.net/luo15242208310/article/details/103971457

測試環境搭建及測試過程

使用EMQX4.2.1的預設配置搭建MQTT服務端,一台VM虛拟機,安裝MQTT.fx-1.7.1作為MQTT用戶端 ,用于用戶端連接配接測試。

用戶端2用于離線消息發送,運作在本機,設定:Clean Session = 0;Auto Reconnect = 1;

2021-07-14目的及技術要點

連接配接到伺服器後,發送Topic是“test”,Qos = 1;發送消息是“Send01-09”

2021-07-14目的及技術要點

用戶端1用于離線消息接收,運作在虛拟機中,設定:Clean Session = 0;Auto Reconnect = 1;Qos=1;

2021-07-14目的及技術要點

EMQX伺服器端确認兩個用戶端已經連接配接,用戶端1訂閱消息成功。

2021-07-14目的及技術要點

斷開用戶端1所在的虛拟機的網絡,模拟裝置掉線。

2021-07-14目的及技術要點

在伺服器端确認用戶端1已經離線。

2021-07-14目的及技術要點

在用戶端2發送消息是“Send01-09”,在伺服器端可以看到“消息流入”是9條。

2021-07-14目的及技術要點

啟用虛拟機的網卡,讓用戶端1自動恢複連接配接,等待約120秒後,用戶端重新連接配接成功,自動接收離線消息合計9條,無資料丢失。

2021-07-14目的及技術要點

伺服器端可以看到“消息流出”也是9條,“消息丢棄”為0.

2021-07-14目的及技術要點

到此,整個離線消息接收功能測試全部完成。