Mqtt X工具的Script功能使用

介紹

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 
控制臺輸出
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1.HTML:(超文本標記語言——HyperText Markup Language)是構成 Web 世界的一磚一...
    109aed7ea56f閱讀 137評論 0 0
  • 前言 加密解密是前后端開發經常需要使用到的技術,應用場景包括不限于用戶鑒權、數據傳輸等,不同的應用場景也會需要使用...
    袋鼠云數棧前端閱讀 427評論 0 2
  • 1.前言(老司機直接跳過) 為什么js需要加密 談到加密,大多數人應用場景都在于后端接口的加密簽名校驗。這種一般...
    麻瓜三號閱讀 1,372評論 0 0
  • 思維方式是看待事物[https://baike.baidu.com/item/%E4%BA%8B%E7%89%A9...
    屋邊星光閱讀 435評論 0 0
  • 前言 冪等性,是開發人員在日常開發中必須要考慮的,尤其是轉賬、支付等涉及金額交易的場景,如果出現冪等性的問題,造成...
    技術深耕閱讀 250評論 0 0