介紹
MQTT X 是一款開源的MQTT 5.0 桌面測試客戶端,相比其他mqtt的桌面客戶端工具,比如paho、mqtt.fx,Mqttx有以下的優勢:
- 支持創建多個同時在線的 MQTT 客戶端,方便用戶快速測試 MQTT/TCP、MQTT/TLS 、MQTT/WebSocket的連接/發布/訂閱功能及其他 MQTT 協議特性。
- 支持自動重連和自動恢復訂閱。
- 全面的 MQTT 參數配置,以便用戶應對任何使用場景。
- 可以記錄訂閱主題,以應對多主題訂閱帶來的不便。
- 支持運行script來對實時接收到的消息進行處理,應對復雜消息難以觀測的難題。
- 數據的導入導出。
效果演示
本文主要講解如何使用mqtt x的腳本功能。
安裝
進入官網訪問選擇對應平臺下載:https://mqttx.app/zh
Github倉庫:https://github.com/emqx/MQTTX
Script功能說明
以下為mqttx從接收訂閱消息到顯示在控制臺的流程圖:
image.png
從流程圖可以看出重要的一點是,script處理的消息是經過解碼之后得到的字符串,所以如果沒有在控制臺正確選中解碼方式,那么script運行可能得不到正確輸出。
腳本編寫與測試
腳本運行之后,控制臺顯示的消息就是腳本的輸出。
Script功能例程
需求:已知接收到的消息為hex,如果第一個字節是0xF0, 那么其中第二第三個字節是0-65535的數值A,另外第四個字節的第三個位為一個開關量B。現在需要在接收到消息時,提取到A和B直接顯示出來。
Script如下:
/**
* @description: 處理mqtt接收到的消息
* @param {any} value - Payload 接收到的消息并且經過解碼后的字符串
* @param {string} msgType - 消息的類型,是訂閱消息還是發送消息 'received' or 'publish'
* @param {number} index - 消息的索引 Index of the message, valid only when script is used in the publish message and timed message is enabled
* @return {any} - 經過處理后的消息 Payload after script processing
*/
function handlePayload(value, msgType, index) {
const hexStrArray = toHexStrArray(value)
var printTextArr = [];
if(hexStrArray[0] == "F0"){
printTextArr.push("A值:"+parseHexStrArraytoInt(hexStrArray.slice(1, 3)))
printTextArr.push("B開關:"+extractBitFromHexStr(hexStrArray[3], 3))
}
printTextArr.push("原paylod:"+value)
return printTextArr.join(",")
}
/**
* @description:
* 將value(payload)轉為hex字符串數組并返回
* 例如:
* 輸入: "3C3C 0014"
* 輸出: ["3C", "3C", "00", "14"]
*
* @param {any} value - Payload,類型是string
* @return {any} - hex字符串數組
*/
function toHexStrArray(value){
const rep = value.replace(/\s*/g,"")
let array = []
let arrLen = rep.length/2
for(var i = 0; i < arrLen; i++){
array.push(rep.substr(i*2, 2))
}
return array
}
/**
* @description:
* 大端模式下,將hex字符串數組轉為整形數
* 例如:
* 輸入:["ff","ff"]
* 輸出:65535
*
* @param {array} hexStrArray - hex字符串數組
* @return {number} - 整形數
*/
function parseHexStrArraytoInt(hexStrArray){
return parseInt(hexStrArray.join(""), 16)
}
/**
* @description: 從hex字符串中提取位,返回0或者1
*
* @param {string} hexStr - hex字符串
* @param {number} bitNum - 取第幾位,低位從右邊開始,最小為1
* @return {number} - 0或者1
*/
function extractBitFromHexStr(hexStr,bitNum){
return (parseInt(hexStr, 16) >>> (bitNum-1)) & 1
}
/**
* @description: 執行handlePayload方法
*/
execute(handlePayload)
輸入消息與結果對照
E0 00 FF FF 輸出 原paylod:E0 00 FF FF
F0 00 FF FF 輸出 A值:255,B開關:1,原paylod:F0 00 FF FF
F0 FF 01 FF 輸出 A值:65281,B開關:1,原paylod:F0 FF 01 FF
F0 FF 01 FB 輸出 A值:65281,B開關:0,原paylod:F0 FF 01 FB
控制臺輸出