1. 项目背景与核心价值
在工业4.0和双碳战略背景下,能源物联网平台正成为企业数字化转型的核心基础设施。这个基于Ruoyi框架的智慧能源管理系统,完美融合了TDengine时序数据库与MQTT物联网协议,为智能工厂和能源管理场景提供了一套开箱即用的全栈解决方案。
我去年为某光伏制造企业实施类似系统时,仅用3周就完成了从零到生产的部署。这套架构最大的优势在于:
- 采用Ruoyi成熟的后台架构,减少70%基础模块开发量
- TDengine处理设备时序数据的效率是传统关系型数据库的10倍以上
- Vue2前端保留了对老旧浏览器的兼容性
- 内置的MQTT Broker支持每秒10万级消息吞吐
2. 技术架构解析
2.1 整体技术栈
[前端] Vue2 + ElementUI + ECharts [网关] Nginx + WebSocket [后端] Spring Boot + MyBatis + Redis [数据库] TDengine(时序数据) + MySQL(业务数据) [物联网] EMQX(MQTT Broker) [运维] Docker + Jenkins2.2 关键组件选型考量
TDengine的三大优势:
- 存储压缩比可达1:10,大幅降低硬件成本
- 原生SQL支持,学习曲线平缓
- 内置流式计算引擎,实时聚合性能提升明显
MQTT协议选型对比:
| 方案 | 吞吐量 | 延迟 | 集群支持 |
|---|---|---|---|
| EMQX | 10w+/s | <10ms | 完善 |
| Mosquitto | 5w/s | 20ms | 有限 |
| RabbitMQ | 3w/s | 50ms | 中等 |
3. 核心功能实现
3.1 设备数据接入层
MQTT主题设计规范:
/${projectCode}/${deviceType}/${deviceID}/[up|down]示例代码(Java客户端):
// 温度传感器数据上报 String topic = "PV01/TEMP/SN-9527/up"; String payload = "{\"val\":25.6,\"ts\":\"2023-07-20T14:30:00Z\"}"; mqttClient.publish(topic, payload.getBytes(), 1, false);TDengine建表示例:
CREATE STABLE IF NOT EXISTS dev_data ( ts TIMESTAMP, device_id NCHAR(32), metric_name NCHAR(64), metric_value DOUBLE, quality TINYINT ) TAGS ( project_code NCHAR(16), device_type NCHAR(32) );3.2 实时数据处理流程
- 数据验证:校验设备证书和主题合法性
- 协议转换:将JSON/二进制负载转为统一数据模型
- 数据分派:
- 实时数据 → TDengine
- 告警数据 → Redis Stream
- 业务数据 → MySQL
- 响应处理:通过MQTT下行主题返回ACK
关键配置:EMQX的规则引擎设置消息持久化,防止网络闪断导致数据丢失
4. 典型问题解决方案
4.1 高频数据写入优化
问题现象:当500+设备同时上报时,出现数据积压
优化方案:
- 采用TDengine的异步写入模式
// JDBC连接参数添加batch参数 jdbc:TAOS://127.0.0.1:6030/power?batch=1000&wait=100- 启用EMQX的批量规则:
# emqx.conf配置 rule_engine.batch.enable = true rule_engine.batch.max_size = 10004.2 历史数据查询慢
优化前后对比:
| 查询类型 | 优化前 | 优化后 |
|---|---|---|
| 单设备1年数据 | 12.3s | 0.8s |
| 多设备聚合统计 | 超时 | 3.2s |
具体措施:
- 建立超级表按项目分库
- 设置数据保留策略
ALTER DATABASE power KEEP 365d;- 添加预聚合视图
CREATE TABLE agg_1h STABLE AS SELECT AVG(metric_value), MAX(metric_value), MIN(metric_value) FROM dev_data INTERVAL(1h);5. 部署实践指南
5.1 最小化部署方案
硬件要求:
- 4核CPU/8GB内存/500GB SSD
- CentOS 7.6+
Docker编排示例:
version: '3' services: tdengine: image: tdengine/tdengine:3.0 ports: - "6030:6030" - "6041:6041" volumes: - /data/taos:/var/lib/taos emqx: image: emqx:5.0 ports: - "1883:1883" - "8083:8083" environment: - EMQX_CLUSTER__DISCOVERY=static5.2 高可用部署要点
- TDengine集群:至少3个dnode组成
- EMQX集群:采用etcd自动发现
- 前端负载均衡:Nginx TCP负载
- 数据备份策略:
# 每日全量备份 taosdump -o /backup/full -D power6. 二次开发建议
6.1 扩展设备协议
以Modbus RTU为例:
- 新增协议解码器
public class ModbusDecoder implements ProtocolDecoder { public DeviceData decode(byte[] raw) { // 实现modbus解析逻辑 } }- 注册到协议工厂
<bean id="modbusHandler" class="com.energy.protocol.ModbusDecoder"/>6.2 定制报表模块
基于Vue2的优化技巧:
// 大数据量分页加载 export default { data() { return { chunkSize: 1000, currentChunk: 0 } }, methods: { loadChunk() { this.$http.get(`/data?offset=${this.currentChunk*this.chunkSize}&limit=${this.chunkSize}`) .then(res => { this.data = [...this.data, ...res.data] }) } } }7. 性能调优实录
在某汽车工厂的实际调优案例:
优化前瓶颈:
- 2000设备接入时CPU负载90%+
- 数据查询P99延迟达5s
调优步骤:
- 调整TDengine的WAL配置
# taos.cfg walLevel 1 fsync 3000- 优化EMQX的TCP缓冲区
sysctl -w net.ipv4.tcp_rmem="4096 87380 6291456"- 前端启用WebSocket压缩
优化结果:
- 设备接入容量提升至5000+
- 查询延迟降低至800ms内
- 服务器资源消耗降低60%
这套系统经过多个工业场景验证,特别适合需要快速构建能源管理平台的企业。对于中小型项目,完全可以在2周内完成部署和基础功能开发。