大家好,我是牛牛。今天給分享一下使用Node搭建MQTT服務(wù)端的流程,主要包含以下幾部分內(nèi)容:
MQTT介紹
MQTT基本原理及相關(guān)概念
Node搭建MQTT
一、MQTT介紹
MQTT 是一種基于發(fā)布/訂閱模式的輕量級物聯(lián)網(wǎng)消息傳輸協(xié)議 ,可以用極少的代碼和帶寬為聯(lián)網(wǎng)設(shè)備提供實時可靠的消息服務(wù),它廣泛應(yīng)用于物聯(lián)網(wǎng)、移動互聯(lián)網(wǎng)、智能硬件、車聯(lián)網(wǎng)、電力能源等行業(yè)。
MQTT主要有以下幾個特點(來自百度和MQTT中文網(wǎng)):
使用發(fā)布/訂閱消息模式,一對多的消息發(fā)布
開發(fā)消息協(xié)議,易于實現(xiàn)
1字節(jié)固定頭,2字節(jié)報文,開銷小
基于TCP/IP協(xié)議族,提供有序,無損,雙向鏈接
與HTTP之類的協(xié)議相比,MQTT在通過網(wǎng)絡(luò)傳輸數(shù)據(jù)時表現(xiàn)出眾。另一個重要特點是易于在客戶端實現(xiàn)。
二、MQTT基本原理與相關(guān)概念
1.1 MQTT基本原理
在MQTT協(xié)議通訊中,有兩個最為重要的角色。它們分別是服務(wù)端和客戶端。
1、 MQTT服務(wù)端
MQTT服務(wù)端通常是一臺服務(wù)器。它是MQTT信息傳輸?shù)臉屑~,負責(zé)將MQTT客戶端發(fā)送來的信息傳遞給MQTT客戶端。MQTT服務(wù)端還負責(zé)管理MQTT客戶端。確保客戶端之間的通訊順暢,保證MQTT消息得以正確接受和正確投遞。
2、 MQTT客戶端
MQTT客戶端可以向服務(wù)端發(fā)布信息,也可以從服務(wù)端收取信息。把客戶端發(fā)送信息的行為稱為“發(fā)布”信息。而客戶端要想從服務(wù)端收取信息,則首先要向服務(wù)端“訂閱信息”。
1.2MQTT主題
MQTT服務(wù)端在管理MQTT信息通訊時,就是使用“主題”來控制的。
1.3MQTT發(fā)布與訂閱特性
MQTT通訊的核心樞紐是MQTT服務(wù)端。有了服務(wù)端對MQTT信息的接收、儲存、處理和發(fā)送,客戶端在發(fā)送和訂閱消息時,可以相互獨立,且在空間上可以分離,時間上可以異步。
三、Node搭建MQTT服務(wù)器
node安裝:
https://www.runoob.com/nodejs/nodejs-install-setup.html
3.1 安裝模塊
安裝所需要的MQTT模塊
可以使用mosca也可以使用依賴較小的adedes
https://www.npmjs.com/package/aedes
npm install aedes --save
如果下載慢指定鏡像源后再次執(zhí)行安裝:
npm config set registry https://registry.npm.taobao.org
3.2開啟服務(wù)端
服務(wù)器node端,新建index.js
// 引入模塊var aedes = require('aedes')();
//創(chuàng)建服務(wù)var server = require('net').createServer(aedes.handle);
// 監(jiān)聽客戶端連接aedes.on('client',(client)=>{ console.log("客戶端連接,clientId:"+client.id)})
// 監(jiān)聽客戶端斷開aedes.on('clientDisconnect',(client)=>{ console.log("客戶端斷開連接,clientId:"+client.id)})
//監(jiān)聽端口server.listen(1883,()=>{ console.log('[ Server ] server listening on port:1883');})
默認服務(wù)器ip地址為127.0.0.1,也可以自己指定。
運行服務(wù)端:
node index.js
使用MQTT.fx工具進行測試服務(wù)端連接:
點擊 Connect可以看到右側(cè)圖標(biāo)變綠,則代表連接成功。
同時服務(wù)端會顯示,連接的客戶端的id
點擊 Disconnect可以看到右側(cè)圖標(biāo)變灰,則代表斷開成功。
同時在服務(wù)端可以看到斷開連接的客戶端id
到目前為止,還沒有添加身份認證,也就代碼只要用戶知道服務(wù)端的ip和端口號都可以連接進來,如果需要考慮安全性,則可以添加身份驗證。
3.3 添加身份驗證
使用aedes.authenticate添加身份驗證
// 身份驗證aedes.authenticate = function (client, username, password, callback) { callback(null, username === "xydadmin" && password.toString()==="123456")}
添加驗證后嘗試連接,報錯:
在配置中添加用戶名和密碼,嘗試重連
3.4消息訂閱與消息發(fā)布
添加消息訂閱
// 設(shè)置訂閱aedes.on('subscribe', function (subscriptions, client) {
if (client) { // subscriptions 訂閱主題列表,一般一次訂閱一個 console.log('[ Subscribe ] SubscripTions:'+subscriptions[0].topic,' Qos:'+subscriptions[0].qos,' CilentID:'+client.id); }});
添加消息發(fā)布
// 設(shè)置發(fā)布aedes.on('publish',function(packet,client) { if (client) { // packet為發(fā)布的信息 console.log('[ Publish ] CilentID:'+client.id,' Qos:'+packet.qos,' Data:[ '+String(packet.payload),' ]'); }});
取消訂閱
//取消訂閱aedes.on('unsubscribe',function(unsubscriptions,client){ if(client){ console.log('[ unSubscribe ] unSubscripTions:'+unsubscriptions[0],' CilentID:'+client.id); }});
消息的發(fā)布與訂閱測試,目前是發(fā)布和訂閱使用相同的topic,在發(fā)布topic處設(shè)置發(fā)送內(nèi)容,客戶端訂閱了topic則可以接收到該發(fā)布topic的信息。
3.5MQTT.fx測試消息的發(fā)布和訂閱
訂閱topic:/login
發(fā)布topic:/login
查看訂閱topic處,即可看到發(fā)送的內(nèi)容。
-
服務(wù)器
+關(guān)注
關(guān)注
12文章
9336瀏覽量
86153
發(fā)布評論請先 登錄
相關(guān)推薦
ftp服務(wù)器怎么搭建
采用華為云 Flexus 云服務(wù)器 X 實例部署 MQTT 服務(wù)器完成設(shè)備上云
![采用華為云 Flexus 云<b class='flag-5'>服務(wù)器</b> X 實例部署 <b class='flag-5'>MQTT</b> <b class='flag-5'>服務(wù)器</b>完成設(shè)備上云](https://file1.elecfans.com//web3/M00/03/E8/wKgZPGdtLA2AX9q5AAH5KdWVI-Y569.png)
采用 Flexus 云服務(wù)器 X 實例搭建 RTSP 直播服務(wù)器
![采用 Flexus 云<b class='flag-5'>服務(wù)器</b> X 實例<b class='flag-5'>搭建</b> RTSP 直播<b class='flag-5'>服務(wù)器</b>](https://file1.elecfans.com//web3/M00/03/9B/wKgZPGdqgHiAFj_uAAaEfMWqIhs329.png)
如何使用HTTP服務(wù)器搭建本地Web網(wǎng)站
![如何使用HTTP<b class='flag-5'>服務(wù)器</b><b class='flag-5'>搭建</b><b class='flag-5'>本地</b>Web網(wǎng)站](https://file1.elecfans.com/web3/M00/03/84/wKgZPGdqFQKAI3ZXAAAPdXh0N3Y553.jpg)
評論