nodejs 實現(xiàn)MQTT協(xié)議的服務(wù)器端和客戶端的雙向交互的過程
一、項目背景
公司和第三方合作開發(fā)一個傳感器項目,想要通過電腦或者手機去控制項目現(xiàn)場的傳感器控制情況?,F(xiàn)在的最大問題在于,現(xiàn)場的邊緣終端設(shè)備接入的公網(wǎng)方式是無線接入,無法獲取固定IP,所以常規(guī)的HTTP協(xié)議通信就沒法做,現(xiàn)在打算使用MQTT來實現(xiàn)云平臺和邊緣終端(傳感器)之間的雙向通信。
二、術(shù)語定義
2.1云平臺
主要是針對數(shù)據(jù)、設(shè)備等的管理。部署在云端的軟件應(yīng)用系統(tǒng),通過與邊緣終端,實現(xiàn)數(shù)據(jù)獲取或者指令下發(fā)。
2.2邊緣終端
位于網(wǎng)絡(luò)邊緣的計算機設(shè)備,通過網(wǎng)絡(luò)與云平臺連接,向下連接解析儀和各類傳感器。
2.3解析儀
數(shù)據(jù)接受裝置,通過有線/無線模式,連接邊緣終端或通過有線模式接收不同來源的傳感器數(shù)據(jù)。
2.4傳感器
通過有線/無線模式,連接邊緣終端,傳輸相應(yīng)的參數(shù)或通過有線模式連接解析儀,傳輸相應(yīng)的參數(shù)。
三、網(wǎng)絡(luò)結(jié)構(gòu)
四、代碼實現(xiàn)
4.1 服務(wù)器實現(xiàn)
首先安裝nodejs和aedes,具體的操作和截圖網(wǎng)上有很多現(xiàn)成的。
新建一個“server.js”
const aedes = require('aedes')(); const aedesServer = require('net').createServer(aedes.handle); const port = 1883; aedesServer.listen(port, function () { console.log('服務(wù)啟動并開始監(jiān)聽端口:', port) }) //監(jiān)聽MQTT服務(wù)器端口,當有客戶端連接上時,觸發(fā)該回調(diào) aedes.on("client", (client) => { console.log("客戶端連接成功:", client.id); }) //監(jiān)聽MQTT服務(wù)器端口,當有客戶端主動斷開連接或者服務(wù)器600s內(nèi)沒收到某個客戶端的心跳包就會觸發(fā) aedes.on("clientDisconnect", (client) => { console.log("客戶端斷開連接:", client.id); }) //監(jiān)聽客戶端發(fā)布的主題 aedes.on("publish", function (packet, client) { //針對不同的客戶端寫不同的邏輯 if (client) { //根據(jù)主題不同寫不同的邏輯,建議采用JSON格式傳輸 console.log("監(jiān)聽客戶端發(fā)過來的消息",packet.topic, packet.payload.toString()); } }) //服務(wù)器發(fā)出的消息 setInterval(() => { aedes.publish({ topic: "serverMsg", payload: "服務(wù)器發(fā)消息", qos: 1, retain: false, dup: false, cmd: "publish" }, (err) => { if (err) { console.log("發(fā)布失敗"); } }); }, 20000)
4.2客戶端實現(xiàn)
新建一個“client.js”
客戶端只需要使用“mqtt.connect”方法,就可以跟服務(wù)端建立長連接。
就目前實際使用的情況看,客戶端偶爾會自動與服務(wù)器斷開,并且自動連上,穩(wěn)定性方面有待驗證。
var mqtt = require('mqtt'); var client = mqtt.connect('mqtt://192.168.70.220:1883',{ clientId:'nodejs-mqtt-client' }) client.on('connect',function (){ console.log('連接上MQTT服務(wù)器') //需要訂閱服務(wù)器主題,不然無法接受消息 client.subscribe('serverMsg',{ qos:1 }) }) //發(fā)布客戶端消息 setInterval(()=>{ client.publish('topic1','hello mqtt client',{ qos:1 }) },20000) client.on('message',function (topic,message){ console.log('接受服務(wù)器消息:','主題:',topic,'消息:',message.toString()) })
4.3 效果呈現(xiàn)
通過兩個定時器,實現(xiàn)了雙向通信。
服務(wù)端
客戶端
到此這篇關(guān)于nodejs 實現(xiàn)MQTT協(xié)議的服務(wù)器端和客戶端的雙向交互的文章就介紹到這了,更多相關(guān)nodejs MQTT協(xié)議內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
新手必須知的Node.js 4個JavaScript基本概念
本文介紹了4個基本JavaScript概念,它是你學習node.js所必需要掌握,下面就讓我們來看一下具體是哪4個基本JavaScript概念2018-09-09nodejs更新package.json中的dependencies依賴到最新版本的方法
今天小編就為大家分享一篇nodejs更新package.json中的dependencies依賴到最新版本的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10解決Window10系統(tǒng)下Node安裝報錯的問題分析
今天電腦重裝了win10系統(tǒng),在安裝Node的過程中出現(xiàn)了下面的問題,下面就和大家分享下用來解決這種問題的小方法2016-12-12NodeJS使用文件流解決大文件處理的內(nèi)存與時間效率問題
在 NodeJS 中,文件操作是常見的任務(wù)之一,然而,當處理大文件時,直接將整個文件加載到內(nèi)存中可能會導致內(nèi)存溢出或性能瓶頸,為了解決這一問題,NodeJS 提供了文件流(Stream)機制,本文將詳細介紹文件流的優(yōu)點、使用方法、應(yīng)用場景,并探討背壓(Backpressure)的概念2025-01-01Kubernetes Node刪除鏡像的實現(xiàn)步驟
本文介紹了在Kubernetes集群中如何刪除節(jié)點上的鏡像,包括連接節(jié)點、查看鏡像列表、使用Docker命令刪除鏡像以及驗證刪除結(jié)果的步驟,感興趣的可以了解一下2024-09-09nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEq
這篇文章主要介紹了node項目中遇到使用斷言測試程序,看了下nodejs的api之后,對nodejs中assert斷言的幾個方法做個簡單的記錄,需要的朋友可以參考下2017-09-09