7.1 KiB
7.1 KiB
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、位置描述)。
- 激活码充值:
- 普通用户可以使用激活码为自己的账户充值。
- 系统需验证激活码的有效性,并将对应金额或时长添加到用户账户。
- 需要设计激活码生成和管理机制(管理员)。
- 充电计费:
- 根据实际充电时长进行计费。
- 需要明确计费单价(例如:元/小时)。
- 充电结束后,从用户账户扣除相应费用。
- 用户账户余额不足时,应有相应处理(如:无法启动充电、自动停止充电)。
- 充电流程 (平台侧重点):
- 用户登录系统。
- 用户 选择目标充电车位
{parkingSpotId}。 - 用户发起充电请求。
- 系统检查用户余额。
- 系统选择一个可用的充电机器人
{robotId}(如果系统管理多个机器人)。 - 系统通过 MQTT 发送 移动指令 (
move_to_spot) 给机器人{robotId},目标为车位{parkingSpotId}。 - 机器人移动到位后,通过 MQTT 上报
arrived_at_spot状态。 - 系统通过 MQTT 发送 启动充电指令 (
start_charge) 给机器人。 - 机器人开始充电并通过 MQTT 上报
charging状态(及充电时长)。 - 用户发起停止充电请求 或 机器人上报
charge_complete/error状态。 - 系统通过 MQTT 发送 停止充电指令 (
stop_charge) 给机器人。 - 系统根据 MQTT 上报的 总充电时长 计算费用并扣费。
- 记录充电日志。
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),防止重复发送指令给未响应的机器人。