MQTT 一個連接,訂閱多個主題封裝


var mqtt = require('mqtt')
var MqttClient= mqtt.connect('mqtt://test.mosquitto.org')
const linkList = [] // 長連接的列表
MqttClient.linkState = true // 這里是自定義的長連接狀態

// 連接成功
MqttClient.on("connect", () => {
        MqttClient.linkState = true // 改變連接狀態
        const linkArr = Object.values(MqttClient.messageIdToTopic)
        
        linkList.forEach(item => {
            if(!linkArr.includes(item)) {
                MqttClient.subscribe(item)
            }
        })

    })    

// 鏈接報錯
MqttClient.on("error", () => {
   MqttClient.linkState = false
})


    // 鏈接斷開
MqttClient.on("close", () => {
    MqttClient.linkState = false
})
        
// 添加主題
export function AddLink(link){
    // 當連接中 直接訂閱 
    if(MqttClient.linkState) {
        MqttClient.subscribe(link)
    }
    // 簡單地去重
    if(!linkList.includes(link)) linkList.push(link)   
}

// 刪除取消主題
export function DeleteLink(arr) {
    arr.forEach(item => {
        const key = linkList.findIndex(link => link === item)
        if(key >= 0) {
            linkList.splice(key,1)
            MqttClient.unsubscribe(item)
        }
    })
} 
// 回調消息
export function MyMqttMsg(Callback) {

    MqttClient.on("message", (topic, res) => {
       
        Callback(JSON.parse(res))
    })
}       

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM