手机版

Node.js下利用MQTT协议进行即时通讯和离线推送的方法

时间:2021-08-27 来源:互联网 编辑:宝哥软件园 浏览:

前言

前几天了解到协议mqtt在web上可以达到即时通讯的效果,但是在node下找一个正确实现这个协议的当前版本的博客并不容易。

我努力了一段时间,但是没有深入了解,但是基本上可以达到使用的目的。

本文未处理离线消息的接收顺序。

密码

Server : server.js

//服务器引入中间件Mosca let Mosca=require(' Mosca ')let settings={ port : 5112 } let server=new Mosca . server(settings)server . on(' ready ',function(){ console . log(' Mosca server已启动并在端口5112运行');})server.on('published ',函数(packet,client) { console.log('Published ',packet . payload)})server . on(' client disconnected ',函数(client){ console . log(' disconnected : ',client.id)})推送:pub.js。

//客户端引入mqtt lt mqtt=require(' mqtt ');让client=mqtt . connect(' mqtt ://localhost ',{ port: 5112,clientId: 'cli_pub ',})让num=0;setInterval(function(){ client . publish(' test ',' Hello mqtt ' (num),{ qos:1 },()=console . log(num));},1000)订户: sub.js

让mqtt=require('mqtt ')让client=mqtt . connect(' mqtt ://localhost ',{ port: 5112,clientId: 'cli_sub ',})client.subscribe('test ',{ QoS 33601 })client . on(' message ',function (topic,message){ console . log(' receivedmessage 3360 ',message.tostring ())})服务器运行后,先启动pub,然后启动

到目前为止,已经实现了简单的即时推送

离线推送相关配置及简介

离线配置-服务器:

为了实现消息的离线推送,需要一个存储临时数据的组件

这里使用的是Mongo,当然你也可以根据自己的需要选择其他的存储工具

server.js中的设置需要更改为:

让设置={端口: 5112,持久性3360 {//增加了这个项目:工厂: mosca。Persistence.mongo,URL 3360 ' MongoDB 3360//LocalHost :27017/Mosca ' } } Factory 3360介绍了针对Mosca中特定存储工具的一些处理方法

Url:其中27017是mongo监听的端口号,mosca是存储相关数据的数据库

值得一提的是:配置好mongo的环境后,不需要提前在mongo上手动创建。如果数据库不存在,它会自动生成,mosca会为你做所有其他基本的事情(也就是说,如果你只是想暂时体验一下效果,你甚至可以暂时把mongo放在一边)

在mongo中,您可以看到db: mosca及其集合(相当于关系数据库中的表/关系)是自动添加的。

离线配置-客户端:

pub.js和sub.js中的客户端可以更改为:

let client=mqtt . connect(' mqtt ://localhost ',{ port: 5112,clientId: 'cli_**,Clean: false//添加此项})clientId:用于区分客户端的标识符Clean:此执行确定是否将清除服务器上客户端的会话,默认值为true。为了实现离线推送,我们需要保持干净和上面提到的持久性,作为离线推送的关键配置。mqtt.connect()将返回一个mqttClient对象,该对象包括一系列方法,如reconnect()、subscribe()、publish()等。

本文将发送方和接收方分为pub.js和sub.js两个独立的文件,只是为了方便在不同的控制台上观察效果,一个客户端既可以是推送终端,也可以是订阅终端

至此,所有代码都已完成

其他介绍:

Client.subscribe():为此客户端订阅了一个主题,所有订阅此主题的用户都将收到此主题下推送的信息

//client.subscribe (topic,opts) client.subscribe ('test ',{ qos 33601 })opts中的QoS是一种通信机制,控制着发送方和接收方之间的互锁程度

上面文章中的一个:订阅集合记录了每个用户的主题订阅

用户cli_sub和cli2_sub订阅了主题test:

(添加cli2_pub,这在下面很有用)

注意:

重复执行脚本sub.js实际上是重复订阅主题

在实际编码中,应该避免主题的重复订阅,即使重复订阅不影响实现效果

client.publish():

向指定主题发送数据

消息采用缓冲区或字符串格式,可以通过序列化或json传输复杂的数据对象。

//client.publish(主题、消息、opts、回调)让num=0;setInterval(function(){ client . publish(' test ',' Hello mqtt ' (num),{ qos:1 },()=console . log(num));},1000)参数将不再描述

这里用一个定时器发送Hello mqtt,2,3 .’正在测试topic:

使用回调函数实时打印发送的号码:

当用户脱机时,可以通过收集:个数据包来查看临时数据的存储情况:

Mosca为所有订阅者的每个推送消息生成一个独立的记录,并将其与相同的messageId相关联

当其中一个用户(cli2_sub)上线时,会获得相应的数据。

那么数据库中相应的记录将被删除

此时,只有cli_sub用户的数据可用

当cli2_sub联机接收消息时,数据包中的记录将被清除

client.on():

也就是在客户端触发的事件,这里只列出了消息接收事件

//client.on(事件,回调)client.on ('message ',函数(topic,message){ console . log(' received message : ',message.tostring ())})简单地打印到控制台

以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。

版权声明:Node.js下利用MQTT协议进行即时通讯和离线推送的方法是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。