![](/img/trans.png)
[英]AWS IoT Shadow - How to handle or reject invalid "desired" states?
[英]How to reject a "desired" change in AWS IoT Device Shadow
我们正在使用 AWS IoT“Device Shadow”服务在云后端服务和我们的嵌入式设备之间同步设置。
设备将其“报告的”state 发布到$aws/things/xxx/shadow/update :
{ "state": { "reported": ... } }
当后端想要更改某些内容时,它会发布一个“所需的”state:
{ "state": { "desired": ... } }
这会在我们在设备上订阅的$aws/things/xxx/shadow/delta上生成一条增量消息。 这一切都很好。
但是,有时设备需要拒绝更改(通常是因为设备处于离线状态,因此更改太旧且数据不可靠)。 在这种情况下,我们不想继续收到我们想要拒绝的更改的“增量”消息。
根据 AWS 论坛上的这篇帖子,我们可以将“所需的”state 设置为null来清除它:[https://repost.aws/questions/QUx_YtxvdmTFODhuuNd4D_Yw/how-to-deal-with-shadow-updates-initated-by -设备不和服务器]
根据示例,我尝试将此从我们的设备发送到$aws/things/xxx/shadow/update :
{"state": {"desired": null } }
但是,这会被服务器拒绝并导致在$aws/things/xxx/shadow/update/rejected上显示一条消息:
{
"code": 400,
"message": "Payload contains invalid json"
}
JSON 看起来有效。 此外,如果我将它从 AWS 控制台中的在线 MQTT 客户端发布到$aws/things/xxx/shadow/update ,这确实有效(即它被接受,并且具有预期的效果 - 设备影子的所需部分被删除).
为什么从设备发送消息时会出现此错误? 我如何清除/拒绝“期望的”更改?
- - 编辑 - -
事实证明这是客户端上的线程问题,导致出现乱码消息。 一种有用的调试方法是在 AWS 控制台中订阅 $aws/things/xxx/shadow/update 并查看实际发送的内容。
将“所需”设置为 null(如下所示的 JSON)确实可以清除对设备影子的所需更改。
我很快用mosquitto_pub
进行了测试,它似乎没有问题。
ENDPOINT="<your-id>-ats.iot.<region>.amazonaws.com"
THING_NAME=ta
mosquitto_pub --cafile AmazonRootCA1.pem \
--cert device.pem.crt \
--key private.pem.key \
-h $ENDPOINT \
-p 8883 \
-t '$aws/things/ta/shadow/name/sb/update' \
-i pub_$THING_NAME \
-f ./desired_is_null.json \
-d
desired_is_null.json
如下:
{
"state": {
"desired": null
}
}
如果问题出在客户端,您可以尝试缩小范围吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.