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

  本示例藉助meteor的一個環境跑,和咱們平時用的node本身搭的環境或java,php的環境本質同樣,在此很少討論。php

   首先需求是:多系統對接進行消息實時傳遞。java

   安裝好mqtt:    npm install mqtt --savenode

   本地服務(能夠直接配在java中):這裏採用moscaweb

  安裝好mosca:  npm install mosca --savenpm

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]);websocket

    topic: 消息主題;網絡

    message:傳遞的消息;socket

    options:指定參數值:qos :服務質量級別,默認爲0 (消息最多發送一次,無論是否接收到)tcp

               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協議。

  具體應用時,咱們只須要根據實現場景及二者的特色,選擇更合適的通信方式便可。

相關文章
相關標籤/搜索