mqtt集成初步实现
This commit is contained in:
44
LogBook.md
44
LogBook.md
@@ -13,19 +13,37 @@
|
||||
- 创建了 `springboot-init-main/src/main/java/com/yupi/project/config/properties/MqttProperties.java` 来映射 MQTT 配置。
|
||||
3. **更新开发文档**:
|
||||
- 修改了 `springboot-init-main/doc/development_stages/stage_2_mqtt_integration.md`,反映了公共 Broker 的使用、Topic 唯一性策略以及应用层鉴权的重要性。
|
||||
4. **实现 MQTT 客户端核心配置 (`MqttConfig.java` 和 `MqttCallbackHandler.java`)**:
|
||||
4. **实现 MQTT 客户端核心配置 (`MqttConfig.java`, `MqttCallbackHandler.java`, `MqttConnectionManager.java`)**:
|
||||
- 创建了 `com.yupi.project.mqtt.MqttCallbackHandler` 类,实现 `MqttCallbackExtended`接口,用于处理连接事件和初步的消息接收(日志记录)。在 `connectComplete` 中实现订阅状态主题 `yupi_mqtt_power_project/robot/status/+` 的逻辑。
|
||||
- 创建了 `com.yupi.project.config.MqttConfig` 配置类:
|
||||
- 注入 `MqttProperties` 和 `MqttCallbackHandler`。
|
||||
- 定义了 `MqttConnectOptions` Bean,配置连接参数(如自动重连、Clean Session、超时等)。
|
||||
- 定义了 `MqttClient` Bean,使用唯一的客户端ID,并设置 `MqttCallbackHandler`。
|
||||
- 使用 `@PostConstruct` 实现了应用启动时自动连接到 MQTT Broker 的逻辑。
|
||||
- 使用 `@PreDestroy` 实现了应用关闭时断开 MQTT 连接的逻辑。
|
||||
- 创建了 `com.yupi.project.config.MqttConfig` 配置类,定义 `MqttConnectOptions` 和 `MqttClient` Beans。
|
||||
- 创建了 `com.yupi.project.mqtt.MqttConnectionManager` 类,实现 `ApplicationListener<ContextRefreshedEvent>` 和 `DisposableBean`,在应用启动完成后连接 MQTT,并在应用关闭前断开连接。解决了 MqttClient 初始化和连接时序问题。
|
||||
5. **创建 `RobotTask` 管理基础结构**:
|
||||
- 在 `com.yupi.project.model.enums` 包下创建了 `CommandTypeEnum.java` 和 `TaskStatusEnum.java`。
|
||||
- 在 `com.yupi.project.model.entity` 包下创建了 `RobotTask.java` 实体类,包含 MyBatis-Plus 注解。
|
||||
- 在 `com.yupi.project.mapper` 包下创建了 `RobotTaskMapper.java` 接口。
|
||||
- 在 `com.yupi.project.service` 包下创建了 `RobotTaskService.java` 接口,定义了任务管理的核心方法。
|
||||
- 在 `com.yupi.project.service.impl` 包下创建了 `RobotTaskServiceImpl.java` 类,并为接口方法提供了最小化占位实现。
|
||||
6. **详细实现 `RobotTaskServiceImpl` 中的核心业务方法**:
|
||||
- `createTask(String robotId, CommandTypeEnum commandType, String payloadJson, Long sessionId)`: 创建新的机器人任务,初始状态为 PENDING。
|
||||
- `hasPendingOrSentTask(String robotId)`: 检查机器人是否有 PENDING 或 SENT 状态的任务。
|
||||
- `markTaskAsSent(Long taskId, Date sentTime)`: 将任务状态从 PENDING 更新为 SENT,并记录发送时间。
|
||||
- `findLatestSentTaskByRobotId(String robotId)`: 查找指定机器人最近一个 SENT 状态的任务。
|
||||
- `markTaskAsAcknowledged(Long taskId, boolean success, String errorMessage, Date ackTime)`: 根据机器人响应更新任务状态为 ACKNOWLEDGED_SUCCESS 或 ACKNOWLEDGED_FAILURE,并记录确认时间和错误信息。
|
||||
- `findAndMarkTimedOutTasks(int timeoutSeconds)`: 查找并标记已发送但超时的任务为 TIMED_OUT。
|
||||
|
||||
- **下一步计划 (依据 `stage_2_mqtt_integration.md`)**:
|
||||
1. **实现 `RobotTask` 管理 (`RobotTaskService`)**:
|
||||
- 创建 `RobotTask` 实体、Mapper 接口。
|
||||
- 定义并实现 `RobotTaskService` 接口中的方法 (如创建任务、更新任务状态、查找任务等)。
|
||||
2. **实现消息发布 (`MqttService`)**: 用于向机器人发送指令,并与 `RobotTaskService` 交互记录任务。
|
||||
3. **实现消息处理 (`MqttMessageHandler`)**: 详细处理从机器人接收到的状态更新,并与 `RobotTaskService` 交互更新任务状态。
|
||||
4. **实现任务超时处理 (`TaskTimeoutHandler`)**: 定时检查并处理超时的 MQTT 任务。
|
||||
1. **实现消息发布 (`MqttService`)**:
|
||||
- 创建 `MqttService` 接口和 `MqttServiceImpl` 实现类。
|
||||
- 实现 `sendCommand(...)` 方法,该方法会调用 `RobotTaskService.hasPendingOrSentTask` 进行检查,调用 `RobotTaskService.createTask` 创建任务,然后通过 `MqttClient` 发布指令,最后调用 `RobotTaskService.markTaskAsSent` 更新任务状态。
|
||||
2. **实现消息处理 (`MqttMessageHandler`)**:
|
||||
- 创建 `MqttMessageHandler` 接口和 `MqttMessageHandlerImpl` 实现类 (之前 `MqttCallbackHandler` 中有占位,现在需要具体实现)。
|
||||
- 实现 `handleStatusUpdate(String topic, String payload)` 方法,解析机器人状态,查找关联的 `RobotTask`,并调用 `RobotTaskService.markTaskAsAcknowledged` 更新任务。
|
||||
- 根据机器人状态执行后续业务逻辑 (此阶段可留空或简单日志记录)。
|
||||
3. **实现任务超时处理 (`TaskTimeoutHandler`)**:
|
||||
- 创建 `TaskTimeoutHandler` 类,使用 `@Scheduled` 定时调用 `RobotTaskService.findAndMarkTimedOutTasks`。
|
||||
- (可选)根据超时任务更新关联的业务实体状态 (如 `ChargingRobot`, `ChargingSession`)。
|
||||
|
||||
- 更正了 `springboot-init-main/src/main/java/com/yupi/project/service/impl/MqttServiceImpl.java` 的实现,确保 `sendCommand` 方法的逻辑完整和正确。
|
||||
- 实现 `TaskTimeoutHandler.java`,使用 `@Scheduled` 定时调用 `RobotTaskService.findAndMarkTimedOutTasks` 处理任务超时。
|
||||
- 在 `MyApplication.java` 中添加 `@EnableScheduling` 以启用定时任务。
|
||||
- 在 `application.yml` 中添加了 `mqtt.task.timeoutSeconds` 和 `mqtt.task.timeoutCheckRateMs` 配置项。
|
||||
Reference in New Issue
Block a user