一套覆盖用户APP、智能车锁、管理后台的完整共享单车解决方案,技术栈全面,实测抗压 89.7 次/秒
项目缘起
为了参加2025全国青少年信息素养大赛总决赛,我们按照给定题目要求完成了基本开关锁功能,但为了更贴近生活、做成完整成熟的产品,我们开发了更多分支及创新功能,包括但不限于:GPS定位、事故检测报警、车辆故障上报、车辆数据集群管理、后台管理大屏、以用户为单位的数据管理、行程数据记录展示。涵盖用户端APP、嵌入式智能锁、后台管理系统以及API服务。
本文将深入解析这套系统的技术架构与实现亮点。
团队分工
| 我(XHL) | 服务器运维、前后端搭建、APP、全部软件部分等 | 个人网站 |
| The Sandy | 车锁3D结构设计与打印、硬件结构构建、协助完成ESP32程序开发等 | 个人网站 |
一、整体架构:分层设计
项目三层架构:
| 层级 | 技术栈 | 功能 |
|---|---|---|
| 客户端 | Vue + Android + 高德地图 SDK | 地图展示、扫码开锁、行程记录、用户中心 |
| 单车端 | MicroPython + ESP32 + GPS/MPU6050 | 定位上报、姿态检测、开锁执行 |
| API 服务 | Python Flask | 业务逻辑处理、数据接口 |
| 数据层 | MySQL + 连接池 | 数据存储 |
| 基础设施 | Docker + Nginx + Debian | 容器化部署、负载均衡 |
二、服务端亮点:高性能与高可用
2.1 连接池设计
服务端基于 Python Flask 开发,数据库方面我自己封装了 SQL 类
from dbutils.pooled_db import PooledDB
class SQL:
def __init__(self, db_address, db_username, db_passwd, db_name):
self.pool = PooledDB(
creator=pymysql,
maxconnections=10,
host=db_address,
user=db_username,
password=db_passwd,
database=db_name
)实测数据:系统可承受约 89次/秒 的数据请求,在网络攻击测试中服务端从未崩溃。
2.2 日志系统
所有 API 请求都会通过 server_log() 函数记录到数据库,日志类型分为:
- USER:用户登录、注册、查询等操作
- BIKE:单车解锁、锁车、位置更新
- ACCI:事故报警、防盗报警
- MAIN:报修、维修完成
- PANEL:后台数据访问
这不仅便于问题追溯,也为数据分析和运营决策提供了基础。
2.3 钉钉告警集成
事故报警和防盗报警会通过钉钉机器人实时推送:
三、智能车锁:硬件与算法的结合
3.1 机械结构迭代
建模设计与3D打印部分由The Sandy完成(个人网站)
外壳经历了五代迭代:
| 版本 | 材料 | 改进点 |
|---|---|---|
| 初代 | PLA | 验证基础结构可行性 |
| 二代 | PLA | 优化润滑油方案 |
| 三代 | PLA | 固定方案优化 |
| 四代 | PETG-CF | 强度大幅提升 |
| 四+代 | PETG-CF + PETG 开窗 | 解决 GPS 信号屏蔽问题 |
技术细节:碳纤维增强 PETG 会屏蔽 GPS 信号,因此天线区域专门采用 PETG 开窗设计。
3.2 姿态检测与事故报警
使用 MPU6050 六轴传感器实时检测车辆姿态。当检测到异常冲击(如摔车),系统会:
- 通过 OLED 屏幕弹出提示,给用户 10 秒取消时间(防止误报)
- 确认后调用
/bike/accident接口 - 服务端查询用户预留的紧急联系人
- 钉钉机器人自动推送事故位置和用户信息
3.3 电源管理与光伏充电
太阳能板 → 充电IC → 7.4V锂电池
↓
DC-DC降压 → 5.06V → ESP32
↓
继电器直连 → 电磁铁(大电流)- 光伏充电:6V 3W 太阳能板持续补电
- 低功耗策略:GPS 无数据时自动重试,干簧管异常触发三次重试后上报故障
四、后台管理系统:数据可视化
后台采用 Vue3 + ECharts + 高德地图API 构建,功能包括:
- 仪表盘:单车总数、用户总数、请求总量实时刷新
- 单车位置追踪:地图上实时显示所有车辆分布
- 用户管理:查看所有用户信息及操作记录
- 骑行记录:订单详情、轨迹回放
- 维修管理:报修/修复状态流转
- 日志审计:服务端日志、单车日志、用户日志全量查询
五、API 接口设计规范
客户端接口示例
| 接口 | 路径 | 说明 |
|---|---|---|
| 用户登录 | POST /client/login | 返回昵称和状态 |
| 附近单车 | POST /client/nearby | 经纬度范围查询 |
| 解锁单车 | POST /client/unlock | 创建骑行记录 |
| 获取记录 | POST /client/getrecord | 历史订单 |
单车设备接口
| 接口 | 路径 | 说明 |
|---|---|---|
| 状态检查 | POST /bike/check | 返回 lock/unlock |
| 位置更新 | POST /bike/update | 实时上报轨迹 |
| 事故报警 | POST /bike/accident | 触发钉钉推送 |
安全设计
后台接口统一验证 Token:
{"token": "AABBCC"}六、部署与运维
项目采用 Docker 容器化部署,运行在云服务器上:
- OpenResty:端口转发、负载均衡
- MySQL 容器:数据持久化
- Python Flask 容器:API 服务
- Docker Compose:一键编排启动
七、项目亮点总结
- 技术栈完整闭环:从硬件(ESP32/MPU6050/GPS)到 APP(Vue/Android),从服务端(Flask)到数据库(MySQL),再到大屏(Vue3/ECharts),覆盖全链路
- 工程化实践到位:连接池、日志分类、Docker 部署,具备生产环境可用性
- 安全与应急机制:事故报警 + 10 秒取消机制、防盗报警、钉钉实时推送
- 性能表现优异:实测 89.7 次/秒并发请求,攻击测试服务端稳定不崩溃
- 快速落地能力:模块化设计,换用不同地图 SDK 或消息推送渠道只需少量改动
欢迎技术交流。如需完整源代码与硬件文件,请联系
评论
暂无评论