介紹
MQTT X 是一款開(kāi)源的MQTT 5.0 桌面測(cè)試客戶端蜕该,相比其他mqtt的桌面客戶端工具,比如paho洲鸠、mqtt.fx堂淡,Mqttx有以下的優(yōu)勢(shì):
- 支持創(chuàng)建多個(gè)同時(shí)在線的 MQTT 客戶端,方便用戶快速測(cè)試 MQTT/TCP扒腕、MQTT/TLS 绢淀、MQTT/WebSocket的連接/發(fā)布/訂閱功能及其他 MQTT 協(xié)議特性。
- 支持自動(dòng)重連和自動(dòng)恢復(fù)訂閱瘾腰。
- 全面的 MQTT 參數(shù)配置皆的,以便用戶應(yīng)對(duì)任何使用場(chǎng)景。
- 可以記錄訂閱主題蹋盆,以應(yīng)對(duì)多主題訂閱帶來(lái)的不便解阅。
- 支持運(yùn)行script來(lái)對(duì)實(shí)時(shí)接收到的消息進(jìn)行處理不撑,應(yīng)對(duì)復(fù)雜消息難以觀測(cè)的難題啦膜。
- 數(shù)據(jù)的導(dǎo)入導(dǎo)出探遵。
效果演示
本文主要講解如何使用mqtt x的腳本功能柳沙。
安裝
進(jìn)入官網(wǎng)訪問(wèn)選擇對(duì)應(yīng)平臺(tái)下載:https://mqttx.app/zh
Github倉(cāng)庫(kù):https://github.com/emqx/MQTTX
Script功能說(shuō)明
以下為mqttx從接收訂閱消息到顯示在控制臺(tái)的流程圖:
image.png
從流程圖可以看出重要的一點(diǎn)是岩灭,script處理的消息是經(jīng)過(guò)解碼之后得到的字符串,所以如果沒(méi)有在控制臺(tái)正確選中解碼方式赂鲤,那么script運(yùn)行可能得不到正確輸出噪径。
腳本編寫(xiě)與測(cè)試
腳本運(yùn)行之后,控制臺(tái)顯示的消息就是腳本的輸出数初。
Script功能例程
需求:已知接收到的消息為hex找爱,如果第一個(gè)字節(jié)是0xF0, 那么其中第二第三個(gè)字節(jié)是0-65535的數(shù)值A(chǔ),另外第四個(gè)字節(jié)的第三個(gè)位為一個(gè)開(kāi)關(guān)量B∨莺ⅲ現(xiàn)在需要在接收到消息時(shí)车摄,提取到A和B直接顯示出來(lái)。
Script如下:
/**
* @description: 處理mqtt接收到的消息
* @param {any} value - Payload 接收到的消息并且經(jīng)過(guò)解碼后的字符串
* @param {string} msgType - 消息的類(lèi)型,是訂閱消息還是發(fā)送消息 '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} - 經(jīng)過(guò)處理后的消息 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開(kāi)關(guān):"+extractBitFromHexStr(hexStrArray[3], 3))
}
printTextArr.push("原paylod:"+value)
return printTextArr.join(",")
}
/**
* @description:
* 將value(payload)轉(zhuǎn)為hex字符串?dāng)?shù)組并返回
* 例如:
* 輸入: "3C3C 0014"
* 輸出: ["3C", "3C", "00", "14"]
*
* @param {any} value - Payload,類(lèi)型是string
* @return {any} - hex字符串?dāng)?shù)組
*/
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字符串?dāng)?shù)組轉(zhuǎn)為整形數(shù)
* 例如:
* 輸入:["ff","ff"]
* 輸出:65535
*
* @param {array} hexStrArray - hex字符串?dāng)?shù)組
* @return {number} - 整形數(shù)
*/
function parseHexStrArraytoInt(hexStrArray){
return parseInt(hexStrArray.join(""), 16)
}
/**
* @description: 從hex字符串中提取位,返回0或者1
*
* @param {string} hexStr - hex字符串
* @param {number} bitNum - 取第幾位,低位從右邊開(kāi)始,最小為1
* @return {number} - 0或者1
*/
function extractBitFromHexStr(hexStr,bitNum){
return (parseInt(hexStr, 16) >>> (bitNum-1)) & 1
}
/**
* @description: 執(zhí)行handlePayload方法
*/
execute(handlePayload)
輸入消息與結(jié)果對(duì)照
E0 00 FF FF 輸出 原paylod:E0 00 FF FF
F0 00 FF FF 輸出 A值:255,B開(kāi)關(guān):1,原paylod:F0 00 FF FF
F0 FF 01 FF 輸出 A值:65281,B開(kāi)關(guān):1,原paylod:F0 FF 01 FF
F0 FF 01 FB 輸出 A值:65281,B開(kāi)關(guān):0,原paylod:F0 FF 01 FB
控制臺(tái)輸出