数据流转
这篇解决什么
设备上行之后,怎么原样转到 HTTP / MQTT / 库表 / 消息队列,不要和场景联动混成一条规则。读完能对上 iot_data_rule、iot_data_sink 和订阅组 iot_data_rule_consumer。
规则管「听谁」;目的管「送到哪」。前端在 views/iot/rule/data/。历史菜单路径 iot/rule/databridge 只是兼容入口,实际还是数据流转页。
示意图:消息总线同一条设备主题,流转和场景各有自己的 consumer group。
从哪改
| 名称 | 说明 | 仓库路径 |
|---|---|---|
| 规则 API | /iot/data-rule | ruoyi-office/yudao-module-iot/yudao-module-iot-server/.../IotDataRuleController.java |
| 目的 API | /iot/data-sink | IotDataSinkController.java |
| 规则表 | 源配置 + 目的 id 列表 | @TableName("iot_data_rule") |
| 目的表 | 类型 + JSON 配置 | @TableName("iot_data_sink") |
| 消费 | topic 设备消息,group iot_data_rule_consumer | IotDataRuleMessageSubscriber |
| 前端 | 规则 / 目的两个页 | ruoyi-office-vben/apps/web-antd/src/views/iot/rule/data/ |
SourceConfig.method 取上行 method,常见 thing.property.post / thing.event.post。deviceId 填具体设备,或 0(IotDeviceDO.DEVICE_ID_ALL)表示该产品下全部设备。identifier 空表示该 method 下任意标识。
属性上报会拆 params 里每个属性 key 分别匹配。多条规则命中同一 sinkId 会去重,避免重复推。当前是匹配后转发,没有脚本改字段。
目的类型见 IotDataSinkTypeEnum:HTTP 1、TCP 2、WebSocket 3、MQTT 10、Database 20、Redis 21、RocketMQ 30、RabbitMQ 31、Kafka 32。每种有对应 Iot*DataRuleAction。
字段
| 名称 | 说明 | 仓库路径 |
|---|---|---|
sourceConfigs | method / productId / deviceId / identifier | IotDataRuleDO.SourceConfig |
sinkIds | 目的编号列表 | IotDataRuleDO |
type / config | 目的类型与连接参数 | IotDataSinkDO |
status | 启用才参与匹配 | CommonStatusEnum |
先建目的再挂规则
规则只存 sinkIds。目的没启用或配置错,规则开启也不会发出去。删目的前先查 getDataRuleListBySinkId。
和场景联动分开改
流转是「转发到外部」。告警、设属性、调服务走 场景联动。两边都订同一条设备消息,互不影响。
@RequestMapping("/iot/data-rule")
public class IotDataRuleController { }
@TableName(value = "iot_data_rule", autoResultMap = true)
public class IotDataRuleDO extends BaseDO { }配置与操作
走 规则引擎 → 数据桥梁(4051,历史 path data-bridge,页在 views/iot/rule/data/)。先建目的 /iot/data-sink(HTTP 1 / MQTT 10 / 库 20 / MQ 30–32 等),再在规则里挂 sinkIds。源 deviceId=0 表示该产品全部设备。status 启用才匹配。
和场景联动各订各的 consumer group。没有脚本改字段。删目的前先查规则引用。开启见 IoT 功能设计。

本系统截图:规则引擎 → 数据桥梁。先建目的再挂规则。
