1. 项目背景与需求分析
电动自行车充电管理一直是城市社区和校园场景中的痛点问题。传统充电桩存在使用不便、管理混乱、安全隐患等诸多问题。作为一名长期关注物联网解决方案的开发者,我在去年参与某高校智慧校园建设时,深刻体会到一套可靠的充电管理系统的价值。
微信小程序作为轻量级应用平台,具有无需安装、即用即走的特性,特别适合这类高频次、短时长的使用场景。通过小程序控制充电桩,用户只需扫码即可完成充电、支付全流程,管理人员也能实时监控设备状态,大幅提升管理效率。
这个毕业设计项目的核心目标是构建一个完整的电动自行车充电管理解决方案,包含小程序前端、云服务后端和硬件通信模块。系统需要实现用户认证、充电控制、费用计算、状态监控等基础功能,同时要考虑校园场景下的特殊需求,如分时段计费、充电排队、故障报警等。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 技术选型与整体架构
经过多方案对比,我们采用微信小程序+Spring Boot+MySQL的技术栈。这种组合在开发效率、性能表现和可维护性之间取得了良好平衡:
-
前端:微信小程序原生框架,放弃uniapp等跨平台方案。虽然uniapp有跨端优势,但在蓝牙通信、硬件对接等底层功能上,原生开发更稳定可靠。实测发现部分三星手机的视频组件层级问题,原生方案更容易针对性解决。
-
后端:Spring Boot 2.7 + MyBatis Plus。这套组合提供了完善的RESTful API支持,配合Swagger文档,前后端协作效率极高。特别在毕业设计这种短周期项目中,自动化的CRUD接口生成能节省大量时间。
-
数据库:MySQL 8.0。考虑到充电记录需要长期保存且数据量会持续增长,我们设计了按月分表的存储策略。核心表包括:
sql复制CREATE TABLE `charging_order_202301` ( `id` BIGINT PRIMARY KEY AUTO_INCREMENT, `user_id` VARCHAR(32) NOT NULL COMMENT '微信openid', `device_id` VARCHAR(24) NOT NULL, `start_time` DATETIME NOT NULL, `end_time` DATETIME, `duration` INT COMMENT '分钟数', `amount` DECIMAL(10,2) COMMENT '金额', `status` TINYINT DEFAULT 0 COMMENT '0进行中 1已完成 2异常' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -
硬件通信:采用成熟的485总线协议。虽然新出的蓝牙5.0方案更时髦,但在校园多设备场景下,有线连接的485总线在稳定性和抗干扰能力上表现更好。电路设计上需要特别注意终端电阻的配置,这是很多毕业设计中容易忽略的细节。
2.2 关键业务流程设计
充电过程的核心状态机设计如下:
code复制[待机] -> [扫码认证] -> [设备自检] -> [开始充电] -> [充电中]
-> ([异常中断] -> [故障上报])
-> [正常结束] -> [计费结算]
每个状态转换都需要考虑超时处理。例如扫码后5分钟内未开始充电应自动释放设备;充电过程中每15秒需收到硬件心跳包,连续丢失3次则触发异常中断。这些边界条件的处理直接影响用户体验。
3. 小程序端核心实现
3.1 用户界面与交互设计
采用微信小程序原生组件开发,主要界面包括:
-
地图页:使用微信地图组件展示充电桩分布,通过自定义markers标注空闲/占用状态。实测发现部分安卓机型的地图层级问题,最终通过
cover-view覆盖方案解决。 -
充电控制页:包含实时功率、已充电量、费用预估等信息展示。关键实现点:
javascript复制// 电量计算采用防抖更新 let updateTimer = null; function updatePower(data) { clearTimeout(updateTimer); updateTimer = setTimeout(() => { this.setData({ currentPower: data.power, cost: calculateCost(data.power, data.time) }); }, 500); } -
支付流程:集成微信支付API,特别注意虚拟商品支付的合规要求。遇到"backgroundfetch privacy fail"错误时,需要检查服务端通知接口的幂等性处理。
3.2 硬件通信模块
通过WebSocket保持长连接,通信协议设计如下:
| 指令类型 | 方向 | 格式 | 说明 |
|---|---|---|---|
| 0x01 | 小程序→设备 | [0x01][2字节长度][JSON数据] |
启动充电 |
| 0x02 | 设备→小程序 | [0x02][2字节长度][JSON数据] |
状态上报 |
| 0x03 | 双向 | [0x03][2字节长度][空] |
心跳包 |
实测中发现部分校园网络会阻断长连接,因此增加了心跳保活机制,同时准备了HTTP轮询的降级方案。
4. 服务端关键技术实现
4.1 分布式事务处理
充电开始和结束涉及多个子系统协作:
- 设备状态更新
- 订单创建/结算
- 用户余额变更
采用本地消息表+定时任务补偿的方案保证一致性:
java复制@Transactional
public void startCharging(StartRequest request) {
// 1. 创建本地事务记录
TransactionLog log = createTransactionLog(request);
// 2. 更新设备状态
deviceService.updateStatus(request.getDeviceId(), DeviceStatus.USING);
// 3. 创建订单
orderService.createOrder(request);
// 4. 标记事务完成
log.setStatus(TransactionStatus.COMPLETE);
transactionLogMapper.updateById(log);
}
4.2 实时监控与告警
基于Spring Event构建事件驱动架构,关键事件包括:
- 设备离线
- 充电异常
- 支付失败
配置邮件+小程序模板消息的多通道告警:
properties复制# 告警规则配置
alarm.rules.device-offline=30m,5
alarm.rules.charging-error=immediate
alarm.rules.payment-failure=3,1h
5. 开发中的典型问题与解决方案
5.1 微信开发者工具与真机差异
-
textarea布局问题:开发者工具正常但真机上margin失效。最终通过外层view添加padding替代margin解决。
-
蓝牙通信调试:开发者工具模拟不全,必须真机测试。建议准备多款测试机,特别是不同品牌的安卓设备。
-
安全域名限制:本地开发时配置代理解决,上线前务必检查request合法域名配置。
5.2 硬件对接常见坑
-
485通信不稳定:检查终端电阻是否匹配,线缆长度是否超限(理论不超过1200米,实际建议控制在500米内)。
-
设备编号冲突:制定严格的设备编码规范,建议采用"区域代码+类型+序号"的层级结构。
-
固件版本兼容:设计版本协商机制,在通信握手阶段交换版本信息,服务端做兼容处理。
6. 项目部署与运维建议
6.1 生产环境部署
推荐使用Docker Compose编排服务:
yaml复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- ./mysql/data:/var/lib/mysql
backend:
build: .
ports:
- "8080:8080"
depends_on:
- mysql
6.2 监控指标设置
- 基础指标:CPU、内存、磁盘使用率
- 业务指标:在线设备数、并发充电数、支付成功率
- 异常监控:通信超时次数、硬件无响应事件
建议使用Prometheus+Grafana搭建监控看板,关键指标设置阈值告警。
7. 毕业设计扩展建议
-
数据分析扩展:增加充电热点时段分析、设备利用率统计等功能,使用ECharts可视化展示。
-
智能调度算法:基于历史数据预测充电需求,实现设备智能分配。
-
安全增强:增加充电过程温度监控,异常升温自动断电。
-
能源管理:对接校园光伏系统,优先使用清洁能源供电。
这个项目我前后迭代了三个版本,最大的体会是硬件对接一定要留足调试时间。建议学弟学妹们在开始编码前,先用两周时间专门测试硬件通信稳定性,建立完善的日志系统,这对后期排错至关重要。另外,微信小程序的审核周期较长,要提前规划好测试和上线时间。
