Node.js中JSON.parse()函数的回调选项?

时间:2017-07-09 00:49:58

标签: node.js mqtt

我有一个MQTT消息总线/队列,用于控制家庭自动化模式中的许多内容。我在“警报”中所拥有的一件事情。在出现问题时提醒我的系统。我的警报系统的一个功能是让我知道房子的风速超过一定限度。我的问题是,警报代码向我发送虚假警报,显示数百的风速,而实际上它们(通常)低于20英里/小时。这是代码:

client.on('message', function(topic, msg) {
  if(topic.indexOf('wind') != -1) {
    var rr = JSON.parse(msg.toString());
    if(rr.speed > TOPSPEED) {
      notify.notify({
        title: '--ALERT!-- High Winds',
        message: 'Wind speed of ' + rr.speed + ' MPH was just recorded.',
        sound: "Sosumi"
      }, function(err,rsp) {
        // do nothing...we don't care if it error'd, or there was a response.
      });
    }
  } else {...

如此直截了当:如果传入的MQTT消息有一个' wind'话题,我解析了有效载荷并寻找速度'字段...如果它超过TOPSPEED值,那么我发出警报。问题是我已经看到了速度'值低于TOPSPEED值,但是发出的警报表示风速超过TOPSPEED设置的值......不确定是怎么回事。

我在想如果JSON.parse()有一种方法可以回调,那么我可以确定只有一条消息被考虑进行比较。我不知道如何添加多种速度,但我也无法解释这种行为,除非您将多个过去的风速相加。

以下是MQTT消息流的示例,其中我收到了105MPH风速的警报,但这些值不能合计到该值?!

wind/speed {"name": "Out2", "speed": 9.75 }
wind/dir {"name": "Out2", "dir": "NE" }
wind/speed {"name": "Out2", "speed": 9.75 }
wind/dir {"name": "Out2", "dir": "NE" }
wind/speed {"name": "Out2", "speed": 10.50 }
wind/dir {"name": "Out2", "dir": "NE" }
wind/speed {"name": "Out2", "speed": 7.50 }
wind/dir {"name": "Out2", "dir": "NE" }
wind/speed {"name": "Out2", "speed": 9.75 }
wind/dir {"name": "Out2", "dir": "ENE" }
wind/speed {"name": "Out2", "speed": 10.50 }

有关出错的任何建议?谢谢:))

1 个答案:

答案 0 :(得分:0)

  

风/速度{"名称":" Out2","速度":9.75}

     

wind / dir {" name":" Out2"," dir":" NE" }

     

var rr = JSON.parse(msg.toString());

为什么要将整个消息传递给解析器?您应该使用前缀或更好的子串,前缀实际上应该是JSON数据的一部分。 即。

{"type" : "wind", "attribute" : "speed", "name": "Out2", "speed": 9.75 }
{"type" : "wind", "attribute" : "dir", "name": "Out2", "dir": "NE" }
  

if(topic.indexOf(' wind')!= -1)

另一个问题是,只有一半的JSON数据包实际上具有“速度”'但是你正在测试(' if')' speed'在每条消息上。你应该检查风速/速度'不只是' wind'。