如何在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对象。
规则动作配置
- 在规则中添加Update Shadow动作,指定你的主Thing名称。
- 在「Shadow update mode」中选择Merge,这样新的payload会合并到主Shadow的
reported状态中,不会覆盖已有其他设备的数据。
验证
当device101上报温度25时,生成的payload为{"device101": {"temperature": 25}},合并后主Shadow的reported状态会新增/更新该键;后续device202上报时,同理添加或更新对应键值。
内容的提问来源于stack exchange,提问作者mvp
相关产品推荐
相关产品推荐

