在浏览器中轮询并从AJAX获取MQTT消息

初学者在这里。

好的,我试图完成一个简单的数据stream:

MQTT-Data-source —> MQTT Broker —> NodeJS-MQTT-Client —>浏览器上的AJAX(每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> 

这是一个非常糟糕的模式,您应该只使用Paho 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主题读取值,所以您必须等到该主题发布一些内容后,代理才会将其转发给所有订阅者。 因此,在上面的代码中设置连接,订阅,然后当一个消息被发布时,它被存储在mqttMessagevariables中,那么如果它没有被定义,它可以被REST结束点返回。