2026-06-15 03:39:35 +08:00
|
|
|
# 数据引擎模块 (wm-data-engine)
|
2026-06-15 01:39:53 +08:00
|
|
|
|
2026-06-15 03:39:35 +08:00
|
|
|
## 概述
|
2026-06-15 01:39:53 +08:00
|
|
|
|
2026-06-15 03:39:35 +08:00
|
|
|
数据引擎是供水管理系统的核心模块,负责实时数据采集、处理、存储和监控。
|
2026-06-15 01:39:53 +08:00
|
|
|
|
2026-06-15 03:39:35 +08:00
|
|
|
## 主要功能
|
2026-06-15 01:39:53 +08:00
|
|
|
|
2026-06-15 03:39:35 +08:00
|
|
|
### 1. 实时数据采集
|
|
|
|
|
- **Kafka 消费者**: 消费 IoT 设备遥测数据,支持多 topic 分发
|
|
|
|
|
- **MQTT 客户端**: 支持物联网设备遥测数据和控制命令的双向通信
|
|
|
|
|
- **WebSocket 推送**: 实时推送数据到前端界面
|
2026-06-15 01:39:53 +08:00
|
|
|
|
2026-06-15 03:39:35 +08:00
|
|
|
### 2. 数据处理
|
|
|
|
|
- **数据验证**: 完整的数据质量检查机制,包括设备编号、数值范围验证
|
|
|
|
|
- **数据路由**: 根据数据源类型自动路由到不同的处理通道
|
|
|
|
|
- **数据转换**: 支持多种数据格式的转换和标准化
|
2026-06-15 01:39:53 +08:00
|
|
|
|
2026-06-15 03:39:35 +08:00
|
|
|
### 3. 数据存储
|
|
|
|
|
- **TDengine 时序数据库**: 存储物联网遥测数据
|
|
|
|
|
- **PostgreSQL 关系数据库**: 存储配置信息和统计数据
|
|
|
|
|
- **MinIO 对象存储**: 存储文件和报表数据
|
2026-06-15 01:39:53 +08:00
|
|
|
|
2026-06-15 03:39:35 +08:00
|
|
|
### 4. 监控和统计
|
|
|
|
|
- **数据统计**: 采集量、成功率、错误率等统计分析
|
|
|
|
|
- **设备监控**: 设备数据状态、趋势分析
|
|
|
|
|
- **错误监控**: 错误分布、常见错误类型统计
|
2026-06-15 01:39:53 +08:00
|
|
|
|
2026-06-15 03:39:35 +08:00
|
|
|
## 技术架构
|
2026-06-15 01:39:53 +08:00
|
|
|
|
2026-06-15 03:39:35 +08:00
|
|
|
```
|
|
|
|
|
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
|
|
|
|
│ IoT 设备 │ │ Kafka Topic │ │ MQTT Broker │
|
|
|
|
|
│ (流量计/压力计) │───▶│ iot.raw.generic │ │ tcp://1883 │
|
|
|
|
|
│ (水质传感器) │ │ data.quality │ │ │
|
|
|
|
|
└─────────────────┘ └─────────────────┘ └─────────────────┘
|
|
|
|
|
│ │ │
|
|
|
|
|
▼ ▼ ▼
|
|
|
|
|
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
|
|
|
|
│ DataCollectService │ │ MqttService │ │ DataValidationUtils │
|
|
|
|
|
└─────────────────┘ └─────────────────┘ └─────────────────┘
|
|
|
|
|
│
|
|
|
|
|
▼
|
|
|
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
|
|
|
│ Data Engine Core │
|
|
|
|
|
│ 数据采集与处理 │
|
|
|
|
|
└─────────────────────────────────────────────────────────────┘
|
|
|
|
|
│
|
|
|
|
|
▼
|
|
|
|
|
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
|
|
|
|
│ TDengine │ │ PostgreSQL │ │ MinIO │
|
|
|
|
|
│ (时序数据) │ │ (配置信息) │ │ (文件存储) │
|
|
|
|
|
└─────────────────┘ └─────────────────┘ └─────────────────┘
|
|
|
|
|
```
|
2026-06-15 01:39:53 +08:00
|
|
|
|
2026-06-15 03:39:35 +08:00
|
|
|
## 核心组件
|
2026-06-15 01:39:53 +08:00
|
|
|
|
2026-06-15 03:39:35 +08:00
|
|
|
### DataCollectService
|
|
|
|
|
- **功能**: 数据采集服务,支持实时流和批量采集
|
|
|
|
|
- **主要方法**:
|
|
|
|
|
- `ingestRealtime()`: 实时数据接入
|
|
|
|
|
- `consumeIotRaw()`: Kafka 消费 IoT 原始数据
|
|
|
|
|
- `consumeQualityData()`: Kafka 消费水质数据
|
|
|
|
|
- `batchIngest()`: 批量数据采集
|
|
|
|
|
- `validateData()`: 数据验证
|
2026-06-15 01:39:53 +08:00
|
|
|
|
2026-06-15 03:39:35 +08:00
|
|
|
### MqttService
|
|
|
|
|
- **功能**: MQTT 消息服务,支持双向通信
|
|
|
|
|
- **主要方法**:
|
|
|
|
|
- `handleIotTelemetry()`: 处理 IoT 遥测数据
|
|
|
|
|
- `handleIotCommand()`: 处理控制命令
|
|
|
|
|
- `handleQualityData()`: 处理水质数据
|
2026-06-15 01:39:53 +08:00
|
|
|
|
2026-06-15 03:39:35 +08:00
|
|
|
### MqttPublishService
|
|
|
|
|
- **功能**: MQTT 消息发布服务
|
|
|
|
|
- **主要方法**:
|
|
|
|
|
- `sendDeviceCommand()`: 发送设备控制命令
|
|
|
|
|
- `sendDeviceConfig()`: 发送设备配置更新
|
|
|
|
|
- `batchSendConfig()`: 批量发送配置
|
2026-06-15 01:39:53 +08:00
|
|
|
|
2026-06-15 03:39:35 +08:00
|
|
|
### DataStatisticsService
|
|
|
|
|
- **功能**: 数据统计分析服务
|
|
|
|
|
- **主要方法**:
|
|
|
|
|
- `getDataStatistics()`: 获取数据采集统计
|
|
|
|
|
- `getDeviceStatistics()`: 获取设备数据统计
|
|
|
|
|
- `getErrorStatistics()`: 获取错误统计
|
2026-06-15 01:39:53 +08:00
|
|
|
|
2026-06-15 03:39:35 +08:00
|
|
|
### DataValidationUtils
|
|
|
|
|
- **功能**: 数据验证工具类
|
|
|
|
|
- **验证规则**:
|
|
|
|
|
- 设备编号格式验证
|
|
|
|
|
- 数值范围验证
|
|
|
|
|
- 数据完整性检查
|
|
|
|
|
- 水质数据专项验证
|
2026-06-15 01:39:53 +08:00
|
|
|
|
|
|
|
|
## 配置说明
|
|
|
|
|
|
|
|
|
|
### Kafka 配置
|
|
|
|
|
```yaml
|
|
|
|
|
spring:
|
|
|
|
|
kafka:
|
2026-06-15 03:39:35 +08:00
|
|
|
bootstrap-servers: ${KAFKA_SERVERS:127.0.0.1}:9092
|
2026-06-15 01:39:53 +08:00
|
|
|
consumer:
|
|
|
|
|
group-id: wm-data-engine
|
|
|
|
|
auto-offset-reset: latest
|
|
|
|
|
producer:
|
|
|
|
|
key-serializer: org.apache.kafka.common.serialization.StringSerializer
|
|
|
|
|
value-serializer: org.apache.kafka.common.serialization.StringSerializer
|
|
|
|
|
```
|
|
|
|
|
|
2026-06-15 03:39:35 +08:00
|
|
|
### MQTT 配置
|
|
|
|
|
```yaml
|
|
|
|
|
mqtt:
|
|
|
|
|
broker-url: ${MQTT_BROKER_URL:tcp://127.0.0.1:1883}
|
|
|
|
|
client-id: ${MQTT_CLIENT_ID:water-data-engine}
|
|
|
|
|
username: ${MQTT_USERNAME:water}
|
|
|
|
|
password: ${MQTT_PASSWORD:water123}
|
|
|
|
|
topic:
|
|
|
|
|
iot-telemetry: iot/telemetry/+
|
|
|
|
|
iot-command: iot/command/+
|
|
|
|
|
quality-data: quality/data/+
|
|
|
|
|
```
|
|
|
|
|
|
2026-06-15 01:39:53 +08:00
|
|
|
### TDengine 配置
|
|
|
|
|
```yaml
|
|
|
|
|
tda:
|
2026-06-15 03:39:35 +08:00
|
|
|
host: ${TDENGINE_HOST:127.0.0.1}
|
|
|
|
|
port: ${TDENGINE_PORT:6030}
|
|
|
|
|
username: ${TDENGINE_USER:root}
|
|
|
|
|
password: ${TDENGINE_PASS:taosdata}
|
|
|
|
|
database: ${TDENGINE_DB:water_iot}
|
2026-06-15 01:39:53 +08:00
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 数据格式
|
|
|
|
|
|
2026-06-15 03:39:35 +08:00
|
|
|
### IoT 遥测数据格式
|
2026-06-15 01:39:53 +08:00
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"deviceSn": "FM001",
|
2026-06-15 03:39:35 +08:00
|
|
|
"timestamp": 1625097600000,
|
2026-06-15 01:39:53 +08:00
|
|
|
"metrics": [
|
|
|
|
|
{
|
|
|
|
|
"key": "LL",
|
2026-06-15 03:39:35 +08:00
|
|
|
"value": 12.5,
|
|
|
|
|
"unit": "立方米/小时"
|
2026-06-15 01:39:53 +08:00
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"key": "YL",
|
2026-06-15 03:39:35 +08:00
|
|
|
"value": 0.35,
|
|
|
|
|
"unit": "MPa"
|
2026-06-15 01:39:53 +08:00
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
2026-06-15 03:39:35 +08:00
|
|
|
### 水质数据格式
|
2026-06-15 01:39:53 +08:00
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"testType": "常规检测",
|
|
|
|
|
"testPoint": "水厂出口",
|
|
|
|
|
"pointType": "出厂水",
|
|
|
|
|
"area": "主城区",
|
|
|
|
|
"turbidity": 0.5,
|
|
|
|
|
"ph": 7.2,
|
|
|
|
|
"residualChlorine": 0.3,
|
|
|
|
|
"isQualified": true
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
2026-06-15 03:39:35 +08:00
|
|
|
## API 接口
|
2026-06-15 01:39:53 +08:00
|
|
|
|
2026-06-15 03:39:35 +08:00
|
|
|
### 数据采集管理
|
|
|
|
|
- `POST /api/data/collect/realtime` - 实时数据接入
|
|
|
|
|
- `POST /api/data/collect/batch` - 批量数据采集
|
|
|
|
|
- `GET /api/data/tasks` - 查询采集任务列表
|
|
|
|
|
- `GET /api/data/records` - 查询采集记录
|
2026-06-15 01:39:53 +08:00
|
|
|
|
2026-06-15 03:39:35 +08:00
|
|
|
### 统计分析
|
|
|
|
|
- `GET /api/data/statistics` - 数据统计
|
|
|
|
|
- `GET /api/data/devices/{deviceSn}/statistics` - 设备统计
|
|
|
|
|
- `GET /api/data/errors/statistics` - 错误统计
|
2026-06-15 01:39:53 +08:00
|
|
|
|
2026-06-15 03:39:35 +08:00
|
|
|
### MQTT 控制接口
|
|
|
|
|
- `POST /api/mqtt/control` - 发送设备控制命令
|
|
|
|
|
- `POST /api/mqtt/config` - 更新设备配置
|
2026-06-15 01:39:53 +08:00
|
|
|
|
2026-06-15 03:39:35 +08:00
|
|
|
## WebSocket 主题
|
2026-06-15 01:39:53 +08:00
|
|
|
|
2026-06-15 03:39:35 +08:00
|
|
|
### 实时数据推送
|
|
|
|
|
- `/topic/data/realtime` - 全量实时数据
|
|
|
|
|
- `/topic/data/realtime/iot` - IoT 设备数据
|
|
|
|
|
- `/topic/data/realtime/quality` - 水质数据
|
|
|
|
|
|
|
|
|
|
### 控制指令
|
|
|
|
|
- `/topic/data/control` - 控制状态反馈
|
|
|
|
|
|
|
|
|
|
### 告警信息
|
|
|
|
|
- `/topic/data/alert` - 数据告警推送
|
|
|
|
|
|
|
|
|
|
### 统计数据
|
|
|
|
|
- `/topic/data/statistics` - 统计数据推送
|
2026-06-15 01:39:53 +08:00
|
|
|
|
|
|
|
|
## 测试
|
|
|
|
|
|
2026-06-15 03:39:35 +08:00
|
|
|
### 单元测试
|
|
|
|
|
- `DataCollectServiceTest` - 数据采集服务测试
|
|
|
|
|
- `KafkaConsumerTest` - Kafka 消费者测试
|
|
|
|
|
- `DataValidationUtilsTest` - 数据验证测试
|
|
|
|
|
|
|
|
|
|
### 集成测试
|
|
|
|
|
- 实际 Kafka 服务器测试
|
|
|
|
|
- 实际 MQTT Broker 测试
|
|
|
|
|
- 数据库集成测试
|
|
|
|
|
|
|
|
|
|
## 部署和使用
|
|
|
|
|
|
|
|
|
|
### 环境要求
|
|
|
|
|
- Java 17+
|
|
|
|
|
- Spring Boot 3.3.5
|
|
|
|
|
- PostgreSQL 14+
|
|
|
|
|
- TDengine 3.0+
|
|
|
|
|
- Kafka 3.x+
|
|
|
|
|
- MQTT Broker (Eclipse Paho)
|
|
|
|
|
|
|
|
|
|
### 启动服务
|
2026-06-15 01:39:53 +08:00
|
|
|
```bash
|
2026-06-15 03:39:35 +08:00
|
|
|
mvn spring-boot:run
|
2026-06-15 01:39:53 +08:00
|
|
|
```
|
|
|
|
|
|
2026-06-15 03:39:35 +08:00
|
|
|
### 监控指标
|
|
|
|
|
- 数据采集成功率
|
|
|
|
|
- 数据处理延迟
|
|
|
|
|
- 内存使用情况
|
|
|
|
|
- 线程池状态
|
2026-06-15 01:39:53 +08:00
|
|
|
|
2026-06-15 03:39:35 +08:00
|
|
|
## 问题排查
|
2026-06-15 01:39:53 +08:00
|
|
|
|
|
|
|
|
### 常见问题
|
2026-06-15 03:39:35 +08:00
|
|
|
1. **Kafka 连接失败**: 检查 Kafka 服务器地址和端口
|
|
|
|
|
2. **MQTT 连接失败**: 检查 Broker URL、用户名和密码
|
|
|
|
|
3. **TDengine 写入失败**: 检查数据库连接和表结构
|
|
|
|
|
4. **数据验证失败**: 检查数据格式和数值范围
|
2026-06-15 01:39:53 +08:00
|
|
|
|
2026-06-15 03:39:35 +08:00
|
|
|
### 日志配置
|
2026-06-15 01:39:53 +08:00
|
|
|
```yaml
|
|
|
|
|
logging:
|
|
|
|
|
level:
|
|
|
|
|
com.water.data_engine: DEBUG
|
2026-06-15 03:39:35 +08:00
|
|
|
org.springframework.kafka: INFO
|
|
|
|
|
org.eclipse.paho.client.mqttv3: WARN
|
2026-06-15 01:39:53 +08:00
|
|
|
```
|
|
|
|
|
|
2026-06-15 03:39:35 +08:00
|
|
|
## 开发指南
|
2026-06-15 01:39:53 +08:00
|
|
|
|
2026-06-15 03:39:35 +08:00
|
|
|
### 添加新的数据源类型
|
|
|
|
|
1. 在 `MetricType` 枚举中添加新的指标类型
|
|
|
|
|
2. 在 `DataValidationUtils` 中添加对应的验证规则
|
|
|
|
|
3. 在 `DataCollectService` 中添加对应的处理逻辑
|
|
|
|
|
4. 更新配置文件中的 topic 路由规则
|
|
|
|
|
|
|
|
|
|
### 扩展数据验证规则
|
|
|
|
|
1. 在 `DataValidationUtils` 中添加新的验证方法
|
|
|
|
|
2. 在 `validateData()` 方法中调用新的验证逻辑
|
|
|
|
|
3. 编写对应的单元测试
|
|
|
|
|
|
|
|
|
|
### 添加新的数据存储后端
|
|
|
|
|
1. 实现新的存储接口
|
|
|
|
|
2. 在 `DataCollectService` 中集成新的存储后端
|
|
|
|
|
3. 添加配置选项
|
|
|
|
|
4. 编写集成测试
|