mqtt对接嵌入式
This commit is contained in:
45
.workbuddy/memory/2026-06-08.md
Normal file
45
.workbuddy/memory/2026-06-08.md
Normal file
@@ -0,0 +1,45 @@
|
||||
# 2026-06-08 工作日志
|
||||
|
||||
## 代码质量审计 & 安全修复
|
||||
|
||||
### 已完成的 P0/P1 修复
|
||||
|
||||
1. **移除硬编码敏感凭据**(P0 安全红线)
|
||||
- `application-dev.yml`:邮件密码、阿里云短信 AK/SK、SnailJob Token、MySQL 密码 → 改为 `${ENV_VAR:}` 占位符
|
||||
- `application.yml`:MQTT Broker 密码、JWT 密钥 → 改为环境变量引用
|
||||
- `application-prod.yml`:SnailJob Token → 环境变量引用
|
||||
|
||||
2. **Git 仓库清理**
|
||||
- 更新 `.gitignore`:添加 `.idea/`、`*.iml`、`.vscode/`、`.env`、OS 临时文件
|
||||
- 创建 `.env.example` 模板文件,供团队参考配置
|
||||
|
||||
3. **修复 N+1 查询**(AppDeviceServiceImpl.deleteWithValidByIds)
|
||||
- 将 for 循环逐条 delete 改为 `QueryWrapper.in("device_id", ids)` 批量删除
|
||||
|
||||
4. **修复 AppSchedule 重复字段**
|
||||
- 移除与 BaseEntity 冲突的 `createTime` 字段定义(父类已有 @TableField fill=INSERT)
|
||||
|
||||
5. **DromaraApplication 日志规范化**
|
||||
- `System.out.println` → `@Slf4j` + `log.info()`
|
||||
|
||||
6. **DeviceDataHandler 代码清理**
|
||||
- 被注释的死代码改为结构化 TODO 注释,明确后续实现路径
|
||||
|
||||
7. **application.yml 格式修复**
|
||||
- 移除重复的 `--- # mqtt配置信息` 行
|
||||
|
||||
8. **修复 Spring 循环依赖**(MqttCommandAckService)
|
||||
- 循环链:MqttClientManager → MqttMessageDispatcher → MqttCommandAckService → MqttClientManager
|
||||
- 方案:MqttCommandAckService 中对 MqttClientManager 加 @Lazy,因为 publish() 仅在 retryExpiredCommands() 运行时调用,非构造阶段必须
|
||||
|
||||
### 待处理
|
||||
|
||||
- [ ] P1: 补齐 app_device 等 5 张表的 DDL 脚本(task #3)
|
||||
- [ ] P1: 搭建单元测试框架(task #6)
|
||||
- [ ] P2: 编写团队编码规范文档
|
||||
- [ ] 确认线上环境已同步更新凭据配置
|
||||
|
||||
### 技术备忘
|
||||
|
||||
- 环境变量默认值写法:`${VAR_NAME:defaultValue}` — dev 环境保留弱默认值方便本地开发,prod 必须强制覆盖
|
||||
- 环境变量模板 `.env.example` 已纳入 `.gitignore` 保护
|
||||
73
.workbuddy/memory/2026-06-10.md
Normal file
73
.workbuddy/memory/2026-06-10.md
Normal file
@@ -0,0 +1,73 @@
|
||||
# 2026-06-10 工作日志
|
||||
|
||||
## MQTT 分发重构 & 设备下发业务层
|
||||
|
||||
### 9. MqttMessageDispatcher 策略模式重构
|
||||
|
||||
**问题**:Dispatcher 硬编码 7 个 Regex Pattern 的 if-else 链,新增 Topic 必须改 Dispatcher 类。
|
||||
|
||||
**方案**:
|
||||
- 创建 `MqttTopicHandler` 接口(`topicPattern()` + `handle(deviceNo, payload)`)
|
||||
- 每个 Handler 实现该接口并声明自己的 Topic 正则
|
||||
- `MqttMessageDispatcher` 改为注入 `List<MqttTopicHandler>`,启动时自动收集,循环匹配
|
||||
- 新增 Topic:只需新增 Handler Bean,Dispatcher 零改动
|
||||
|
||||
**修复的 Bug**:
|
||||
- `DeviceCommandAckHandler` 原来是空壳(只打日志),现在委托到 `IDeviceCommandAckHandler` → `MqttCommandAckService`
|
||||
- `DeviceStatusHandler` 原来存在但 Dispatcher 从未路由到它(缺少 PATTERN),现已补全
|
||||
- 新增 `ScheduleFinishHandler`、`KeyFinishHandler`、`DeviceCommandReceiptHandler` 替代原来只打日志的空处理
|
||||
|
||||
**文件变更**:
|
||||
| 文件 | 变更 |
|
||||
|---|---|
|
||||
| `app/mqtt/MqttTopicHandler.java` | **新增** 策略接口 |
|
||||
| `app/mqtt/MqttMessageDispatcher.java` | **重写** 策略模式 |
|
||||
| `app/handler/DeviceDataHandler.java` | 实现 MqttTopicHandler |
|
||||
| `app/handler/DeviceRegisterHandler.java` | 实现 MqttTopicHandler |
|
||||
| `app/handler/DeviceStatusHandler.java` | 实现 MqttTopicHandler(新增 /status Topic) |
|
||||
| `app/handler/ErromesHandler.java` | 实现 MqttTopicHandler |
|
||||
| `app/handler/DeviceCommandAckHandler.java` | 实现 MqttTopicHandler + 委托 IDeviceCommandAckHandler |
|
||||
| `app/handler/ScheduleFinishHandler.java` | **新增** |
|
||||
| `app/handler/KeyFinishHandler.java` | **新增** |
|
||||
| `app/handler/DeviceCommandReceiptHandler.java` | **新增** |
|
||||
|
||||
### 10. 新增设备下发业务层 DeviceCommandService
|
||||
|
||||
**问题**:`AppDeviceServiceImpl.switchDevice()` 直接拼装 `DeviceCommand` 并调用底层 `IDeviceCommandPublisher`,缺少统一的下发入口。
|
||||
|
||||
**方案**:
|
||||
- 创建 `IDeviceCommandService` 接口
|
||||
- `DeviceCommandServiceImpl` 封装命令构造、设备校验、下发生效、浇水日志
|
||||
- 提供类型化方法:`sendSwitchCommand()`、`sendCustomCommand()`、`sendCommand()`
|
||||
- `AppDeviceServiceImpl.switchDevice()` 改为调用 `deviceCommandService.sendSwitchCommand()`
|
||||
|
||||
**文件变更**:
|
||||
| 文件 | 变更 |
|
||||
|---|---|
|
||||
| `app/service/IDeviceCommandService.java` | **新增** 接口 |
|
||||
| `app/service/impl/DeviceCommandServiceImpl.java` | **新增** 实现 |
|
||||
| `app/service/impl/AppDeviceServiceImpl.java` | 重构 switchDevice,注入 IDeviceCommandService,移除废弃的私有方法 |
|
||||
|
||||
### 11. 修复循环依赖根因
|
||||
|
||||
`MqttCommandAckService.mqttClientManager` 字段保留 `final` 导致 Lombok `@RequiredArgsConstructor` 仍将其放入构造器,`@Lazy` 注解在字段上不生效。已去掉 `final`,确保字段注入 + @Lazy 代理正确工作。
|
||||
|
||||
### 12. 删除冗余 /publish/status Topic
|
||||
|
||||
设备上传电量数据本身就证明在线,单独的 `/publish/status` Topic 没必要。删除 `DeviceStatusHandler` 和 `AppMqttDeviceStatusProperties`。策略模式下 Dispatcher 自动感知,零改动。
|
||||
|
||||
### 13. 修复两处循环依赖(构造器注入导致)
|
||||
|
||||
**大循环**(6个Bean):
|
||||
```
|
||||
DeviceMqttCommandPublisher → MqttClientManager → MqttMessageDispatcher
|
||||
→ DeviceRegisterHandler → AppDeviceServiceImpl → DeviceCommandServiceImpl
|
||||
→ DeviceMqttCommandPublisher(闭合)
|
||||
```
|
||||
修复:`DeviceCommandServiceImpl.commandPublisher` 去掉 `final`,改为 `@Lazy @Autowired` 字段注入。
|
||||
|
||||
**双向循环**(2个Bean):
|
||||
```
|
||||
AppDeviceServiceImpl ↔ DeviceCommandServiceImpl
|
||||
```
|
||||
修复:`AppDeviceServiceImpl.deviceCommandService` 去掉 `final`,改为 `@Lazy @Autowired` 字段注入。
|
||||
Reference in New Issue
Block a user