我有一个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 }
有关出错的任何建议?谢谢:))
答案 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'。