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.2RabbitMQ 3.8连接数支持50万5万消息吞吐50万/秒10万/秒内存占用低高最终选择EMQX作为MQTT Broker因其专为物联网优化支持QoS级别灵活配置提供完善的监控API4.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 常见问题解决方案问题1Vue2项目在不同电脑上打包结果不一致根因node-sass版本兼容性问题解决方案删除node_modules和package-lock.json统一使用node 14.x版本执行npm install --save-dev node-sass4.14.1问题2v-if和v-else之间有注释导致白屏修复方案使用template标签包裹template v-ifshowChart energy-chart / /template template v-else data-table / /template6. 生产环境部署要点6.1 服务器配置建议根据我们的压力测试结果推荐配置组件CPU内存磁盘应用服务器8核16GSSD 100GTDengine16核32GNVMe 1TEMQX4核8GSSD 200G6.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以内。