繁体   English   中英

如何拒绝 AWS IoT Device Shadow 中的“所需”更改

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM