2017-09-21 89 views
1

初學者在這裏。在瀏覽器中投票並從AJAX獲取MQTT消息

好吧,我試圖完成一個簡單的數據流:

MQTT-數據源---> MQTT經紀人--->的NodeJS-MQTT客戶端---> AJAX式的Web瀏覽器(輪詢每3秒)

  • 我想能夠獲取MQTT消息並將其顯示在瀏覽器端的AJAX組件中。
  • 其次,在console.log(mqttMessage);,我如何清除以前的消息?因爲在控制檯上我可以看到所有以前的數據以及新增的數據。

我在Express上使用mqtt.js作爲我的nodejs mqtt支持。

//Server.js 
var mqtt   = require('mqtt'); 
... 
... 

var getData = function() { 
    mqttClient.subscribe(mqttTopic); 

    mqttClient.on('message', function(topic, message) { 
     mqttMessage = message.toString(); 
     console.log(mqttMessage); 
    }) 

    return mqttMessage; 
} 

app.get('/pollData', function(req, res) { 
    res.send(getData()); 
}); 

和一個簡單的html頁面上,我有:

<script type="text/javascript" src="http://code.jquery.com/jquery-1.10.1.min.js"></script> 
<script> 
    $(document).ready(
     function() { 
      setInterval(function() { 
        $.get('/pollData', function(res) { 
         $('#data').text(res); 
       }); 
      }, 3000); 
     } 
    ); 
</script> 
+0

任何使用AJAX輪詢的理由,而不是僅僅使用MQTT來通過Websockets將MQTT消息直接傳遞給頁面? – hardillb

+0

@hardillb我認爲這可能是靈活的,讓服務器先處理所有MQTT消息,並以任何格式將數據噴出...作爲AJAX返回,或數據庫查詢或JSON響應... – bshakya

+0

這不會使感。如果你只是傳遞消息而沒有任何好處,這會增加服務器的負載。 – hardillb

回答

2

這是一個非常糟糕的模式,你應該只使用MQTT泛美衛生組織JavaScript客戶端直接從訂閱主題網頁。

但是,如果你真的想這樣做,那麼以下是正確的做法。

//Server.js 
var mqtt   = require('mqtt'); 
... 
... 

var mqttMessage; 

mqttClient.subscribe(mqttTopic); 

mqttClient.on('message', function(topic, message) { 
    mqttMessage = message.toString(); 
    console.log(mqttMessage); 
}) 


app.get('/pollData', function(req, res) { 
    if (mqttMessage) { 
     res.send(mqttMessage); 
    } else { 
     res.status(404).send(); 
    } 
}); 

這是因爲你不從MQTT主題讀取的值,你必須要等到出頭是在該主題的發佈,則代理將其轉發給所有用戶。因此,在上面的代碼中設置了連接,訂閱,然後當發佈消息時,它將存儲在mqttMessage變量中,如果未定義,則可以由REST終點返回。