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

时间:2017-09-21 10:05:31

标签: node.js ajax express mqtt

初学者。

好的,我正在尝试完成一个简单的数据流:

MQTT-Data-source ---> MQTT经纪人---> NodeJS-MQTT-Client ---> AJAX-on-web-browser(每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>

1 个答案:

答案 0 :(得分:2)

这是一个非常糟糕的模式,您应该只使用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主题中读取值,您必须等到该主题发布某些事情,然后代理才会将其转发给所有订阅者。所以在上面的代码中你设置了连接,订阅,然后在发布消息时它存储在mqttMessage变量中,如果它没有未定义,它可以由REST端点返回。