使用測試客戶端「玩轉」MQTT 5.0

emqx發表於2022-01-12

近日,由 EMQ 開源的跨平臺 MQTT 5.0 桌面測試客戶端 MQTT X 釋出了最新版本 v1.7.0。MQTT X 支援快速建立多個同時線上的 MQTT 客戶端,方便測試 MQTT/TCP、MQTT/TLS、MQTT/WebSocket 的連線、釋出、訂閱功能及其他 MQTT 協議特性。

新發布的 1.7.0 版本對 MQTT 5.0 實現了更為全面的支援,是全球目前為止對 MQTT 5.0 支援最為完整的桌面測試客戶端工具。同時新增了很多優化使用者體驗的功能。

在本文中,我們將詳細介紹 MQTT X v1.7.0 新增功能的具體使用操作,特別是如何使用 MQTT X 來測試 MQTT 5.0 的諸多特性,以便讀者可以在實際專案中更好地應用 MQTT 5.0。

準備 MQTT 訊息伺服器

在使用 MQTT X v1.7.0 對 MQTT 5.0 的特性進行測試之前,我們首先需要準備支援 MQTT 5.0 的 MQTT Broker。

本文將使用由 EMQ X Cloud 提供的免費線上 MQTT 5.0 伺服器配合 MQTT X 客戶端進行測試。作為一款全託管的雲原生 MQTT 5.0 訊息服務,EMQ X Cloud 可以在數分鐘內快速建立一個 MQTT 服務,並且完整支援 MQTT 5.0 協議,也是全球首個全託管的 MQTT 5.0 公有云服務。

在測試開始前,免費線上的 MQTT 5.0 伺服器伺服器接入資訊如下:

  • Broker: broker.emqx.io
  • TCP Port: 1883
  • SSL/TLS Port: 8883

MQTT 5.0 測試

使用者屬性

在 1.7.0 版本中,我們首先支援了使用者屬性的配置。使用者屬性是 MQTT 5.0 中非常實用的一個特性,它是一種自定義屬性,允許使用者向 MQTT 訊息新增自己的後設資料,傳輸額外的自定義資訊以擴充更多應用場景,比如實現訊息的分發,檔案傳輸,語言區分等。該功能與 HTTP 的 Header 的概念非常類似。我們可以在建立客戶端連線和釋出訊息時進行使用者屬性的配置。

客戶端連線

點選新建按鈕,來到新建客戶端的頁面,首先我們需要選擇 MQTT 的版本為 5.0,這樣就可以看到下方出現了配置使用者屬性的卡片,卡片內是一個可以配置鍵值對的輸入框,可以點選右上角的新增按鈕,來增加使用者屬性配置,點選每一行末尾的刪除按鈕可以刪除配置,最後輸入需要配置的屬性名稱和內容即可。連線成功後,MQTT 伺服器就可以獲取到該客戶端的使用者屬性內容。

MQTT 連線時的使用者屬性

訊息釋出

除了客戶端連線時的使用者屬性配置外,該版本還支援配置釋出訊息時的使用者屬性。當新建連線為 MQTT 5.0 的客戶端時,我們可以看到右下角的釋出訊息的區域出現了一個 Meta 按鈕,點選該按鈕即可出現配置釋出時的屬性的卡片,我們可以在卡片頂部看到使用者屬性配置。

MQTT 釋出時的使用者屬性

當配置使用者屬性完成後,點選儲存按鈕,此時我們再輸入 Topic 和 Payload 點選傳送,可以看到傳送的訊息框內,包含了當前訊息所包含的使用者屬性的內容,如果當我們接收到的訊息也包含了使用者屬性時,我們在接收到的訊息框內也可以看到客戶端傳送過來的使用者屬性配置。

訊息框內的使用者屬性

MQTT X 對於使用者屬性的支援,可以幫助開發者在測試和驗證具有 MQTT 5.0 使用者屬性功能的應用場景時,對該功能進行快速驗證和測試,從而提升開發和使用效率。

請求響應

在 1.7.0 版本中,支援了 MQTT 5.0 中的請求響應,提供對響應主題和對比資料屬性的配置,控制響應訊息被路由回請求的釋出者。

因為 MQTT 協議是基於 Pub/Sub 模式的,區別於類似 HTTP 協議這樣的請求響應模式,我們很難接收到一些響應訊息。比如當我們要測試釋出一條控制指令,我們很難獲取到指令傳送後的響應是什麼,雖然可以實現,但過於複雜。而 MQTT 5.0 中的請求主題可以更快更有效的實現這一能力。

我們以釋出一條開關燈的指令,並響應指令狀態為例,展示響應主題的使用方法。我們點選 Meta 按鈕,輸入框內輸入一個響應主題:/ack/1,輸入一個對比資料:light,並在當前連線客戶端訂閱一個 /ack/1。

注意:MQTT 的請求響應是非同步的,對比資料可以將響應訊息與請求訊息關聯。

