Files
mqtt_power/springboot-init-main/doc/requirements.md
2025-05-13 21:30:06 +08:00

124 lines
7.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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),防止重复发送指令给未响应的机器人。