mqtt實現自動監聽服務器消息


  本示例借助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協議。

  具體應用時,我們只需要根據實現場景及兩者的特點,選擇更合適的通訊方式即可。

   

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM