nodejs 實現(xiàn)MQTT協(xié)議的服務器端和客戶端的雙向交互的過程
一、項目背景
公司和第三方合作開發(fā)一個傳感器項目,想要通過電腦或者手機去控制項目現(xiàn)場的傳感器控制情況?,F(xiàn)在的最大問題在于,現(xiàn)場的邊緣終端設備接入的公網(wǎng)方式是無線接入,無法獲取固定IP,所以常規(guī)的HTTP協(xié)議通信就沒法做,現(xiàn)在打算使用MQTT來實現(xiàn)云平臺和邊緣終端(傳感器)之間的雙向通信。
二、術語定義
2.1云平臺
主要是針對數(shù)據(jù)、設備等的管理。部署在云端的軟件應用系統(tǒng),通過與邊緣終端,實現(xiàn)數(shù)據(jù)獲取或者指令下發(fā)。
2.2邊緣終端
位于網(wǎng)絡邊緣的計算機設備,通過網(wǎng)絡與云平臺連接,向下連接解析儀和各類傳感器。
2.3解析儀
數(shù)據(jù)接受裝置,通過有線/無線模式,連接邊緣終端或通過有線模式接收不同來源的傳感器數(shù)據(jù)。
2.4傳感器
通過有線/無線模式,連接邊緣終端,傳輸相應的參數(shù)或通過有線模式連接解析儀,傳輸相應的參數(shù)。
三、網(wǎng)絡結構

四、代碼實現(xiàn)
4.1 服務器實現(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('服務啟動并開始監(jiān)聽端口:', port)
})
//監(jiān)聽MQTT服務器端口,當有客戶端連接上時,觸發(fā)該回調(diào)
aedes.on("client", (client) => {
console.log("客戶端連接成功:", client.id);
})
//監(jiān)聽MQTT服務器端口,當有客戶端主動斷開連接或者服務器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());
}
})
//服務器發(fā)出的消息
setInterval(() => {
aedes.publish({
topic: "serverMsg",
payload: "服務器發(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ě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服務器')
//需要訂閱服務器主題,不然無法接受消息
client.subscribe('serverMsg',{
qos:1
})
})
//發(fā)布客戶端消息
setInterval(()=>{
client.publish('topic1','hello mqtt client',{
qos:1
})
},20000)
client.on('message',function (topic,message){
console.log('接受服務器消息:','主題:',topic,'消息:',message.toString())
})4.3 效果呈現(xiàn)
通過兩個定時器,實現(xiàn)了雙向通信。
服務端

客戶端

到此這篇關于nodejs 實現(xiàn)MQTT協(xié)議的服務器端和客戶端的雙向交互的文章就介紹到這了,更多相關nodejs MQTT協(xié)議內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Nodejs監(jiān)控事件循環(huán)異常示例詳解
這篇文章主要給大家介紹了關于Nodejs監(jiān)控事件循環(huán)異常的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Nodejs具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-09-09
node連接MySQL數(shù)據(jù)庫的3種方式總結
現(xiàn)在前端基本上都會用一些NodeJs,想必也想自己寫一些API或者個人博客的后臺系統(tǒng),這些就離不開連接數(shù)據(jù)庫的問題,下面這篇文章主要給大家介紹了關于node連接MySQL數(shù)據(jù)庫的3種方式,需要的朋友可以參考下2022-08-08

