Files
mqtt_power/LogBook.md
2025-05-13 22:19:18 +08:00

5.3 KiB
Raw Blame History

项目变更日志 - 第二阶段MQTT 集成

2023-12-02: 第二阶段启动 - MQTT 集成

  • 状态: 第一阶段开发已完成,相关日志已存档至 LogBook_Phase1.md

  • 当前任务: 开始第二阶段开发,重点是 MQTT 的集成。

  • 依据文档: springboot-init-main/doc/development_stages/stage_2_mqtt_integration.md

  • 已完成:

    1. 数据库初始化: 在 mqtt_power 数据库中成功创建了 robot_task 表。
    2. MQTT Broker 确定与配置:
      • 确认使用公共 MQTT Broker: broker.emqx.io:1883
      • 更新 springboot-init-main/src/main/resources/application.yml 添加了 Broker 连接信息,并为 client-id-prefixcommand-topic-basestatus-topic-base 添加了项目唯一前缀 (如 yupi_mqtt_power_project/) 以确保在公共环境中的唯一性。
      • 创建了 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, MqttConnectionManager.java):
      • 创建了 com.yupi.project.mqtt.MqttCallbackHandler 类,实现 MqttCallbackExtended接口,用于处理连接事件和初步的消息接收(日志记录)。在 connectComplete 中实现订阅状态主题 yupi_mqtt_power_project/robot/status/+ 的逻辑。
      • 创建了 com.yupi.project.config.MqttConfig 配置类,定义 MqttConnectOptionsMqttClient Beans。
      • 创建了 com.yupi.project.mqtt.MqttConnectionManager 类,实现 ApplicationListener<ContextRefreshedEvent>DisposableBean,在应用启动完成后连接 MQTT并在应用关闭前断开连接。解决了 MqttClient 初始化和连接时序问题。
    5. 创建 RobotTask 管理基础结构:
      • com.yupi.project.model.enums 包下创建了 CommandTypeEnum.javaTaskStatusEnum.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. 实现消息发布 (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.timeoutSecondsmqtt.task.timeoutCheckRateMs 配置项。