中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

在Node.js下如何運(yùn)用MQTT協(xié)議實(shí)現(xiàn)即時(shí)通訊及離線推送-創(chuàng)新互聯(lián)

小編給大家分享一下在Node.js下如何運(yùn)用MQTT協(xié)議實(shí)現(xiàn)即時(shí)通訊及離線推送,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),鼓樓企業(yè)網(wǎng)站建設(shè),鼓樓品牌網(wǎng)站建設(shè),網(wǎng)站定制,鼓樓網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,鼓樓網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

代碼

服務(wù)端: server.js

//服務(wù)端引入中間件mosca
let mosca = require('mosca')
let settings = {
 port: 5112
}
let server = new mosca.Server(settings)
server.on('ready', function(){
  console.log('Mosca server is up and running at port 5112'); 
})
server.on('published', function(packet, client) {
 console.log('Published', packet.payload)
})

server.on('clientDisconnected', function(client){
 console.log('disconnected: ', client.id)
})

推送端: pub.js

//客戶端引入mqtt
let mqtt = require('mqtt');

let client = mqtt.connect('mqtt://localhost', {
 port: 5112,
 clientId: 'cli_pub',
})

let num = 0;
setInterval(function (){
 client.publish('test', 
 'Hello mqtt ' + (++num),
 {qos:1},
 () => console.log(num));
}, 1000)

訂閱端: sub.js

let mqtt = require('mqtt')

let client = mqtt.connect('mqtt://localhost', {
 port: 5112,
 clientId: 'cli_sub',
})

client.subscribe('test',{qos:1})

client.on('message', function (topic, message) {
 console.log('received message: ', message.toString())
})

server運(yùn)行后,先啟動(dòng)pub,再啟動(dòng)sub,即可在sub中接收到推送過來的消息序列

至此實(shí)現(xiàn)了簡單的即時(shí)推送

離線推送相關(guān)配置及簡要介紹

離線配置-服務(wù)端:

要實(shí)現(xiàn)消息的離線推送,必然需要一個(gè)存儲(chǔ)臨時(shí)數(shù)據(jù)的部件

此處用到的是mongo,當(dāng)然可以根據(jù)需要選擇其他的存儲(chǔ)工具

server.js中的settings需更改為:

let settings = {
 port: 5112,
 persistence:{  //增加了此項(xiàng)
  factory: mosca.persistence.Mongo,
  url: "mongodb://localhost:27017/mosca"
 }
}

factory: 引入mosca對(duì)特定存儲(chǔ)工具的一些處理方法

url: 其中的 27017 為mongo所監(jiān)聽的端口號(hào),mosca為存儲(chǔ)相關(guān)數(shù)據(jù)的數(shù)據(jù)庫

值得一提的是:配置好mongo的環(huán)境后,不需要提前在mongo中手動(dòng)創(chuàng)建,若數(shù)據(jù)庫不存在會(huì)自動(dòng)生成,而且mosca會(huì)為你作好其他一切基本事項(xiàng) (即:若只想臨時(shí)體驗(yàn)下效果,甚至可以暫時(shí)把mongo放一邊 )

在mongo中,可以看到自動(dòng)新添了db: mosca及其下的collection(相當(dāng)于關(guān)系型數(shù)據(jù)庫中的表/關(guān)系)

在Node.js下如何運(yùn)用MQTT協(xié)議實(shí)現(xiàn)即時(shí)通訊及離線推送

離線配置-客戶端:

pub.js和sub.js中的client中都可以改為:

let client = mqtt.connect('mqtt://localhost', {
 port: 5112,
 clientId: 'cli_**',
 clean: false//增加了此項(xiàng)
})
  • clientId: 區(qū)分客戶端的識(shí)別碼

  • clean: 此處決定了客戶端在服務(wù)端的session是否會(huì)被清除,默認(rèn)為true,為實(shí)現(xiàn)離線推送,我們需要將其保留

  • clean及上文中的persistence為實(shí)現(xiàn)離線推送的關(guān)鍵配置

mqtt.connect()會(huì)返回一個(gè)mqttClient對(duì)象,包含了:reconnect(), subscribe(), publish()等一系列方法。

本文中發(fā)送端接收端被分為了pub.js和sub.js兩個(gè)獨(dú)立文件,僅僅為了方便在不同控制臺(tái)中觀察效果
一個(gè)client可以既為推送端,又為訂閱端

至此,所有代碼已完成

其他介紹:

