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