diff --git a/doc/设计文档/网关owl模块检查报告20260603.md b/doc/设计文档/网关owl模块检查报告20260603.md new file mode 100644 index 0000000..eb8e40a --- /dev/null +++ b/doc/设计文档/网关owl模块检查报告20260603.md @@ -0,0 +1,197 @@ +# 网关 Owl 模块检查报告 2026-06-03 + +> **基准文档**: `doc/对接文档/GoWVP接口文档.md` (3419行, ~40个API) +> **检查范围**: `gateway/src/IntegrationGateway.Adapters.Owl/` (OwlAdapter.cs, OwlAuthHelper.cs) +> **日期**: 2026-06-03 + +--- + +## 1. 覆盖率概览 + +GoWVP 接口文档共 **40 个 REST 端点**,当前 OwlAdapter 覆盖了 **8 个**(20%)。 + +| 模块 | 文档端点数 | 已实现 | 缺失 | +|------|:---:|:---:|:---:| +| 控制台 | 1 | 0 | 1 | +| 推流列表 | 4 | 0 | 4 | +| 拉流代理 | 4 | 0 | 4 | +| 国标设备 | 6 | 3 | 3 | +| 国标通道 | 3 | 3 | 0 | +| 通道管理 | 4 | 2 | 2 | +| AI 检测 | 4 | 0 | 4 | +| 事件 | 5 | 0 | 5 | +| 区域管理 | 2 | 0 | 2 | +| 配置管理 | 2 | 0 | 2 | +| 流媒体 | 2 | 0 | 2 | +| ONVIF | 3 | 0 | 3 | +| **合计** | **40** | **8** | **32** | + +--- + +## 2. 已实现接口对照 + +| GoWVP 端点 | OwlAdapter 方法 | 能力接口 | 状态 | +|------|------|------|:--:| +| GET /devices | GetDevicesAsync | IHasFlatDevices | ✅ | +| PUT /devices/{id} | PushMetadataAsync | IAcceptsMetadataPush | ✅ | +| POST /channels/{id}/play | GetLiveUrlAsync | IHasStreams | ✅ | +| POST /channels/{id}/ptz | PtzControlAsync / PtzStopAsync | IHasStreams | ✅ | +| POST /channels/{id}/snapshot | GetSnapshotAsync | IHasStreams | ✅ | +| GET /recordings | GetRecordingsAsync | IHasRecordings | ✅ | +| (未映射) | GetPlaybackUrlAsync | IHasStreams | ⚠️ 自拼URL | +| GET /health | HealthCheckAsync | IGatewayAdapter | ✅ | + +--- + +## 3. 缺失项详细清单 + +### 3.1 控制台监控(1个) + +| 端点 | 用途 | 影响 | +|------|------|------| +| **GET /stats** | CPU/内存/磁盘/网络实时监控 | 管理端无法查看 Owl 服务器健康度 | + +**建议**: OwlAdapter 增加 `GetStatsAsync()`,返回 CPU/内存/磁盘 JSON,`Capabilities.HasStats = true`。 + +### 3.2 推流管理(4个) + +| 端点 | 说明 | +|------|------| +| POST /stream_pushs | 添加推流通道 | +| GET /stream_pushs | 分页查询推流列表 | +| PUT /stream_pushs/{id} | 编辑推流 | +| DELETE /stream_pushs/{id} | 删除推流 | + +**影响**: 管理端无法从 Vol.Pro 直接添加/管理 Owl 推流通道,需登录 Owl 控制台操作。 + +### 3.3 拉流代理(4个) + +| 端点 | 说明 | +|------|------| +| POST /stream_proxys | 添加拉流代理 | +| GET /stream_proxys | 分页查询拉流列表 | +| PUT /stream_proxys | 编辑拉流代理 | +| DELETE /stream_proxys/{id} | 删除拉流代理 | + +**影响**: 同推流,非 GB28181 的 RTSP/RTMP 通道无法通过管理端管理。 + +### 3.4 国标设备扩展(3个) + +| 端点 | 说明 | 当前替代 | +|------|------|------| +| **GET /devices/channels** | 一键获取所有设备+通道列表 | 无 — 当前 GetDevicesAsync 只返回 NVR,不展开通道 | +| POST /devices | 添加 GB28181 设备 | 无 | +| POST /devices/{id}/catalog | 查询设备目录 | 无 | + +**关键缺失**: `GET /devices/channels` 直接返回设备+通道的联合结果,比单独调 `/devices` + `/channels` 高效。当前适配器在 `GetDevicesAsync` 中只映射了 NVR 设备(IsParent=true),**没有展开下级通道**。 + +### 3.5 通道管理(2个) + +| 端点 | 说明 | +|------|------| +| **POST /channels** | 添加 RTMP/RTSP 通道 | +| **DELETE /channels/{id}** | 删除通道 | +| GET /channels | 通道列表(独立) | + +**半缺失**: `GET /channels` 和 `PUT /channels/{id}` 虽未直接调用,但流和 PTZ 接口已间接使用通道 ID。 + +### 3.6 AI 检测能力(4个) + +| 端点 | 说明 | +|------|------| +| POST /channels/{id}/ai/enable | 启用 AI 检测 | +| POST /channels/{id}/ai/disable | 禁用 AI 检测 | +| POST /channels/{id}/zones | 添加 AI 检测区域 | +| GET /channels/{id}/zones | 获取检测区域 | + +**影响**: Owl 的 AI 人数统计/区域入侵能力无法通过网关管理端开启/配置。 + +### 3.7 AI 事件管理(5个) + +| 端点 | 说明 | +|------|------| +| GET /events | 分页查询 AI 事件(按通道/标签/时间筛选) | +| GET /events/{id} | 事件详情 | +| PUT /events/{id} | 更新事件 | +| DELETE /events/{id} | 删除事件 | +| GET /events/image/{path} | 获取事件快照图片 | + +**战略缺失**: Owl AI 事件(人员检测、车辆检测、入侵告警等)是**视频智能监控的核心数据**。当前网关零接入,意味着: +- 规则引擎无法以"人数越限"为条件触发动作 +- AI 事件不能同步到 Vol.Pro 告警表 +- 事件快照无法在大屏展示 + +**建议**: 通过 `IHasAlarms` 接口暴露 AI 事件,映射 `StandardAlarm { AlarmId=event.id, Level=重要/普通, Title=label, Content=快照路径 }`。 + +### 3.8 系统管理(4个) + +| 端点 | 说明 | +|------|------| +| GET /configs/info | 查询配置 | +| PUT /configs/info/sip | 修改 SIP 配置 | +| GET /media_servers | 流媒体列表 | +| PUT /media_servers/{id} | 修改流媒体 | + +**影响**: 运维类接口,暂不阻塞业务。 + +### 3.9 ONVIF(3个) + +| 端点 | 说明 | +|------|------| +| GET /onvif/devices-discover | ONVIF 设备发现 | +| POST /onvif | 添加 ONVIF 设备 | +| GET /onvif/discover | ONVIF 设备发现(SSE) | + +--- + +## 4. 现有代码问题项 + +### 4.1 设备列表只返回 NVR 不展开通道 + +`GetDevicesAsync` → `MapDevice` 将所有设备映射为 `IsParent=true, Category="硬盘录像机"`,不查询也不返回通道子设备。这导致: +- Vol.Pro 设备树中 Owl 设备全是父设备,无摄像头子节点 +- 前端预览按钮要求 `DeviceGroup='视频设备'` 的叶子设备,找不到子设备 + +`GET /devices/channels` 可一次性返回设备+通道,相比两次调用更高效。 + +### 4.2 OwlDevice 模型字段不完整 + +当前 `OwlDevice` 只有 8 个字段(Id, Name, IsOnline, Protocol, Address, Port, Transport),GoWVP 返回的 Device 至少有 20+ 个字段,缺失包括: + +| 缺失字段 | 说明 | 用途 | +|------|------|------| +| Manufacturer | 厂商 | 设备详情显示 | +| Model | 型号 | 设备详情显示 | +| Firmware | 固件版本 | 运维 | +| Longitude/Latitude | 经纬度 | 地图标记 | +| ChannelCount | 通道数 | 统计 | +| Status/RegisterWay | 注册方式 | GB28181 状态 | +| CreatedAt/UpdatedAt | 时间戳 | 同步管理 | + +### 4.3 HealthCheck 端点路径可能错误 + +代码调 `GET /health`,但 GoWVP 文档显示控制台唯一端点 `GET /stats`。需确认 Owl 实际实现。 + +### 4.4 GetPlaybackUrlAsync 手工拼 URL + +直接拼接 `/recordings/channels/{id}/index.m3u8?start_ms=&end_ms=&token=`,未调用 Owl API。虽然功能通常可用,但依赖内部路径约定,Owl 版本升级可能失效。 + +### 4.5 无 PTZ 预设位/巡航支持 + +GoWVP PTZ 接口 `POST /channels/{id}/ptz/control` 支持 `action: preset/patrol/scan/stop`,当前仅实现 `continuous` 方向移动和 `stop`。 + +--- + +## 5. 优先级建议 + +| 优先级 | 项目 | 说明 | +|:---:|------|------| +| 🔴 P0 | 设备列表展开通道 | 前端无法展示摄像头设备 | +| 🔴 P0 | AI 事件接入 IHasAlarms | 规则引擎无法获知人数/入侵 | +| 🟠 P1 | 使用 GET /devices/channels | 替代当前单独调 /devices | +| 🟠 P1 | OwlDevice 字段补全 | 设备详情展示 | +| 🟡 P2 | AI 检测启停 | 远程控制 Owl AI | +| 🟡 P2 | 推流/拉流 CRUD | 管理端统一通道管理 | +| ⚪ P3 | 预设位/巡航 PTZ | 高级云台功能 | +| ⚪ P3 | 系统管理接口 | 运维便捷性 | +| ⚪ P3 | ONVIF 设备发现 | 部署时的设备发现 |