|
|
@@ -1,98 +1,105 @@
|
|
1
|
|
-# 数据汇聚引擎 (wm-data-engine)
|
|
2
|
|
-
|
|
3
|
|
-## 模块概述
|
|
4
|
|
-
|
|
5
|
|
-数据汇聚引擎是智慧水务管理系统的核心数据处理模块,负责实时采集、验证、存储和推送来自多个来源的数据。
|
|
6
|
|
-
|
|
7
|
|
-## 核心功能
|
|
8
|
|
-
|
|
9
|
|
-### 🔄 实时流数据采集
|
|
10
|
|
-
|
|
11
|
|
-#### MQTT 支持
|
|
12
|
|
-- **协议**: MQTT 3.1/3.1.1
|
|
13
|
|
-- **客户端**: Eclipse Paho
|
|
14
|
|
-- **主题监听**:
|
|
15
|
|
- - `iot/telemetry/+` - 设备遥测数据
|
|
16
|
|
- - `iot/command/+` - 设备控制命令
|
|
17
|
|
- - `quality/data/+` - 水质检测数据
|
|
18
|
|
-- **数据格式**: JSON
|
|
19
|
|
-
|
|
20
|
|
-#### Kafka 消费者
|
|
21
|
|
-- **IoT原始数据**: `iot.raw.generic` - 处理设备遥测数据
|
|
22
|
|
-- **水质数据**: `data.quality` - 处理水质检测数据
|
|
23
|
|
-- **手动录入**: `data.manual` - 处理人工录入数据
|
|
24
|
|
-- **API接口**: `data.api` - 处理接口调用数据
|
|
25
|
|
-
|
|
26
|
|
-### 📊 数据验证
|
|
27
|
|
-
|
|
28
|
|
-#### 验证规则
|
|
29
|
|
-- **设备编号**: 6-20位字母数字
|
|
30
|
|
-- **数值范围**: 根据指标类型设定合理范围
|
|
31
|
|
-- **数据完整性**: 必需字段检查
|
|
32
|
|
-- **质量评分**: 数据质量量化评估
|
|
33
|
|
-
|
|
34
|
|
-#### 支持的指标类型
|
|
35
|
|
-- **水表指标**: 流量、压力、温度、水位、累计用水量
|
|
36
|
|
-- **水质指标**: 浊度、pH值、余氯、总氯、总硬度
|
|
37
|
|
-- **管道指标**: 管道压力、流量、温度、泄漏状态
|
|
38
|
|
-- **阀门指标**: 开度、状态、压差
|
|
39
|
|
-- **水泵指标**: 状态、流量、电流、功率、温度
|
|
40
|
|
-- **环境指标**: 温度、湿度、气压
|
|
41
|
|
-
|
|
42
|
|
-### 💾 数据存储
|
|
43
|
|
-
|
|
44
|
|
-#### TDengine 时序数据库
|
|
45
|
|
-- **存储设备遥测数据**
|
|
46
|
|
-- **超级表设计**: water_iot.iot_telemetry
|
|
47
|
|
-- **高压缩率**: 适用于大量时间序列数据
|
|
48
|
|
-- **快速查询**: 支持降采样和聚合分析
|
|
49
|
|
-
|
|
50
|
|
-#### PostgreSQL 关系数据库
|
|
51
|
|
-- **存储水质检测记录**
|
|
52
|
|
-- **存储配置和元数据**
|
|
53
|
|
-- **支持复杂查询和事务处理
|
|
54
|
|
-
|
|
55
|
|
-### 📈 数据统计
|
|
56
|
|
-
|
|
57
|
|
-#### 统计功能
|
|
58
|
|
-- **采集任务统计**: 成功率、失败率、处理时间
|
|
59
|
|
-- **数据质量统计**: 合格率、异常分布
|
|
60
|
|
-- **设备状态统计**: 在线率、故障率
|
|
61
|
|
-- **实时监控**: WebSocket 推送
|
|
62
|
|
-
|
|
63
|
|
-### 🔌 接口说明
|
|
64
|
|
-
|
|
65
|
|
-#### REST API
|
|
66
|
|
-- `GET /api/data/collect/tasks` - 查询采集任务列表
|
|
67
|
|
-- `POST /api/data/collect/tasks` - 创建采集任务
|
|
68
|
|
-- `GET /api/data/collect/records` - 查询采集记录
|
|
69
|
|
-- `POST /api/data/collect/batch` - 批量数据采集
|
|
|
1
|
+# 数据引擎模块 (wm-data-engine)
|
|
70
|
2
|
|
|
71
|
|
-#### WebSocket
|
|
72
|
|
-- `/topic/data/realtime/{sourceType}` - 实时数据推送
|
|
|
3
|
+## 概述
|
|
73
|
4
|
|
|
74
|
|
-## 配置说明
|
|
|
5
|
+数据引擎是供水管理系统的核心模块,负责实时数据采集、处理、存储和监控。
|
|
75
|
6
|
|
|
76
|
|
-### MQTT 配置
|
|
77
|
|
-```yaml
|
|
78
|
|
-mqtt:
|
|
79
|
|
- broker-url: tcp://127.0.0.1:1883
|
|
80
|
|
- client-id: water-data-engine
|
|
81
|
|
- username: water
|
|
82
|
|
- password: water123
|
|
83
|
|
- timeout: 30
|
|
84
|
|
- keep-alive: 60
|
|
85
|
|
- topic:
|
|
86
|
|
- iot-telemetry: iot/telemetry/+
|
|
87
|
|
- iot-command: iot/command/+
|
|
88
|
|
- quality-data: quality/data/+
|
|
|
7
|
+## 主要功能
|
|
|
8
|
+
|
|
|
9
|
+### 1. 实时数据采集
|
|
|
10
|
+- **Kafka 消费者**: 消费 IoT 设备遥测数据,支持多 topic 分发
|
|
|
11
|
+- **MQTT 客户端**: 支持物联网设备遥测数据和控制命令的双向通信
|
|
|
12
|
+- **WebSocket 推送**: 实时推送数据到前端界面
|
|
|
13
|
+
|
|
|
14
|
+### 2. 数据处理
|
|
|
15
|
+- **数据验证**: 完整的数据质量检查机制,包括设备编号、数值范围验证
|
|
|
16
|
+- **数据路由**: 根据数据源类型自动路由到不同的处理通道
|
|
|
17
|
+- **数据转换**: 支持多种数据格式的转换和标准化
|
|
|
18
|
+
|
|
|
19
|
+### 3. 数据存储
|
|
|
20
|
+- **TDengine 时序数据库**: 存储物联网遥测数据
|
|
|
21
|
+- **PostgreSQL 关系数据库**: 存储配置信息和统计数据
|
|
|
22
|
+- **MinIO 对象存储**: 存储文件和报表数据
|
|
|
23
|
+
|
|
|
24
|
+### 4. 监控和统计
|
|
|
25
|
+- **数据统计**: 采集量、成功率、错误率等统计分析
|
|
|
26
|
+- **设备监控**: 设备数据状态、趋势分析
|
|
|
27
|
+- **错误监控**: 错误分布、常见错误类型统计
|
|
|
28
|
+
|
|
|
29
|
+## 技术架构
|
|
|
30
|
+
|
|
|
31
|
+```
|
|
|
32
|
+┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
|
|
33
|
+│ IoT 设备 │ │ Kafka Topic │ │ MQTT Broker │
|
|
|
34
|
+│ (流量计/压力计) │───▶│ iot.raw.generic │ │ tcp://1883 │
|
|
|
35
|
+│ (水质传感器) │ │ data.quality │ │ │
|
|
|
36
|
+└─────────────────┘ └─────────────────┘ └─────────────────┘
|
|
|
37
|
+ │ │ │
|
|
|
38
|
+ ▼ ▼ ▼
|
|
|
39
|
+┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
|
|
40
|
+│ DataCollectService │ │ MqttService │ │ DataValidationUtils │
|
|
|
41
|
+└─────────────────┘ └─────────────────┘ └─────────────────┘
|
|
|
42
|
+ │
|
|
|
43
|
+ ▼
|
|
|
44
|
+┌─────────────────────────────────────────────────────────────┐
|
|
|
45
|
+│ Data Engine Core │
|
|
|
46
|
+│ 数据采集与处理 │
|
|
|
47
|
+└─────────────────────────────────────────────────────────────┘
|
|
|
48
|
+ │
|
|
|
49
|
+ ▼
|
|
|
50
|
+┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
|
|
51
|
+│ TDengine │ │ PostgreSQL │ │ MinIO │
|
|
|
52
|
+│ (时序数据) │ │ (配置信息) │ │ (文件存储) │
|
|
|
53
|
+└─────────────────┘ └─────────────────┘ └─────────────────┘
|
|
89
|
54
|
```
|
|
90
|
55
|
|
|
|
56
|
+## 核心组件
|
|
|
57
|
+
|
|
|
58
|
+### DataCollectService
|
|
|
59
|
+- **功能**: 数据采集服务,支持实时流和批量采集
|
|
|
60
|
+- **主要方法**:
|
|
|
61
|
+ - `ingestRealtime()`: 实时数据接入
|
|
|
62
|
+ - `consumeIotRaw()`: Kafka 消费 IoT 原始数据
|
|
|
63
|
+ - `consumeQualityData()`: Kafka 消费水质数据
|
|
|
64
|
+ - `batchIngest()`: 批量数据采集
|
|
|
65
|
+ - `validateData()`: 数据验证
|
|
|
66
|
+
|
|
|
67
|
+### MqttService
|
|
|
68
|
+- **功能**: MQTT 消息服务,支持双向通信
|
|
|
69
|
+- **主要方法**:
|
|
|
70
|
+ - `handleIotTelemetry()`: 处理 IoT 遥测数据
|
|
|
71
|
+ - `handleIotCommand()`: 处理控制命令
|
|
|
72
|
+ - `handleQualityData()`: 处理水质数据
|
|
|
73
|
+
|
|
|
74
|
+### MqttPublishService
|
|
|
75
|
+- **功能**: MQTT 消息发布服务
|
|
|
76
|
+- **主要方法**:
|
|
|
77
|
+ - `sendDeviceCommand()`: 发送设备控制命令
|
|
|
78
|
+ - `sendDeviceConfig()`: 发送设备配置更新
|
|
|
79
|
+ - `batchSendConfig()`: 批量发送配置
|
|
|
80
|
+
|
|
|
81
|
+### DataStatisticsService
|
|
|
82
|
+- **功能**: 数据统计分析服务
|
|
|
83
|
+- **主要方法**:
|
|
|
84
|
+ - `getDataStatistics()`: 获取数据采集统计
|
|
|
85
|
+ - `getDeviceStatistics()`: 获取设备数据统计
|
|
|
86
|
+ - `getErrorStatistics()`: 获取错误统计
|
|
|
87
|
+
|
|
|
88
|
+### DataValidationUtils
|
|
|
89
|
+- **功能**: 数据验证工具类
|
|
|
90
|
+- **验证规则**:
|
|
|
91
|
+ - 设备编号格式验证
|
|
|
92
|
+ - 数值范围验证
|
|
|
93
|
+ - 数据完整性检查
|
|
|
94
|
+ - 水质数据专项验证
|
|
|
95
|
+
|
|
|
96
|
+## 配置说明
|
|
|
97
|
+
|
|
91
|
98
|
### Kafka 配置
|
|
92
|
99
|
```yaml
|
|
93
|
100
|
spring:
|
|
94
|
101
|
kafka:
|
|
95
|
|
- bootstrap-servers: 127.0.0.1:9092
|
|
|
102
|
+ bootstrap-servers: ${KAFKA_SERVERS:127.0.0.1}:9092
|
|
96
|
103
|
consumer:
|
|
97
|
104
|
group-id: wm-data-engine
|
|
98
|
105
|
auto-offset-reset: latest
|
|
|
@@ -101,37 +108,52 @@ spring:
|
|
101
|
108
|
value-serializer: org.apache.kafka.common.serialization.StringSerializer
|
|
102
|
109
|
```
|
|
103
|
110
|
|
|
|
111
|
+### MQTT 配置
|
|
|
112
|
+```yaml
|
|
|
113
|
+mqtt:
|
|
|
114
|
+ broker-url: ${MQTT_BROKER_URL:tcp://127.0.0.1:1883}
|
|
|
115
|
+ client-id: ${MQTT_CLIENT_ID:water-data-engine}
|
|
|
116
|
+ username: ${MQTT_USERNAME:water}
|
|
|
117
|
+ password: ${MQTT_PASSWORD:water123}
|
|
|
118
|
+ topic:
|
|
|
119
|
+ iot-telemetry: iot/telemetry/+
|
|
|
120
|
+ iot-command: iot/command/+
|
|
|
121
|
+ quality-data: quality/data/+
|
|
|
122
|
+```
|
|
|
123
|
+
|
|
104
|
124
|
### TDengine 配置
|
|
105
|
125
|
```yaml
|
|
106
|
126
|
tda:
|
|
107
|
|
- host: 127.0.0.1
|
|
108
|
|
- port: 6030
|
|
109
|
|
- username: root
|
|
110
|
|
- password: taosdata
|
|
111
|
|
- database: water_iot
|
|
|
127
|
+ host: ${TDENGINE_HOST:127.0.0.1}
|
|
|
128
|
+ port: ${TDENGINE_PORT:6030}
|
|
|
129
|
+ username: ${TDENGINE_USER:root}
|
|
|
130
|
+ password: ${TDENGINE_PASS:taosdata}
|
|
|
131
|
+ database: ${TDENGINE_DB:water_iot}
|
|
112
|
132
|
```
|
|
113
|
133
|
|
|
114
|
134
|
## 数据格式
|
|
115
|
135
|
|
|
116
|
|
-### IoT 遥测数据
|
|
|
136
|
+### IoT 遥测数据格式
|
|
117
|
137
|
```json
|
|
118
|
138
|
{
|
|
119
|
139
|
"deviceSn": "FM001",
|
|
120
|
|
- "timestamp": 1718352000000,
|
|
|
140
|
+ "timestamp": 1625097600000,
|
|
121
|
141
|
"metrics": [
|
|
122
|
142
|
{
|
|
123
|
143
|
"key": "LL",
|
|
124
|
|
- "value": 12.5
|
|
|
144
|
+ "value": 12.5,
|
|
|
145
|
+ "unit": "立方米/小时"
|
|
125
|
146
|
},
|
|
126
|
147
|
{
|
|
127
|
148
|
"key": "YL",
|
|
128
|
|
- "value": 0.35
|
|
|
149
|
+ "value": 0.35,
|
|
|
150
|
+ "unit": "MPa"
|
|
129
|
151
|
}
|
|
130
|
152
|
]
|
|
131
|
153
|
}
|
|
132
|
154
|
```
|
|
133
|
155
|
|
|
134
|
|
-### 水质数据
|
|
|
156
|
+### 水质数据格式
|
|
135
|
157
|
```json
|
|
136
|
158
|
{
|
|
137
|
159
|
"testType": "常规检测",
|
|
|
@@ -145,68 +167,104 @@ tda:
|
|
145
|
167
|
}
|
|
146
|
168
|
```
|
|
147
|
169
|
|
|
148
|
|
-## 监控和日志
|
|
|
170
|
+## API 接口
|
|
149
|
171
|
|
|
150
|
|
-### 日志级别
|
|
151
|
|
-- **DEBUG**: 详细的数据处理日志
|
|
152
|
|
-- **INFO**: 关键操作和状态变更
|
|
153
|
|
-- **WARN**: 异常但可恢复的情况
|
|
154
|
|
-- **ERROR**: 严重错误
|
|
|
172
|
+### 数据采集管理
|
|
|
173
|
+- `POST /api/data/collect/realtime` - 实时数据接入
|
|
|
174
|
+- `POST /api/data/collect/batch` - 批量数据采集
|
|
|
175
|
+- `GET /api/data/tasks` - 查询采集任务列表
|
|
|
176
|
+- `GET /api/data/records` - 查询采集记录
|
|
155
|
177
|
|
|
156
|
|
-### 监控指标
|
|
157
|
|
-- **采集成功率**: 成功处理的数据量 / 总数据量
|
|
158
|
|
-- **数据处理延迟**: 从接收到存储的时间差
|
|
159
|
|
-- **系统负载**: CPU、内存使用率
|
|
160
|
|
-- **连接状态**: MQTT、Kafka、数据库连接数
|
|
|
178
|
+### 统计分析
|
|
|
179
|
+- `GET /api/data/statistics` - 数据统计
|
|
|
180
|
+- `GET /api/data/devices/{deviceSn}/statistics` - 设备统计
|
|
|
181
|
+- `GET /api/data/errors/statistics` - 错误统计
|
|
161
|
182
|
|
|
162
|
|
-## 开发指南
|
|
|
183
|
+### MQTT 控制接口
|
|
|
184
|
+- `POST /api/mqtt/control` - 发送设备控制命令
|
|
|
185
|
+- `POST /api/mqtt/config` - 更新设备配置
|
|
|
186
|
+
|
|
|
187
|
+## WebSocket 主题
|
|
163
|
188
|
|
|
164
|
|
-### 添加新的数据源
|
|
165
|
|
-1. 在 `DataCollectService` 中添加新的处理方法
|
|
166
|
|
-2. 在 `DataValidationUtils` 中添加验证规则
|
|
167
|
|
-3. 更新 `MetricType` 枚举(如需要)
|
|
168
|
|
-4. 添加对应的单元测试
|
|
|
189
|
+### 实时数据推送
|
|
|
190
|
+- `/topic/data/realtime` - 全量实时数据
|
|
|
191
|
+- `/topic/data/realtime/iot` - IoT 设备数据
|
|
|
192
|
+- `/topic/data/realtime/quality` - 水质数据
|
|
169
|
193
|
|
|
170
|
|
-### 添加新的数据类型
|
|
171
|
|
-1. 定义新的消息格式
|
|
172
|
|
-2. 更新 Kafka 消费者
|
|
173
|
|
-3. 添加数据验证逻辑
|
|
174
|
|
-4. 实现存储逻辑
|
|
|
194
|
+### 控制指令
|
|
|
195
|
+- `/topic/data/control` - 控制状态反馈
|
|
|
196
|
+
|
|
|
197
|
+### 告警信息
|
|
|
198
|
+- `/topic/data/alert` - 数据告警推送
|
|
|
199
|
+
|
|
|
200
|
+### 统计数据
|
|
|
201
|
+- `/topic/data/statistics` - 统计数据推送
|
|
175
|
202
|
|
|
176
|
203
|
## 测试
|
|
177
|
204
|
|
|
178
|
|
-### 运行单元测试
|
|
179
|
|
-```bash
|
|
180
|
|
-mvn test
|
|
181
|
|
-```
|
|
|
205
|
+### 单元测试
|
|
|
206
|
+- `DataCollectServiceTest` - 数据采集服务测试
|
|
|
207
|
+- `KafkaConsumerTest` - Kafka 消费者测试
|
|
|
208
|
+- `DataValidationUtilsTest` - 数据验证测试
|
|
|
209
|
+
|
|
|
210
|
+### 集成测试
|
|
|
211
|
+- 实际 Kafka 服务器测试
|
|
|
212
|
+- 实际 MQTT Broker 测试
|
|
|
213
|
+- 数据库集成测试
|
|
182
|
214
|
|
|
183
|
|
-### 运行集成测试
|
|
|
215
|
+## 部署和使用
|
|
|
216
|
+
|
|
|
217
|
+### 环境要求
|
|
|
218
|
+- Java 17+
|
|
|
219
|
+- Spring Boot 3.3.5
|
|
|
220
|
+- PostgreSQL 14+
|
|
|
221
|
+- TDengine 3.0+
|
|
|
222
|
+- Kafka 3.x+
|
|
|
223
|
+- MQTT Broker (Eclipse Paho)
|
|
|
224
|
+
|
|
|
225
|
+### 启动服务
|
|
184
|
226
|
```bash
|
|
185
|
|
-mvn verify
|
|
|
227
|
+mvn spring-boot:run
|
|
186
|
228
|
```
|
|
187
|
229
|
|
|
188
|
|
-## 故障排查
|
|
|
230
|
+### 监控指标
|
|
|
231
|
+- 数据采集成功率
|
|
|
232
|
+- 数据处理延迟
|
|
|
233
|
+- 内存使用情况
|
|
|
234
|
+- 线程池状态
|
|
|
235
|
+
|
|
|
236
|
+## 问题排查
|
|
189
|
237
|
|
|
190
|
238
|
### 常见问题
|
|
191
|
|
-1. **MQTT 连接失败**: 检查 Broker 地址和认证信息
|
|
192
|
|
-2. **Kafka 消费延迟**: 检查消费者组和 Topic 配置
|
|
193
|
|
-3. **TDengine 写入失败**: 检查数据库连接和超级表结构
|
|
194
|
|
-4. **数据验证失败**: 检查数据格式和范围规则
|
|
|
239
|
+1. **Kafka 连接失败**: 检查 Kafka 服务器地址和端口
|
|
|
240
|
+2. **MQTT 连接失败**: 检查 Broker URL、用户名和密码
|
|
|
241
|
+3. **TDengine 写入失败**: 检查数据库连接和表结构
|
|
|
242
|
+4. **数据验证失败**: 检查数据格式和数值范围
|
|
195
|
243
|
|
|
196
|
|
-### 调试模式
|
|
197
|
|
-设置日志级别为 DEBUG:
|
|
|
244
|
+### 日志配置
|
|
198
|
245
|
```yaml
|
|
199
|
246
|
logging:
|
|
200
|
247
|
level:
|
|
201
|
248
|
com.water.data_engine: DEBUG
|
|
|
249
|
+ org.springframework.kafka: INFO
|
|
|
250
|
+ org.eclipse.paho.client.mqttv3: WARN
|
|
202
|
251
|
```
|
|
203
|
252
|
|
|
204
|
|
-## 版本历史
|
|
|
253
|
+## 开发指南
|
|
205
|
254
|
|
|
206
|
|
-### v1.0.0 (2026-06-15)
|
|
207
|
|
-- 实现 Issue #41: 实时流数据采集(MQTT/Kafka Consumer)
|
|
208
|
|
-- 支持 MQTT 客户端和数据接收
|
|
209
|
|
-- 实现 Kafka 消费者功能
|
|
210
|
|
-- 添加数据验证和质量检查
|
|
211
|
|
-- 集成 TDengine 时序数据库
|
|
212
|
|
-- 完善测试覆盖
|
|
|
255
|
+### 添加新的数据源类型
|
|
|
256
|
+1. 在 `MetricType` 枚举中添加新的指标类型
|
|
|
257
|
+2. 在 `DataValidationUtils` 中添加对应的验证规则
|
|
|
258
|
+3. 在 `DataCollectService` 中添加对应的处理逻辑
|
|
|
259
|
+4. 更新配置文件中的 topic 路由规则
|
|
|
260
|
+
|
|
|
261
|
+### 扩展数据验证规则
|
|
|
262
|
+1. 在 `DataValidationUtils` 中添加新的验证方法
|
|
|
263
|
+2. 在 `validateData()` 方法中调用新的验证逻辑
|
|
|
264
|
+3. 编写对应的单元测试
|
|
|
265
|
+
|
|
|
266
|
+### 添加新的数据存储后端
|
|
|
267
|
+1. 实现新的存储接口
|
|
|
268
|
+2. 在 `DataCollectService` 中集成新的存储后端
|
|
|
269
|
+3. 添加配置选项
|
|
|
270
|
+4. 编写集成测试
|