如何在同一MQTT主题下对AWS IoT消息进行字段增强
最简实现方案
无需部署额外的Lambda、ECS等计算服务,仅靠AWS IoT Core原生规则即可实现需求,有两种可选方案:
方案1:无冗余字段的主题拆分方案(推荐)
仅需调整设备发布的主题前缀,订阅侧无需任何修改:
- 设备端不再直接发布消息到
topic/messages,改为发布到增加了内部前缀的主题,例如ingest/topic/messages - 配置IoT Core规则,SQL语句如下:
SELECT *, timestamp() as serverTimestamp FROM 'ingest/topic/#'
- 规则动作选择「重发布到MQTT主题」,目标主题填写
${topic(2)}:topic()函数会提取匹配到的主题路径的分段,topic(2)代表取第2位及之后的所有分段,刚好对应原业务主题topic/messages - 所有业务订阅方仍然订阅原
topic/messages,收到的就是添加了时间戳的增强消息,消息体无任何冗余字段,也不会触发规则循环
方案2:零设备改造成本的过滤方案
如果已经大规模部署设备,无法修改设备发布的主题,可以通过消息标记过滤避免递归:
- 配置IoT Core规则,SQL语句如下:
SELECT *, timestamp() as serverTimestamp FROM 'topic/#' WHERE NOT get(*, 'enhanced') IS TRUE
- 规则动作选择「重发布到MQTT主题」,目标主题填写
${topic()}即原发布主题,同时勾选「添加配置」,给重发布的消息增加用户属性:键为enhanced,值为true - 逻辑说明:设备发布的原始消息没有
enhanced标记,会触发规则执行完成字段增强;重发布的消息携带enhanced=true标记,无法匹配规则的WHERE条件,不会触发二次执行,完全避免递归循环 - 该方案的优势是设备侧、订阅侧都无需做任何修改,仅调整IoT规则即可上线
内容的提问来源于stack exchange,提问作者Colorao
相关产品推荐
相关产品推荐

