【问题标题】:mqtt broker + node js + dht11 sensormqtt 代理 + 节点 js + dht11 传感器
【发布时间】:2018-01-21 12:37:05
【问题描述】:

我有一个关于 MQTT 代理的问题。我的代码在这里,它适用于 Mosca 服务器。

var mqtt = require('mqtt');
var scanf = require('scanf');

var client  = mqtt.connect('mqtt://localhost');
client.on('message', function (topic, message) {
  // message is Buffer
  console.log(message.toString())
  //client.end()
})

client.on('connect', function () {
  setInterval(function() {
    console.log('Please scan data');
    var data = scanf('%s');
    console.log('Message Sent');
    while(data==0){
      client.subscribe('/sensors/#');
      break;
    }
    if(data==1){
      client.unsubscribe("/sensors/#");
    }
  },500);
});

我在输入 0 后尝试获取传感器数据,但我输入了 0,直到那时它们都获得了所有数据。 Arduino ide 每 500 毫秒发送一次数据,但我只想在输入 0 时获取数据。

【问题讨论】:

    标签: node.js mqtt


    【解决方案1】:

    这有很多问题。

    首先scanf('%s') 将阻塞,直到按下回车键,这不是您在setInterval() 回调中想要的。

    接下来是你的while循环,它并没有按照你的想法做。

    您应该只调用一次client.subscribe('/sensors/#'),这会告诉客户端通知代理,该客户端将被告知与主题“/sensors/#”匹配的所有消息。之后,MQTT 客户端将接收所有发布的消息,直到调用client.unsubscribe('/sensors/#')

    另外,因为scanf('%s') 只被调用一次,所以data 永远不会改变 这意味着循环将永远运行或永远不会运行,具体取决于按下的键。

    你想要的是这样的:

    var mqtt = require('mqtt');
    var scanf = require('scanf');
    
    var data = "0";
    
    var client  = mqtt.connect('mqtt://localhost');
    client.on('message', function (topic, message) {
      if (data == "1") {
        console.log(message.toString())
      }
    })
    
    client.on('connect', function () {
      client.subscribe('/sensors/#');
    });
    
    do {
      data = scanf('%s');
    } while (true)
    

    这将启动并订阅主题,然后它会等待您输入 1,然后打印所有匹配的消息,如果您输入 0,它将停止打印值,直到您再次输入 1。

    附言良好的 MQTT 主题设计表明主题不应以前导“/”开头

    【讨论】:

      猜你喜欢
      • 2021-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多