1. 项目概述:基于Ruoyi框架的能源物联网全栈解决方案
这套源码是我在工业物联网领域摸爬滚打五年后,基于Ruoyi框架打磨出的实战级解决方案。它完美融合了TDengine时序数据库的高效存储、MQTT协议的设备通信能力,以及Vue2前端的灵活可视化,专门针对智慧能源管理和智能工厂场景做了深度优化。不同于市面上那些demo级的开源项目,这套系统在生产环境扛住了日均千万级数据点的考验,特别适合需要快速落地物联网平台的中小企业。
2. 技术栈选型与架构设计
2.1 为什么选择Ruoyi作为基础框架
Ruoyi的"前后端分离+代码生成器"特性大幅降低了开发门槛。实测表明,用其代码生成器开发一个标准CRUD接口只需15分钟,比传统SpringBoot开发效率提升60%以上。但原生的Ruoyi在物联网场景有三个致命缺陷:
- 缺乏时序数据支持
- 设备接入能力薄弱
- 实时监控功能不足
我们的改进方案是:
- 后端:保留Ruoyi的权限和系统管理模块,重写数据持久层适配TDengine
- 前端:在Vue2基础上开发专属的能源看板组件
- 通信:集成Paho客户端实现MQTT全双工通信
2.2 核心架构示意图(伪代码表示)
// 后端架构 @SpringBootApplication public class EnergyPlatform { @Bean public MqttPahoClientFactory mqttFactory() { // EMQ X连接配置 } @Bean public TDengineTemplate tdTemplate() { // 时序数据库操作模板 } } // 前端架构 new Vue({ components: { EnergyDashboard, // 自定义能源看板 RealtimeChart // 基于ECharts的实时曲线 } })3. TDengine集成实战
3.1 安装部署避坑指南
TDengine的Windows版ODBC驱动安装有两大坑:
- 必须使用2.4.0.12以上版本的驱动
- 安装后需手动配置taos.cfg文件
正确的安装步骤:
# 下载驱动包 wget https://www.taosdata.com/assets/download/2.4/taos-odbc-2.4.0.12-Windows-x64.exe # 配置文件示例 # taos.cfg firstEp 集群首个节点IP:6030 secondEp 备用节点IP:6030 locale en_US.UTF-83.2 SpringBoot集成关键代码
@Repository public class EnergyDataDao { @Autowired private TDengineTemplate template; public void insertMetric(EnergyMetric metric) { String sql = "INSERT INTO power_data USING meters TAGS(?) VALUES(?,?,?)"; template.update(sql, metric.getDeviceId(), new Timestamp(metric.getTimestamp()), metric.getVoltage(), metric.getCurrent()); } }重要提示:TDengine的SQL语法与MySQL有显著差异,特别是时间戳处理必须使用Unix时间戳格式
4. MQTT通信模块深度优化
4.1 协议选型对比
我们在EMQX和RabbitMQ之间做过压测对比:
| 指标 | EMQX 3.2 | RabbitMQ 3.8 |
|---|---|---|
| 连接数支持 | 50万 | 5万 |
| 消息吞吐 | 50万/秒 | 10万/秒 |
| 内存占用 | 低 | 高 |
最终选择EMQX作为MQTT Broker,因其:
- 专为物联网优化
- 支持QoS级别灵活配置
- 提供完善的监控API
4.2 消息处理核心逻辑
@Service public class MqttHandler implements MqttCallback { @Override public void messageArrived(String topic, MqttMessage message) { // 设备状态消息示例:device/status/{deviceId} if(topic.matches("device/status/.+")) { handleStatusMessage(topic, message); } // 能耗数据消息示例:device/data/{metricType} else if(topic.matches("device/data/.+")) { handleDataMessage(topic, message); } } private void handleDataMessage(String topic, String payload) { // 数据格式校验 EnergyData data = JSON.parseObject(payload, EnergyData.class); // 写入TDengine energyDataDao.insert(data); // 触发实时推送 websocketService.broadcast(data); } }5. Vue2前端工程实践
5.1 能源看板开发技巧
在开发实时能耗曲线时,我们优化了ECharts的渲染性能:
- 使用dataset管理数据
- 开启animation: false关闭动画
- 采用增量渲染策略
// 看板组件核心代码 export default { data() { return { chart: null, dataCache: [] } }, methods: { appendData(newData) { this.dataCache.push(...newData); // 只保留最近1000条 if(this.dataCache.length > 1000) { this.dataCache = this.dataCache.slice(-1000); } this.chart.setOption({ dataset: { source: this.dataCache } }); } } }5.2 常见问题解决方案
问题1:Vue2项目在不同电脑上打包结果不一致
根因:node-sass版本兼容性问题
解决方案:
- 删除node_modules和package-lock.json
- 统一使用node 14.x版本
- 执行:
npm install --save-dev node-sass@4.14.1问题2:v-if和v-else之间有注释导致白屏
修复方案:使用template标签包裹
<template v-if="showChart"> <energy-chart /> </template> <template v-else> <data-table /> </template>6. 生产环境部署要点
6.1 服务器配置建议
根据我们的压力测试结果,推荐配置:
| 组件 | CPU | 内存 | 磁盘 |
|---|---|---|---|
| 应用服务器 | 8核 | 16G | SSD 100G |
| TDengine | 16核 | 32G | NVMe 1T |
| EMQX | 4核 | 8G | SSD 200G |
6.2 性能调优参数
TDengine关键参数:
ALTER DATABASE power SET BUFFER 256, CACHEMODEL 'last_row', COMP 2;EMQX关键参数:
# etc/emqx.conf zone.external.max_packet_size = 10MB listener.tcp.external.max_connections = 5000007. 扩展开发指南
7.1 如何添加新设备协议
以Modbus RTU设备为例的集成步骤:
- 在
device-protocols模块新建ModbusHandler - 实现协议解析逻辑
- 注册到协议工厂:
@Component public class ModbusHandler implements DeviceProtocol { @Override public String parse(byte[] data) { // 解析Modbus报文 } } // 注册协议 @Configuration public class ProtocolConfig { @Bean public DeviceProtocol modbusProtocol() { return new ModbusHandler(); } }7.2 安全加固建议
- MQTT通信必须启用TLS加密
- 设备认证采用双重验证:
- 客户端证书
- 动态token
- 前端接口添加图形验证码:
// 阿里云图形验证集成 import CAPTCHA from '@alicloud/captcha'; const captcha = new CAPTCHA({ scene: 'energy_login' });这套系统在实际部署中还有个意外收获:因为采用了标准化接口设计,我们仅用3天就接入了客户的ERP系统。关键是要在Ruoyi原有的REST规范上,为物联网场景增加实时数据流接口。现在系统已经稳定运行9个月,日均处理设备消息230万条,最忙时的API响应时间仍能控制在200ms以内。