mqtt实现自动监听服务器消息

来源:互联网 发布:c语言跳动心形图案代码 编辑:程序博客网 时间:2024/06/15 22:22

  本示例借助meteor的一个环境跑,和我们平时用的node自己搭的环境或java,php的环境本质一样,在此不多讨论。

   首先需求是:多系统对接进行消息实时传递。

   安装好mqtt:    npm install mqtt --save

   本地服务(可以直接配在java中):这里采用mosca

  安装好mosca:  npm install mosca --save

var mosca=reqire('mosca');var mqttServer=new mosca.Server({port:8000});  //设置监听端口//published监听所发布的消息mqttServer.on('published',function(packet,client){  console.log('published----',packet);  switch(packet.topic){    //topic字段是消息主题,可以理解为接口中的方法名    case 'test':        //不同的订阅主题,发布消息不同    console.log(packet.payload.toString());    mqttServer.publish({topic:'other',payload:'测试不同主题!'});      break;    case 'other':    console.log(packet.paload.toString());    break;}});
//服务开启时给个提示:mqttServer.on(
'ready',function(){  console.log('Mosca server is running ... ');});

   订阅消息(接收):    

var mqtt=require('mqtt');var client=mqtt.connect('tcp://172.19.5.217:8000');  //本地建立连接//模拟一个消息发送var msg={talk:'this is test!!',name:'测试'};//轮洵发送,仅做测试用,实际场景不需要轮洵setInterval(function(){  client.publish('test',JSON.stringify(msg),{qos:1,retain:true});  //发布一条主题为test的消息,},60000);client.subscribe('test');  //订阅主题为test的消息client.on('message',function(topic,message){  var result=JSON.parse(message.toString());  //接收到新消息,并对其进行处理  try{    console.log('result---->',result);    //****do something ****   }catch(e){    console.log('error---->',result);  }})

  publish()方法接收四个参数publish(topic,message,[options],[callback]);

    topic: 消息主题;

    message:传递的消息;

    options:指定参数值:qos :服务质量级别,默认为0 (消息最多发送一次,不管是否接收到)

               retain:默认为false,推送至当前订阅就释放这条消息。设为true,表示服务器要保留这次推送的信息,如果新的订阅者出现,就把这条消息推送给它。

               dup:保证消息可靠传输,默认为false,只占用一个字节,表示第一次发送。不能用于检测消息重复发送等。注意需要满足以下条件:

              1.当QoS > 0,即消息至少传递一次)

              2.消息需要回复确认。

               此时,在可变头部需要包含消息ID(即client.id)。当值为1时,表示当前消息先前已经被传送过。

     这样一个简单的消息监听功能就做好了,我这边是做一个接收消息自动发送功能,效果如下:

 

   由于我做即时聊天有用到websocket,与mqtt都是与服务器保持长连接,进行消息传递。那么,来对比一下MQTT和WebSocket有什么区别?

    MQTT具备以下特点:

    1.采用发布/订阅消息传输协议,设计思想开放,简单,轻量。

    2.网络代码高,比较依赖网络。

    3.有三种服务质量:至多一次,只有一次,至少一次。前两者会有风险,后者会负载过重。

    WebSocket的不同在于:

    1.提供使用一个TCP连接进行双向通讯机制,包括网络协议和API,以取代网页和服务器采用HTTP轮询进行双向通讯。

    2.借用HTTP和HTTPS端口,与TCP建立连接和关闭连接时握手。传输消息采用TCP协议。

  具体应用时,我们只需要根据实现场景及两者的特点,选择更合适的通讯方式即可。