You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在AWS IoT Rule SQL中以Thing名称作为JSON对象键重发布数据

解决AWS IoT规则中动态Thing ID作为JSON键的SqlParseException问题

问题根源

直接在AWS IoT规则SQL中使用topic(3)作为JSON键名是不被支持的,SQL语法不允许将函数结果直接作为动态键构造JSON,这会触发SqlParseException。

解决方案

根据你的需求(将每个设备的Thing ID作为键,提取数据合并到主Shadow),提供两种可行的SQL写法:

方法1:单条消息处理(合并到主Shadow)

适合每次收到单个设备的Shadow更新时,将该设备的数据合并到主Shadow中:

SELECT JSON_PARSE(
    CONCAT(
        '{"', 
        topic(3), 
        '": {"temperature": ', 
        current.state.reported.temperature, 
        '}}'
    )
) AS payload
FROM '$aws/things/+/shadow/update/documents'
WHERE current.state.reported.temperature IS NOT NULL
  • 原理:先通过CONCAT拼接出包含动态Thing ID的JSON字符串,再用JSON_PARSE转换为合法的JSON对象。
  • 注意:如果temperature是字符串类型,需要在拼接时添加引号,比如修改为'"', current.state.reported.temperature, '"'。

方法2:批量聚合(生成多设备JSON对象)

如果需要批量处理多条设备更新,一次性生成包含多个设备数据的JSON对象(需配合规则的Batch模式):

SELECT JSON_OBJECT_AGG(
    topic(3), 
    JSON_OBJECT('temperature', current.state.reported.temperature)
) AS payload
FROM '$aws/things/+/shadow/update/documents'
WHERE current.state.reported.temperature IS NOT NULL
  • 原理:JSON_OBJECT_AGG函数会将分组后的topic(3)作为键,对应的设备数据作为值,聚合为一个JSON对象。

规则动作配置

  1. 在规则中添加Update Shadow动作,指定你的主Thing名称。
  2. 在「Shadow update mode」中选择Merge,这样新的payload会合并到主Shadow的reported状态中,不会覆盖已有其他设备的数据。

验证

当device101上报温度25时,生成的payload为{"device101": {"temperature": 25}},合并后主Shadow的reported状态会新增/更新该键;后续device202上报时,同理添加或更新对应键值。

内容的提问来源于stack exchange,提问作者mvp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 04:50:26