client.subscribe():
為本客戶端訂閱一個(gè)話題,所有訂閱此話題的用戶都會(huì)收到在此話題下推送的信息

//client.subscribe(topic,opts)
client.subscribe('test',{qos:1})

opts中的qos為通信機(jī)制,控制發(fā)送端與接收端的互鎖程度

上文中的其中一個(gè)collection: subscriptions即記錄各用戶話題訂閱情況

用戶cli_sub及cli2_sub訂閱了話題test:

在Node.js下如何運(yùn)用MQTT協(xié)議實(shí)現(xiàn)即時(shí)通訊及離線推送

(新增一個(gè)cli2_pub,下文有用)

注:

重復(fù)執(zhí)行腳本sub.js實(shí)際上對(duì)topic進(jìn)行了重復(fù)訂閱

實(shí)際編碼時(shí),應(yīng)避免topic的重復(fù)訂閱,即使重復(fù)訂閱并不影響實(shí)現(xiàn)效果

client.publish():

向指定topic發(fā)送數(shù)據(jù)

message為Buffer或String格式,可以通過序列化或轉(zhuǎn)json實(shí)現(xiàn)對(duì)復(fù)雜數(shù)據(jù)對(duì)象的傳送

//client.publish(topic, message, opts, callback)
let num = 0;
setInterval(function (){
 client.publish('test', 
 'Hello mqtt ' + (++num),
 {qos:1},
 () => console.log(num));
}, 1000)

參數(shù)不再贅述

此處用一個(gè)定時(shí)器定時(shí)在 topic: test 下發(fā)送'Hello mqtt 1,2,3..'

用回調(diào)函數(shù)實(shí)時(shí)打印一下發(fā)送的num:

在Node.js下如何運(yùn)用MQTT協(xié)議實(shí)現(xiàn)即時(shí)通訊及離線推送

當(dāng)訂閱者處于離線狀態(tài)時(shí),可以在collection: packets中查看到臨時(shí)數(shù)據(jù)的存儲(chǔ)情況:

在Node.js下如何運(yùn)用MQTT協(xié)議實(shí)現(xiàn)即時(shí)通訊及離線推送

mosca把每一條推送消息為所有訂閱用戶都生成了獨(dú)立的記錄,用同一個(gè)messageId進(jìn)行關(guān)聯(lián)

當(dāng)其中一個(gè)用戶(cli2_sub)上線時(shí),獲取到其對(duì)應(yīng)的數(shù)據(jù),

在Node.js下如何運(yùn)用MQTT協(xié)議實(shí)現(xiàn)即時(shí)通訊及離線推送

而后數(shù)據(jù)庫中相應(yīng)記錄便會(huì)被刪除

在Node.js下如何運(yùn)用MQTT協(xié)議實(shí)現(xiàn)即時(shí)通訊及離線推送

此時(shí)僅有cli_sub用戶的數(shù)據(jù)

當(dāng)cli2_sub上線接收消息后,packets中記錄將被清空

client.on():

即在client上觸發(fā)的事件,此處只列舉消息接收事件

//client.on(event, callback)
client.on('message', function (topic, message) {
 console.log('received message: ', message.toString())
})

處理為簡單地打印到控制臺(tái)。

以上是“在Node.js下如何運(yùn)用MQTT協(xié)議實(shí)現(xiàn)即時(shí)通訊及離線推送”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

名稱欄目:在Node.js下如何運(yùn)用MQTT協(xié)議實(shí)現(xiàn)即時(shí)通訊及離線推送-創(chuàng)新互聯(lián)
網(wǎng)頁網(wǎng)址:http://www.rwnh.cn/article6/cepoog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、移動(dòng)網(wǎng)站建設(shè)、搜索引擎優(yōu)化品牌網(wǎng)站建設(shè)響應(yīng)式網(wǎng)站、網(wǎng)站排名

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
达日县| 浮梁县| 绥阳县| 颍上县| 剑川县| 松桃| 本溪市| 蓬溪县| 阿鲁科尔沁旗| 竹山县| 苏尼特左旗| 壤塘县| 横山县| 松潘县| 姚安县| 武宁县| 江永县| 胶南市| 牙克石市| 乌苏市| 汤阴县| 洪江市| 昌江| 伊春市| 和平县| 新巴尔虎右旗| 渝北区| 丰原市| 罗甸县| 长海县| 福建省| 昌吉市| 太湖县| 嘉禾县| 桦甸市| 武陟县| 福安市| 婺源县| 三门峡市| 大同县| 垦利县|