概述
MQTT X 是由全球領先的開源物聯網中間件提供商 EMQ 開源的一款跨平臺 MQTT 5.0 桌面測試客戶端,它支持 macOS,Linux,Windows。MQTT X 的用戶界面藉助聊天軟件的形式簡化了頁面的操作邏輯,用戶可以快速創建多個同時在線的 MQTT 客戶端,方便測試 MQTT/TCP、MQTT/TLS、MQTT/WebSocket 的連接/發佈/訂閱功能及其他 MQTT 協議 特性。
MQTT X 網站:https://mqttx.app/cn/
MQTT X v1.4.2 版本下載:https://github.com/emqx/MQTTX/releases/tag/v1.4.2
Mac 用戶可在 App Store 中進行下載:https://apps.apple.com/cn/app/mqttx/id1514074565?mt=12
Linux 用戶可在 Snapcraft 中進行下載:https://snapcraft.io/mqttx
腳本功能
MQTT X 在 v1.4.2 版本後,加入了腳本功能,提供了讓用戶編輯腳本對 MQTT 連接中,發送和接收的 Payload
進行自定義轉化的功能。可用來模擬自定義測試場。主要編寫的腳本語言爲 JavaScript。下文將簡單的介紹兩個簡單的測試實例場景來對腳本功能進行介紹,需注意:在 v1.4.2 版本中腳本功能屬於開放性測試功能,使用流程、安全性和功能性還需後續繼續優化提升和完善。 也歡迎各位用戶到 MQTT X 的 GitHub issue 區進行詳細討論,我們將會認真審閱和回覆。
在編輯腳本功能中,全局只包含了一個 execute
API,用戶需要編寫一個自定義函數,該函數接收一個 value
參數,即爲 Payload
, 函數中便可對 value
進行自定義修改轉化,最後將該函數作爲參數傳入到 execute
中即可執行自定義編寫的函數。
實例一
配合定時發送功能模擬溫溼度數據上報。
例如,當用戶使用 EMQ X 時,需要使用規則引擎功能將數據保存到數據庫。這時可以在配置完成後,使用 MQTT X 連接到 EMQ X,並使用腳本功能對其進行測試。這裏假設用戶需要保存上報的溫溼度數據,且數據格式爲 JSON 類型,我們可以使用下面的腳本對數據進行模擬。
/**
* Simulated temperature and humidity reporting
* @return Return a simulated temperature and humidity JSON data - { "temperature": 23, "humidity": 40 }
* @param value, MQTT Payload - {}
*/
function random(min, max) {
return Math.round(Math.random() * (max - min)) + min
}
function handlePayload(value) {
let _value = value
if (typeof value === 'string') {
_value = JSON.parse(value)
}
_value.temperature = random(10, 30)
_value.humidity = random(20, 40)
return JSON.stringify(_value, null, 2)
}
execute(handlePayload)
此時可將這段代碼複製到腳本頁面的代碼編輯框內,點擊右上角的 保存
按鈕,設置腳本名稱爲 TempAndHum 並保存。我們在 Input 輸入框內輸入一個 {}
作爲初始數據。點擊 測試
按鈕,在 Output 框內查看執行結果,如果結果符合預期,接下來將可以正常使用該腳本。
我們使用 EMQ X 提供的 免費公共 MQTT 服務器 新建一個連接,該服務基於 EMQ X 的 MQTT 物聯網雲平臺 創建。服務器接入信息如下:
- Broker: broker.emqx.io
- TCP Port: 1883
- Websocket Port: 8083
連接成功後,點擊右上角的下拉功能菜單,選擇 使用腳本
,在彈出窗中,選擇剛纔保存好的 TempAndHum 腳本,然後選擇應用類型爲發送時,點擊確認按鈕後開啓腳本功能。
開啓腳本後,我們再繼續設置定時發送功能,同樣點擊右上角的下拉功能菜單,選擇 定時消息
,這裏我們設置發送頻率爲 1 秒,點擊確認後定時消息功能開啓。
準備好後,便可以輸入初始的 Payload
和需要發送到的Topic
,點擊發送成功一條消息後,便可以看到 MQTT X 將每秒自動發送了一次模擬數據。
這樣避免了用戶去手動輸入和修改數據的麻煩,且使用腳本時模擬數據可控,模擬數據區間可在腳本的 random
函數中設定,如果有對保存的數據進行可視化圖表測試需求或需要添加一定的數據量的數據來測試時,都較爲方便和友好。
實例二
將接收到的 Payload
中的時間戳轉化爲正常時間。
在一些測試場景中,用戶測試接收到的 Payload
內可能會包含時間戳信息,如果需要觀察和測試對時間較爲敏感的數據,可能需要複製出數據,再將時間戳轉化時間,較爲麻煩。此時可以使用腳本對接收到的數據進行自動轉化,方便用戶觀察數據信息。我們可以使用下面的腳本對數據進行轉化。依然假設接收到的數據爲 JSON 類型,並且包含了 time 字段。
/**
* Convert timestamp to normal time.
* @return Return the UTC time - { "time": "2020-12-17 14:18:07" }
* @param value, MQTT Payload - { "time": 1608185887 }
*/
function handleTimestamp(value) {
let _value = value
if (typeof value === 'string') {
_value = JSON.parse(value)
}
// East Eight District needs an additional 8 hours
const date = new Date(_value.time * 1000 + 8 * 3600 * 1000)
_value.time = date.toJSON().substr(0, 19).replace('T', ' ')
return JSON.stringify(_value, null, 2)
}
execute(handleTimestamp)
此時可將這段代碼複製到腳本頁面的代碼編輯框內,點擊右上角的 保存
按鈕,設置腳本名稱爲 Time 並保存。我們在 Input 輸入框內輸入一個 { "time": 1608365158 }
作爲初始數據。點擊 測試
按鈕,在 Output 框內查看執行結果,如果結果符合預期,接下來將可以正常使用該腳本。
此時我們依然新建一個連接,使用上述中描述的方法來開啓腳本。注意選擇應用類型時,需要選擇爲接收時。
腳本功能開啓後,我們添加一個 testtopic/time
的 Topic
,然後我們向該 Topic
發送一條包含時間戳信息的 Payload
。然後查看接收到的 Payload
信息,可以看到已經自動幫時間戳轉化爲了正常時間。
總結
至此,我們完成了 MQTT X 的腳本實例使用的教程。該功能具有一定的擴展性和靈活性,需用戶配合實際需求來進行使用。腳本使用實例可在 GitHub 倉庫的 /docs/script-example 文件夾中查看,目前提供了兩個內置腳本,時間戳轉化和溫溼度數據模擬。如果在您的使用中有更好的,更實用的腳本也可以提交您的代碼到這裏,方便讓更多的人使用到。
該項目完全開源,您可以到 GitHub 來提交使用過程中遇到的問題,或是 Fork MQTT X 項目向我們提交修改後的 PR,我們將會及時查閱和處理。也特此感謝社區中所有用戶的貢獻和反饋。
版權聲明: 本文爲 EMQ 原創,轉載請註明出處。
原文鏈接:https://www.emqx.cn/blog/mqttx-script-function-tutorial