【发布时间】:2016-03-13 19:36:07
【问题描述】:
我的气象站正在通过 MQTT 将其状态发布到 AWS IoT。
消息发布到主题
$aws/things/my-weather-station-001/shadow/update 看起来像这样:
{
"state": {
"reported": {
"temperature" : 22,
"humidity" : 70,
....
"wind" : 234,
"air" : 345
}
}
收到消息后,我创建了一条规则将其存储在 AWS DynamoDB 中,规则选择语句为:
SELECT state.reported.* FROM $aws/things/+/shadow/update/accepted
当它运行良好时,当我发送包含state.reported 字段的消息时。
但是,有时会向主题$aws/things/weather-station-0001/shadow/update 发送“控制”消息,告诉设备打开 LED 或其他部分。这些消息通常由应用程序或控制服务器发送,如下所示注意,它有desired
reported
{
"state": {
"desired": {
"led1" : "on",
"locked" : true
}
}
因此,当这些消息到达时,它们仍由规则处理,并以 {} 空负载到达 DynamoDb 表。
有没有办法强制规则忽略不包含state.reported 元素的消息?
【问题讨论】:
-
如果您尝试通过 MQTT 更新事物影子,则主题应为
$aws/things/<thing_name>/shadow/update -
感谢@cementblocks 的建议,但我认为您在这种情况下是不正确的。为了接收 AWS IoT “确认”的更新,您需要订阅
$aws/things/<thing_name>/shadow/update/accepted,或者如果您对增量感兴趣,请订阅../shadow/update/delta。如果您只订阅..shadow/update,您并没有真正使用影子服务,而只是取回您发送的更新(包括格式错误的更新)。您可以在docs.aws.amazon.com/iot/latest/developerguide/… 上阅读更多信息 -
你的问题
The message is published to topic $aws/things/my-weather-station-001/update and looks like this:中的这一行有错误的主题,你应该发布到$aws/things/my-weather-station-001/shadow/update -
@cementblocks 对不起,我的错。这只是问题中的一个错字(将解决它)。正如您对
$aws/things/my-weather-station-001/shadow/update所说,实际代码正在发布
标签: amazon-web-services mqtt aws-iot