Amazon web services AWS物联网规则导致有效负载为空

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

我的气象站正在通过MQTT向AWS IoT发布其状态

消息将发布到主题
$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