Node.js下使用MQTT协议实现即时通讯和离线推送一个在node下正确实现该协议的博客。鼓捣了一段时间,没有深入理解,但基本可以达到使用目的。本文旨在为需要MQTT的学习者提供一定的便利,省去查阅官方文档和源码的功夫,但接收离线消息的顺序暂未处理。codeserver:server.js//服务器引入中间件moscaletmosca=require('mosca')letsettings={port:5112}letserver=newmosca.Server(settings)server.on('ready',function(){console.log('Mosca服务器在端口5112启动并运行');})server.on('published',function(packet,client){console.log('Published',packet.payload)})server.on('clientDisconnected',function(client){console.log('disconnected:',client.id)})pushend:pub.js//client引入mqttletmqtt=require('mqtt');letclient=mqtt.connect('mqtt://localhost',{port:5112,clientId:'cli_pub',})letnum=0;setInterval(function(){client.publish('test','Hellomqtt'+(++num),{qos:1},()=>console.log(num));},1000)订阅者:sub.jsletmqtt=require('mqtt')letclient=mqtt.connect('mqtt://localhost',{port:5112,clientId:'cli_sub',})client.subscribe('test',{qos:1})client.on('message',function(topic,message){console.log('receivedmessage:',message.toString())})server运行起来后,先启动sub,再启动pub,即推送的消息序列可以在sub中接收。至此,实现了简单的实时推送。离线推送相关配置及离线配置简介-server:要实现消息的离线推送,这里必须要用到一个存储临时数据的组件,它就是mongo,当然你也可以根据自己的需要选择其他的存储工具。server.js中的设置需要修改为:letsettings={port:5112,persistence:{//添加此项factory:mosca.persistence.Mongo,url:"mongodb://localhost:27017/mosca"}}factory:介绍mosca对具体存储工具的一些处理方法url:27017是mongo监听的端口号,mosca是存储相关数据的数据库。值得一提的是:配置好mongo环境后,不需要提前在mongo中手动创建。如果数据库不存在,它会自动生成,mosca会为你做所有其他基本的事情(即:如果你只是想暂时体验一下效果,你甚至可以暂时把mongo放在一边)在mongo中,你可以看到该db:mosca及其集合(相当于关系数据库中的表/关系)是自动添加的。离线配置-client:在pub.js和sub.js中client可以改成:letclient=mqtt.connect('mqtt://localhost',{port:5112,clientId:'cli_**',clean:false//增加此项})clientId:区分客户端的标识码clean:这个决定客户端在服务器端的session是否会被清除。默认为真。为了实现离线推送,我们需要保持干净,上面提到的持久化是离线推送的关键配置mqtt。connect()会返回一个mqttClient对象,包括:reconnect()、subscribe()、publish()等一系列方法本文将sender和receiver分成两个独立的文件pub.js和sub.js,只是为了方便在不同的控制台观察效果。客户端既可以是推送者也可以是订阅者。至此所有代码完成其他介绍:client.subscribe():为本客户端订阅一个主题,所有订阅该主题的用户都会收到该主题下推送??的信息//client.subscribe(topic,opts)client.subscribe('test',{qos:1})opts中的qos是一种通信机制,控制发送方和接收方之间的互锁程度。文中的其中一个集合:subscriptions是记录每个用户的主题订阅情况。用户cli_sub和cli2_sub订阅了主题test:(新增一个cli2_pub,下面有用)注:重复执行脚本sub.js实际上执行的是重复订阅主题。实际编码时,应该避免重复订阅主题,即使重复订阅不影响执行效果。client.publish():发送到指定topic数据消息为Buffer或String格式,可序列化或转json,实现复杂数据对象的传输//client.publish(topic,message,opts,callback)letnum=0;setInterval(function(){client.publish('test','Hellomqtt'+(++num),{qos:1},()=>console.log(num));},1000)参数这里不再赘述。topic:send'Hellomqtt1,2,3..'测试中使用回调函数实时打印发送的num:当订阅者离线时,可以在collection:packets:mosca中查看临时数据的存储情况每条推送消息为所有订阅的用户生成独立的记录,这些记录与同一个messageId相关联。当其中一个用户(cli2_sub)上线时,会获取相应的数据,然后删除数据库中相应的记录。此时,只有cli_sub用户的数据,当cli2_sub上线接收消息时,packets中的记录会被清空client.on():即客户端触发的事件,只列出消息接收事件这里//client.on(event,callback)client.on('message',function(topic,message){console.log('receivedmessage:',message.toString())})被处理为简单地打印到控制台附加的mosca.js文档:https://www.npmjs.com/package...mqtt.js文档:https://www.npmjs.com/package...windows环境下的mongo配置:https://jingyan.baidu.com/art...还有一篇前辈的文章:https://www.jianshu.com/p/831...转载请注明出处;)
