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