MQTT 響應主題與對比資料

我們使用 MQTT.js 再實現一個客戶端,模擬接收控制指令的燈裝置。當接收到開燈指令後,給響應主題傳送一個開啟成功的響應訊息。實現關鍵程式碼:

client.on('message', (topic, payload, packet) => {
  console.log('Received Message:', topic, payload.toString())
  if (packet.properties && packet.properties.responseTopic) {
    client.publish(packet.properties.responseTopic, 'Success!', {
      qos: 0,
      retain: false,
    })
  }
})

點選傳送訊息,我們就能接收到來自燈裝置接收開關指令成功後的響應訊息了。

MQTT 釋出訊息

不過目前 MQTT X 對於請求響應特性僅支援在傳送時配置響應主題和對比資料。後續將繼續優化響應部分的配置,為使用者帶來更完整的測試請求響應的能力。

內容型別和載荷格式

在 1.7.0 版本中,支援指定配置有效載荷的格式和內容型別。允許在訊息釋出時指定載荷格式(二進位制、文字)和 MIME 樣式內容型別。我們只需要在釋出訊息前,點選 Meta 按鈕,在輸入框內輸入 Content Type,點選設定 Payload Format Indicator 的值後,釋出訊息即可。

MQTT 內容型別和載荷格式

內容型別的一個比較典型的應用就是存放 MIME 型別,比如 text/plain 表示文字檔案,audio/aac 表示音訊檔案,而 application/json 表示是一條 JSON 格式的應用訊息。

而有效載荷指示器屬性的值設定為 false 時,訊息是未確定的位元組,當該屬性值設定為 true 時,意味著訊息體中的有效載荷是 UTF-8 編碼的字元資料。

這將有助於 MQTT 客戶端或 MQTT 伺服器可以更加有效的解析訊息內容,而不用特意去對於訊息體進行格式或型別的判斷。

訂閱選項

在 1.7.0 版本中還對 MQTT 5.0 中的訂閱選項進行了支援。在新建一個 MQTT 5.0 的連線後,我們開啟訂閱主題的彈出框,可以看到下方出現了包含了 No Local、Retain as Published 和 Retain Handling 的配置選項,使用者可以使用這些訂閱選項來改變服務端的行為。

MQTT 訂閱選項

設定 No Local flag 為 true,那麼服務端將不會向你轉發你自己釋出的訊息。否則如果你訂閱了自己釋出訊息的主題,那麼你將收到自己釋出的所有訊息。

設定 Retain as Published flag 為 true 時,可以指定服務端向客戶端轉發訊息時是否要保留其中的 Retain 標識,而不是客戶端直接依靠訊息中的 Retain 標識來區分這是一個正常的轉發訊息還是一個保留訊息。

Retain Handling 這一選項用來指定訂閱建立時服務端是否向客戶端傳送保留訊息。設定為 0,只要客戶端訂閱成功,服務端就傳送保留訊息;設定為 1,客戶端訂閱成功且該訂閱此前不存在,服務端才傳送保留訊息;設定為 2,即便客戶訂閱成功,服務端也不會傳送保留訊息。

在後續版本中我們還將繼續支援訂閱識別符號等 MQTT 5.0 中的新特性。

其他新功能使用

一鍵多主題訂閱

在之前的版本中,我們每次開啟訂閱主題的彈框只能訂閱一個主題,對於想要訂閱多個主題的使用者來說,每次都需要點選開啟和關閉才能訂閱多個主題,不是很方便。因此該版本中,我們做了優化,支援一次訂閱多個主題。

我們開啟訂閱主題的彈出框後,在 Topic 輸入框內,輸入多個 Topic 並使用逗號(,)進行分割,點選確認訂閱成功後,我們可以看到訂閱列表中包含了多個 Topic。對於使用客戶端層的別名功能也可以支援同時對多個 Topic 進行設定,同理使用逗號分隔(,)。

注意:別名輸入框內的內容需要與 Topic 輸入框內的 Topic 一一對應。

MQTT 一鍵多主題訂閱

禁止訊息自動滾動

設定中新增了對接收和釋出訊息時,訊息列表自動滾動的控制。可以到設定頁面中開啟自動滾動功能,適用於當訊息接收速率較慢時,幫助使用者檢視到最新訊息。當接收訊息的速率過快時,可以點選關閉該功能,幫助使用者檢視一些已傳送或已接收到的舊訊息。

注意:當關閉自動滾動功能後,可以提升部分傳送和接收訊息時的效能。

MQTT X 禁止訊息自動滾動

結語

通過本文,相信大家對 MQTT X v1.7.0 的功能使用有了更多瞭解。MQTT X 與 EMQ X 配合使用,可以幫助您充分掌握 MQTT 5.0 協議,並在實際專案中將其特性更好地加以應用。

後續我們還會完善 MQTT X 對類似主題別名、請求響應和訂閱識別符號等配置的支援能力,敬請期待。

相關文章