mqtt broker + node js + dht11 sensor

时间:2018-01-21 12:37:06

标签: node.js mqtt

我对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每500ms继续发送数据,但我只想在输入0时获取数据。

1 个答案:

答案 0 :(得分:0)

这有很多问题。

首先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。

P.S。良好的MQTT主题设计说主题不应该以前导'/'

开头