chore: upload current project state
This commit is contained in:
+332
@@ -0,0 +1,332 @@
|
||||
# 整改计划
|
||||
|
||||
日期:2026-05-11
|
||||
|
||||
本文档只保留以下内容:
|
||||
|
||||
- 当前确认存在的问题和风险
|
||||
- 对应的修改方案、影响范围和代码落点
|
||||
|
||||
执行项已单独整理到 `docs/todo.md`。
|
||||
|
||||
## 1. 推理进程重启链路失效
|
||||
|
||||
### 问题
|
||||
|
||||
当前启动和重启使用了两套不同的端口管理器:
|
||||
|
||||
- 启动阶段:`connect.GlobalPortManager`
|
||||
- 心跳重启阶段:`portmanager.GlobalPortManager`
|
||||
|
||||
结果是:
|
||||
|
||||
- 初次启动能分到端口
|
||||
- 心跳超时后重启拿不到原端口
|
||||
- `yolov5` 重启流程会失败
|
||||
|
||||
### 风险
|
||||
|
||||
- 推理进程挂掉后无法自恢复
|
||||
- 设备会长期失去 `fire_leave` / `fire_check` 检测能力
|
||||
|
||||
### 准备怎么改
|
||||
|
||||
统一端口管理实现,只保留一套端口管理器。
|
||||
|
||||
建议方案:
|
||||
|
||||
1. 以当前 `main.go` 正在使用的 `connect.GlobalPortManager` 为准,统一所有调用
|
||||
2. 重写或合并 `connect/heartbeat.go` 中的端口获取逻辑
|
||||
3. 清理重复的 `portmanager` 包引用,避免两套状态并存
|
||||
|
||||
### 需要修改的代码
|
||||
|
||||
- `main.go`
|
||||
- `connect/heartbeat.go`
|
||||
- `connect/port_manager.go`
|
||||
- `portmanager/portmanager.go`
|
||||
- `portmanager/types.go`
|
||||
|
||||
## 2. `service.conf` 读写 schema 不一致
|
||||
|
||||
### 问题
|
||||
|
||||
当前配置读取和写回不是同一套结构:
|
||||
|
||||
- `LoadServiceConfig()` 按 `[]ServiceConfig` 读取
|
||||
- `SaveServiceConfig()` / `SaveSingleServiceConfig()` 按 `[]DeviceData` 写回
|
||||
|
||||
### 风险
|
||||
|
||||
- WebSocket 或其它更新路径一旦写回配置
|
||||
- 下次启动可能无法按原 schema 正确读取
|
||||
- 配置字段可能丢失或错位
|
||||
|
||||
### 准备怎么改
|
||||
|
||||
统一配置文件模型,明确:
|
||||
|
||||
- `service.conf` 是“部署输入配置”
|
||||
- `device_*.json` 是“运行态持久化”
|
||||
|
||||
建议方案:
|
||||
|
||||
1. `service.conf` 始终只用 `ServiceConfig` 读写
|
||||
2. 运行态状态继续写入 `/data/devices/device_{uuid}.json`
|
||||
3. 如果确实需要从 WebSocket 更新配置,先把 `DeviceData` 映射回 `ServiceConfig` 再写入
|
||||
|
||||
### 需要修改的代码
|
||||
|
||||
- `connect/device_storage.go`
|
||||
- `connect/ws_channel.go`
|
||||
|
||||
## 3. `fire_leave` 参数映射不完整
|
||||
|
||||
### 问题
|
||||
|
||||
当前 `fire_leave` 主判定读的是:
|
||||
|
||||
- `deviceData.DetectionTime`
|
||||
- `deviceData.AlarmTime`
|
||||
|
||||
但新配置的真实值在:
|
||||
|
||||
- `deviceData.FireLeaveParam.DetectionTime`
|
||||
- `deviceData.FireLeaveParam.AlarmTime`
|
||||
|
||||
另外 `person_count`、双模型 `confidence` 也存在未完整映射的问题。
|
||||
|
||||
### 风险
|
||||
|
||||
- 离岗报警持续时间可能一直用默认值
|
||||
- 冷却时间可能一直用默认值
|
||||
- 前端/平台配置和实际行为不一致
|
||||
|
||||
### 准备怎么改
|
||||
|
||||
在配置初始化阶段统一完成映射,不在运行主循环里到处兜底。
|
||||
|
||||
建议方案:
|
||||
|
||||
1. `LoadServiceConfig()` 时完成 `param.fire_leave` 到运行字段的转换
|
||||
2. `ProcessDeviceDataForInference()` 或专门的 normalize 逻辑里统一补齐
|
||||
3. 后续主循环尽量只读规范化后的字段
|
||||
|
||||
### 需要修改的代码
|
||||
|
||||
- `connect/device_storage.go`
|
||||
- `main.go`
|
||||
|
||||
## 4. `/dhlr/forbid_time` 还没真正接入 `fire_leave` 暂停上报
|
||||
|
||||
### 问题
|
||||
|
||||
按当前确认后的业务:
|
||||
|
||||
- `/dhlr/forbid_time` 是控制 `fire_leave` 暂停上报窗口
|
||||
- `fire_check` 仍要继续正常上报
|
||||
|
||||
但当前代码主要做的是:
|
||||
|
||||
- 缓存 `minute`
|
||||
- 缓存 `fire_leave_timeout` / `fire_check_timeout`
|
||||
- 服务于 `reporter` 里的事件周期逻辑
|
||||
|
||||
没有真正控制 `fire_leave` 主报警判定。
|
||||
|
||||
### 风险
|
||||
|
||||
- 按钮按下后,现场期待的“暂时允许离岗”不会真正生效
|
||||
- 现场仍可能连续收到不符合预期的 `fire_leave` 报警
|
||||
|
||||
### 准备怎么改
|
||||
|
||||
把 `/dhlr/forbid_time` 从“事件周期配置”改为“主报警暂停窗口控制”。
|
||||
|
||||
建议方案:
|
||||
|
||||
1. 在设备级状态里增加 `fire_leave` 暂停截止时间
|
||||
2. 收到 `/dhlr/forbid_time` 后更新这个截止时间
|
||||
3. 在 `fire_leave` 报警判定前先检查暂停窗口
|
||||
4. 暂停期内继续更新人数、温度,但跳过 `fire_leave` 上报
|
||||
5. `fire_check` 保持独立
|
||||
|
||||
### 需要修改的代码
|
||||
|
||||
- `main.go`
|
||||
- `reporter/reporter.go`
|
||||
- `gpio_monitor/gpio_monitor.go`
|
||||
- 可能涉及 `connect/ws_channel.go` 的控制消息分发
|
||||
|
||||
## 5. GPIO 按钮逻辑和真实业务存在偏差
|
||||
|
||||
### 问题
|
||||
|
||||
当前按钮逻辑更接近“切换事件周期”,而不是“暂停 `fire_leave` 上报”。
|
||||
|
||||
### 风险
|
||||
|
||||
- 代码行为和现场业务理解不一致
|
||||
- 后续维护时容易误判
|
||||
|
||||
### 准备怎么改
|
||||
|
||||
将 GPIO 按钮逻辑收敛为:
|
||||
|
||||
- 触发本地允许离岗窗口
|
||||
- 或配合 `/dhlr/forbid_time` 完成暂停控制
|
||||
|
||||
### 需要修改的代码
|
||||
|
||||
- `gpio_monitor/gpio_monitor.go`
|
||||
- `reporter/reporter.go`
|
||||
- `main.go`
|
||||
|
||||
## 6. WebSocket 协议需要整体切换到 protobuf binary frame
|
||||
|
||||
### 问题
|
||||
|
||||
当前协议层是:
|
||||
|
||||
- JSON
|
||||
- 文本帧
|
||||
- `method + params + result + error`
|
||||
|
||||
目标协议是:
|
||||
|
||||
- protobuf
|
||||
- binary frame
|
||||
- `REQUEST / REPLY / CAST`
|
||||
|
||||
### 风险
|
||||
|
||||
- 现有 `ws_channel.go` 不能局部修补
|
||||
- 如果只改部分字段,会造成协议不兼容
|
||||
|
||||
### 准备怎么改
|
||||
|
||||
按“先替换协议层,尽量少动业务层接口”的原则改。
|
||||
|
||||
建议方案:
|
||||
|
||||
1. 保留上层调用接口:
|
||||
- `RegisterService`
|
||||
- `SubscribeTopic`
|
||||
- `SendAsync`
|
||||
2. 内部把 JSON 封装替换为 protobuf 编解码
|
||||
3. 下行从 `publish` 改为 `topic_event`
|
||||
4. 上行从 JSON `metric_data` 改为 `ServiceCast.metric_data`
|
||||
5. 内层业务 payload 继续保留当前 JSON 结构
|
||||
|
||||
### 需要修改的代码
|
||||
|
||||
- `connect/ws_channel.go`
|
||||
- `reporter/reporter.go`
|
||||
- 可能新增 `connect/pb/` 或 `connect/protocol/`
|
||||
|
||||
## 7. 主动 ping 建议保留,失败立即重连
|
||||
|
||||
### 问题
|
||||
|
||||
如果不主动 ping:
|
||||
|
||||
- 死连接发现会变慢
|
||||
- 空闲连接可能被网络设备静默回收
|
||||
- 只有下次读写时才发现断连
|
||||
|
||||
### 风险
|
||||
|
||||
- `/dhlr/alert`
|
||||
- `/dhlr/forbid_time`
|
||||
- 事件上报链路
|
||||
|
||||
以上三类能力恢复变慢。
|
||||
|
||||
### 准备怎么改
|
||||
|
||||
继续保留主动 ping。
|
||||
|
||||
建议方案:
|
||||
|
||||
1. 定时发送 websocket ping frame
|
||||
2. ping 失败时立即标记断连
|
||||
3. 触发重连
|
||||
4. 重连后重新 register / subscribe
|
||||
|
||||
### 需要修改的代码
|
||||
|
||||
- `connect/ws_channel.go`
|
||||
|
||||
## 8. 业务上报仍然是“只发不确认”
|
||||
|
||||
### 问题
|
||||
|
||||
当前:
|
||||
|
||||
- `register`
|
||||
- `subscribe`
|
||||
|
||||
这类请求有协议层确认。
|
||||
|
||||
但:
|
||||
|
||||
- 报警事件上报
|
||||
- 数据快照上报
|
||||
|
||||
仍然是单向发送。
|
||||
|
||||
### 风险
|
||||
|
||||
- 只能确认本地是否成功写出 websocket 消息
|
||||
- 不能确认 efka 是否真正处理成功
|
||||
- 不能确认上层平台是否真正收到、入库、展示
|
||||
|
||||
### 当前处理决定
|
||||
|
||||
这一项先不解决,只记录风险。
|
||||
|
||||
### 相关代码
|
||||
|
||||
- `connect/ws_channel.go`
|
||||
- `reporter/reporter.go`
|
||||
|
||||
## 9. 运行中配置更新链路未闭环
|
||||
|
||||
### 问题
|
||||
|
||||
当前有:
|
||||
|
||||
- `ConfigUpdateChan` 生产者
|
||||
|
||||
但没有看到清晰的消费者和热更新执行链路。
|
||||
|
||||
### 风险
|
||||
|
||||
- 代码让人以为支持实时热更新
|
||||
- 实际运行中可能并不会生效
|
||||
|
||||
### 准备怎么改
|
||||
|
||||
先做一次取舍:
|
||||
|
||||
- 要么补齐热更新
|
||||
- 要么明确去掉这条未完成链路
|
||||
|
||||
### 需要修改的代码
|
||||
|
||||
- `connect/ws_channel.go`
|
||||
- `main.go`
|
||||
|
||||
## 10. 自动化验证不足
|
||||
|
||||
### 问题
|
||||
|
||||
当前环境没有 `go`,也没有看到覆盖关键链路的自动化测试。
|
||||
|
||||
### 风险
|
||||
|
||||
- 协议层改造、重启链路改造、报警暂停逻辑改造容易引入回归
|
||||
|
||||
### 准备怎么改
|
||||
|
||||
至少补最小化验证路径。
|
||||
Reference in New Issue
Block a user