Files
mqtt_power/LogBook.md

79 lines
6.6 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.

# 变更日志
## YYYY-MM-DD
- 初始化项目变更日志。
- 确认采用 Gitea Webhook + Shell 脚本的 CI/CD 方案。
- 部署脚本 (`deploy.sh`) 和相关配置已准备。
## YYYY-MM-DD (请替换为实际日期)
- 详细分析了项目整体结构,特别是单片机 (`mqtt_esp32_client.ino`) 与后端 (`springboot-init-main`) 之间基于 `README.md` 的 MQTT 通信流程和协议。
- **核心理解**:
- **主题**:
- 上行 (设备 -> 后端): `yupi_mqtt_power_project/robot/status/{spotUid}` (状态/心跳/ACK)
- 下行 (后端 -> 设备): `yupi_mqtt_power_project/robot/command/{spotUid}` (指令)
- **消息格式**: JSON。上行消息结构对应后端 `com.yupi.project.model.dto.mqtt.RobotStatusMessage`
- **关键上行消息字段**: `robotUid`, `actualRobotStatus`, `taskId` (for ACK), `status` (for ACK), `activeTaskId` (通常为 `sessionId`)。
- **关键下行消息字段**: `commandType` ("START_CHARGE", "STOP_CHARGE", 等), `taskId`, `sessionId` (for "START_CHARGE")。
- **通信流程**: 设备连接后订阅指令主题并上报初始状态。周期性上报状态和心跳。后端下发指令设备执行后通过ACK响应并更新状态。
- **`activeTaskId` 的作用**: 该字段在单片机的状态上报和ACK中被用来传递当前有效的 `sessionId`,对于后端跟踪会话状态至关重要。
- 单片机代码中包含对 `MOVE_TO_SPOT` 指令的处理,`README.md` 未明确列出,后端可能需同步支持。
- 后续 Debug 将基于此理解进行。
## YYYY-MM-DD (请替换为今天的实际日期)
- **核心逻辑变更:"到达即充电"**
- 移除了原先设想的由后端发送 `START_CHARGE` MQTT 指令来启动充电的流程。
- 新流程:机器人(单片机)在执行 `MOVE_TO_SPOT` 指令并成功到达车位后,立即将自身状态更新为 `CHARGING` 并上报。后端在收到 `MOVE_TO_SPOT` 任务的 ACK (其中应包含机器人已是 `CHARGING` 状态) 后将机器人DB状态更新为 `CHARGING`,并将充电会话状态更新为 `CHARGING_STARTED`
- **代码修改**:
- `mqtt_esp32_client.ino`:
- `MOVE_TO_SPOT` 指令处理逻辑修改:
- 收到指令后,状态变为 `MOVING` 并上报。
- 模拟移动到达后,状态变为 `CHARGING`
- 发送的 ACK 消息中 `actualRobotStatus` 反映为 `CHARGING`
- 再次上报 `CHARGING` 状态。
- `ChargingSessionServiceImpl.java`:
- `handleRobotArrival` 方法修改:
-`MOVE_TO_SPOT` 任务完成后,将充电会话状态 (`ChargingSession.status`) 直接更新为 `CHARGING_STARTED`
- 记录 `robotArrivalTime``chargeStartTime`
- 将数据库中机器人状态 (`ChargingRobot.status`) 更新为 `CHARGING`
- 确保关联的 `RobotTask` (移动任务) 被正确处理和完成。
- `README.md`:
- 更新了MQTT通信约定、消息示例、单片机开发关键逻辑以及示例充电流程以反映"到达即充电"的新业务规则。
- **待考虑/后续**:
- `ChargingSessionServiceImpl.handleChargingStart` 方法目前因 `START_CHARGE` 指令不再由后端主动发送而可能不再被主要流程调用,其定位和用途需要进一步明确或在未来重构中调整。
- 前端界面和用户交互流程可能需要相应调整,以匹配后端"到达即充电"的逻辑(例如,可能不再需要用户在机器人到达后点击"开始充电"按钮)。
## YYYY-MM-DD (自动填充日期)
### ESP32 固件与后端通信逻辑校准与文档更新
**主要变更点:**
1. **MQTT ACK 消息格式校准 (关键)**:
* **问题分析**: 通过深入分析后端代码 (`MqttMessageHandlerImpl.java``CommandTypeEnum.java`)发现后端期望的MQTT ACK消息格式与之前`README.md`及单片机固件发送的格式存在显著差异。
* 后端期望ACK中包含 `command_ack` 字段,其值为指令的**中文描述** (例如 "移动到指定点"),用于 `CommandTypeEnum.fromAck()` 方法匹配。
* 后端期望任务ID字段为 `task_id` (数字类型)。
* 后端期望成功状态字段为 `success` (布尔类型)。
* **`README.md` 更新**: 已更新 `README.md` (4.2.1节) 中的ACK消息示例以准确反映后端期望的格式。包括添加了 `command_ack`,并将 `taskId` 改为 `task_id``status` (String) 改为 `success` (Boolean)。
* **行动项 (开发者)**: **开发者需要修改 `esp32_robot_firmware/mqtt_handler.cpp` 中的 `mqtt_publish_ack` 函数使其发送的ACK JSON符合后端 `MqttMessageHandlerImpl.java` 的实际解析逻辑 (即包含中文描述的 `command_ack`,数字类型的 `task_id`,和布尔类型的 `success`)。**
2. **MQTT 下行 `MOVE_TO_SPOT` 指令校准**:
* **问题分析**: 后端 `ChargingSessionServiceImpl.java` 在发送移动指令时实际使用的payload是 `{"command":"MOVE", ...}`,而 `README.md` 先前示例为 `{"commandType":"MOVE_TO_SPOT", ...}`
* **`README.md` 更新**: 已更新 `README.md` (4.2.2节) 中移动指令的示例,以反映后端实际发送的 `command: "MOVE"`格式,并添加了说明指出单片机固件已做兼容处理。
* **行动项 (开发者, 可选)**: 为保持一致性,可考虑更新后端 `ChargingSessionServiceImpl.java`,使其发送移动指令时使用 `commandType: "MOVE_TO_SPOT"`
3. **文档整体一致性提升**:
* `README.md` 中关于单片机处理逻辑 (4.3节) 和示例流程 (4.4节) 的部分也相应作了调整以强调新的ACK格式要求和指令细节。
**代码分析涉及文件:**
* `springboot-init-main/src/main/java/com/yupi/project/service/impl/ChargingSessionServiceImpl.java` (下行指令发送)
* `springboot-init-main/src/main/java/com/yupi/project/service/impl/MqttServiceImpl.java` (下行指令封装与 `taskId` 注入)
* `springboot-init-main/src/main/java/com/yupi/project/mqtt/handler/MqttMessageHandlerImpl.java` (上行消息及ACK处理核心逻辑)
* `springboot-init-main/src/main/java/com/yupi/project/model/enums/CommandTypeEnum.java` (ACK中`command_ack`的解析方式)
* `esp32_robot_firmware/mqtt_handler.cpp` (单片机ACK发送逻辑 - **需修改**)
* `esp32_robot_firmware/esp32_robot_firmware.ino` (单片机指令回调处理)
**后续影响与建议**:
* **首要任务是修正单片机固件的ACK发送逻辑**,确保与后端正确对接。
* 在完成固件修改后建议进行完整的MQTT通信测试覆盖所有指令类型及其ACK流程。