This commit is contained in:
2025-05-13 21:30:06 +08:00
commit 60abc68c60
115 changed files with 12478 additions and 0 deletions

View File

@@ -0,0 +1,124 @@
# MQTT 智能充电桩系统 - 需求文档
## 1. 项目概述
本项目旨在开发一个基于 Spring Boot 的 **移动式** 智能充电管理系统。系统作为后端平台,通过 MQTT 协议与 **基于 ESP32-CAM 的充电机器人** 硬件设备进行通信,实现远程控制、状态监控以及 **调度机器人到指定车位进行充电**。同时,系统提供用户管理、充值计费等功能。**平台软件不负责机器人底层的导航、避障、循迹等具体算法实现**,仅发送高级指令并接收处理后的状态。
## 2. 功能需求
### 2.1 用户管理与认证
* **用户角色**: 系统需支持两种用户角色:
* 管理员:拥有系统所有管理权限。
* 普通用户:可进行充电、充值等操作。
* **用户登录**: 提供安全的用户名密码登录机制。
* 区分管理员和普通用户登录接口或逻辑。
* **用户信息管理** (管理员权限):
* 查看用户列表。
* (可选)添加、编辑、删除用户信息。
### 2.2 MQTT 集成与设备控制
* **MQTT 连接**:
* 连接至 **指定的公共 MQTT 服务器 (如 EMQX需提供具体地址和端口)**
* 支持为特定的 MQTT 主题Topic设置用户名和密码进行认证 **(需提供)**。
* 配置用于指令下发和状态上报的 Topic。
* **消息格式**:
* 与充电机器人通过 JSON 字符串格式进行消息交互。
* **设备控制** (平台侧重点):
* 向充电机器人发送 **高级控制指令**(见 MQTT Topic 规划)。
* 平台 **不处理** 原始传感器数据(如红外、超声波读数)。
* **状态接收** (平台侧重点):
* 接收充电机器人上报的 **综合状态信息**(见 MQTT Topic 规划)。
### 2.3 智能充电核心业务
* **充电机器人管理** (管理员权限):
* 可选添加、查看、管理充电机器人设备信息设备ID、当前状态、位置
* **车位管理** (管理员权限):
* 可选管理可用的充电车位信息车位ID、位置描述
* **激活码充值**:
* 普通用户可以使用激活码为自己的账户充值。
* 系统需验证激活码的有效性,并将对应金额或时长添加到用户账户。
* 需要设计激活码生成和管理机制(管理员)。
* **充电计费**:
* 根据实际充电时长进行计费。
* 需要明确计费单价(例如:元/小时)。
* 充电结束后,从用户账户扣除相应费用。
* 用户账户余额不足时,应有相应处理(如:无法启动充电、自动停止充电)。
* **充电流程** (平台侧重点):
1. 用户登录系统。
2. 用户 **选择目标充电车位** `{parkingSpotId}`
3. 用户发起充电请求。
4. 系统检查用户余额。
5. 系统选择一个可用的充电机器人 `{robotId}` (如果系统管理多个机器人)。
6. 系统通过 MQTT 发送 **移动指令 (`move_to_spot`)** 给机器人 `{robotId}`,目标为车位 `{parkingSpotId}`
7. 机器人移动到位后,通过 MQTT 上报 `arrived_at_spot` 状态。
8. 系统通过 MQTT 发送 **启动充电指令 (`start_charge`)** 给机器人。
9. 机器人开始充电并通过 MQTT 上报 `charging` 状态(及充电时长)。
10. 用户发起停止充电请求 或 机器人上报 `charge_complete` / `error` 状态。
11. 系统通过 MQTT 发送 **停止充电指令 (`stop_charge`)** 给机器人。
12. 系统根据 MQTT 上报的 **总充电时长** 计算费用并扣费。
13. 记录充电日志。
### 2.4 充电记录
* 记录用户的充电历史,包括:用户、**使用的机器人**、**充电车位**、开始时间、结束时间、充电时长、消费金额。
* 普通用户可查看自己的充电记录。
* 管理员可查看所有充电记录。
## 3. 非功能需求
* **可用性**: 系统应稳定可靠,提供持续服务。
* **安全性**: 用户密码需加密存储MQTT 通道需进行安全认证;防止未授权访问。
* **可维护性**: 代码结构清晰,遵循高内聚低耦合原则,易于维护和扩展。
* **性能**: 系统应能及时响应用户请求和处理 MQTT 消息。
## 4. 技术选型(初步)
* 后端框架: Spring Boot
* 持久层: MyBatis-Plus
* 数据库: MySQL
* 缓存: Redis
* **MQTT Broker**: 外部公共服务 (如 EMQX, **需用户提供实例信息**)
* MQTT 客户端库: Eclipse Paho MQTT Client
* API 文档: Knife4j
* 数据交换格式: JSON
* **机器人控制器 (参考)**: ESP32-CAM
## 5. MQTT 通道Topic规划 (需要用户确认并提供细节)
* **基础 Topic 结构**: (建议)
* 指令下发: `robot/command/{clientId}`
* 状态上报: `robot/status/{clientId}`
* *注:`{clientId}` 通常是认证时使用的客户端ID可以等同于机器人ID `{robotId}`,需要与硬件端约定。*
* **指令下发 Topic**: `robot/command/{clientId}` (平台 -> 机器人)
* **认证**: **需要** (用户名/密码由用户提供)
* **Payload (JSON 示例)**:
* 移动到车位: `{"action": "move_to_spot", "spotId": "P001"}`
* 开始充电: `{"action": "start_charge"}`
* 停止充电: `{"action": "stop_charge"}`
* 查询状态: `{"action": "query_status"}` (可选)
* **状态上报 Topic**: `robot/status/{clientId}` (机器人 -> 平台)
* **认证**: **需要** (用户名/密码由用户提供)
* **Payload (JSON 示例)**:
* 空闲状态: `{"robotId": "R001", "status": "idle", "location": "base", "battery": 95}`
* 移动中: `{"robotId": "R001", "status": "moving", "targetSpot": "P001", "battery": 90}`
* 到达车位: `{"robotId": "R001", "status": "arrived_at_spot", "spotId": "P001", "battery": 88}`
* 充电中: `{"robotId": "R001", "status": "charging", "spotId": "P001", "durationSeconds": 120, "battery": 92}`
* 充电完成: `{"robotId": "R001", "status": "charge_complete", "spotId": "P001", "totalDurationSeconds": 3600, "battery": 100}`
* 错误状态: `{"robotId": "R001", "status": "error", "errorCode": "NAV_BLOCKED", "message": "Navigation path blocked", "location": "near_P002"}`
* 通用状态响应 (对 query_status): `{"robotId": "R001", "status": "idle", "location": "base", "battery": 95}`
* **重要提示**: 上述 Topic 结构和 Payload 内容为 **建议**最终需要与硬件ESP32开发侧 **详细约定****统一**。平台将根据约定的格式进行开发。
## 6. 数据库设计 (已精简)
* **用户表 (`user`)**: 包含用户基本信息、**密码**、**角色 (如: admin, user)**、**账户余额**。
* 充电机器人表 (`charging_robot`)
* 车位表 (`parking_spot`)
* 充电记录表 (`charging_session`)
* 激活码表 (`activation_code`)
* **机器人任务表 (`robot_task`)**: 用于跟踪发送给机器人的指令及其状态 (pending, sent, acknowledged_success, acknowledged_failure, timed_out),防止重复发送指令给未响应的机器人。