Amazon web services AWS物联网规则导致有效负载为空
我的气象站正在通过MQTT向AWS IoT发布其状态 消息将发布到主题Amazon web services AWS物联网规则导致有效负载为空,amazon-web-services,mqtt,aws-iot,Amazon Web Services,Mqtt,Aws Iot,我的气象站正在通过MQTT向AWS IoT发布其状态 消息将发布到主题 $aws/things/my-weather-station-001/shadow/update如下所示: { "state": { "reported": { "temperature" : 22, "humidity" : 70, .... "wind" : 234, "air" : 345 } } 收到消息后,我创建了一个规则将其存储在AW
$aws/things/my-weather-station-001/shadow/update
如下所示:
{
"state": {
"reported": {
"temperature" : 22,
"humidity" : 70,
....
"wind" : 234,
"air" : 345
}
}
收到消息后,我创建了一个规则将其存储在AWS DynamoDB中。规则选择语句为:
选择state.reported.*来自$aws/things/+/shadow/update/accepted
当这工作正常时,当我发送包含state.reported
字段的消息时
然而,有时会向主题$aws/things/weather-station-0001/shadow/update
发送“控制”消息,告知设备打开LED或其他部分。这些消息通常由应用程序或控制服务器发送,如下所示注意,它没有报告的字段,而是所需的
{
"state": {
"desired": {
"led1" : "on",
"locked" : true
}
}
因此,当这些消息到达时,它们仍然由规则处理,并以{}
空负载到达DynamoDb表
有没有办法强制规则忽略不包含
state.reported
元素的消息?您可以在SQL语句中添加where子句。试一试
选择state.reported.*从$aws/things/+/shadow/update/accepted WHERE state.reported''
谢谢您的建议,但是现在由于执行此规则,我得到了空的{}
有效负载:值操作符可以帮助吗?如果您试图通过MQTT更新thing shadow,那么主题应该是$aws/things//shadow/update
谢谢@cencoblocks的建议,但是我认为您在这种情况下是错误的。为了接收AWS物联网“确认”的更新,您需要订阅$AWS/things//shadow/update/accepted
,或者如果您对。/shadow/update/delta
的增量感兴趣。如果您只订阅了.shadow/update
,那么您并不是在真正使用shadows服务,而是在获取您发送的更新(包括格式不正确时)。您可以在问题中的这一行阅读更多信息,该消息发布到主题$aws/things/my-weather-station-001/update,看起来是这样的:
的主题不正确,您应该发布到$aws/things/my-weather-station-001/shadow/update
@。这只是问题中的一个输入错误(将修复它)。实际代码如您所说发布到$aws/things/my-weather-station-001/shadow/update