在浏览器中投票并从AJAX获取MQTT消息

问题描述:

初学者在这里。在浏览器中投票并从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

这是一个非常糟糕的模式,你应该只使用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终点返回。