首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mqtt代理+节点js + dht11传感器

mqtt代理+节点js + dht11传感器
EN

Stack Overflow用户
提问于 2018-01-21 20:37:06
回答 1查看 336关注 0票数 0

我有一个关于MQTT代理的问题。我的代码在这里,它与Mosca服务器一起工作。

代码语言:javascript
复制
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时获取数据。

EN

回答 1

Stack Overflow用户

发布于 2018-01-21 21:46:27

这样做有很多问题。

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

下一个while循环,它不会做你认为它做的事情。

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

此外,由于scanf('%s')只被调用一次,data永远不会改变,这意味着循环要么永远运行,要么根本不运行,这取决于按下的键。

你想要的是这样的:

代码语言:javascript
复制
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)

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

附注:好的MQTT主题设计表明主题不应该以'/‘开头

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48366839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档