Files
SecMPS/doc/整合方案/SecMPS_最终整合方案_v2.0.md
2026-05-16 10:48:44 +08:00

12 KiB
Raw Blame History

SecMPS 整合方案最终版IntegrationGateway + 统一设备管理

版本: v2.0
日期: 2026-05-16
状态: 待实施
替代: v1.0 系列方案文档


一、总体架构

前端层
  web.vite 管理端(设备管理+网关管理)  warehouse 大屏Map/Live/IoT/Alarm
         | HTTP REST                                   | HTTP REST + SignalR
         v                                              v
Vol.Pro 后端 (api_sqlsugar)
  DeviceManagerController / GatewayNodeController / SignalR Hubs
  Quartz: SyncDevicesJob / RealtimePollJob / AlarmPollJob
  数据库: 8 张表 (base_device / gateway_nodes / 扩展表...)
         | 注册/下发设备/心跳/同步数据
         v
IntegrationGateway 实例A (:5100)       IntegrationGateway 实例B (:5101)
  NodeCode: gw-31ku                      NodeCode: gw-11ku
  Adapters: MC4 / Owl                    Adapters: MC4 / HikvisionISC
         | HTTP                              | HTTP
         v                                   v
MC4.0 (:3000)  Owl (:80)            MC4.0 (:3000)  海康ISC (:80)

网关多实例架构(方案 C+

  • Vol.Pro 管理网关实例gateway_nodes 表注册所有网关节点
  • 网关启动时主动注册POST /api/gateway/register 上报 NodeCode/Token/AdapterTypes/BaseUrl
  • Vol.Pro 下发顶层设备Base_Device.GatewayNodeId 关联设备归属
  • 网关无状态:配置只有 3 个值NodeCode/Token/VolProUrl挂了重装即恢复
  • AdapterCode 双段标识:"mc4:31号库房" 区分同类型多实例
  • 心跳机制:网关每 15s 上报心跳Vol.Pro 超 30s 无心跳级联设备离线

二、IntegrationGateway 设计

2.1 项目结构(位于 gateway/ 独立文件夹)

gateway/
├── IntegrationGateway.sln
└── src/
    ├── IntegrationGateway.Host/       # WebAPI (:5100)
    |   ├── Controllers/
    |   |   ├── HealthController.cs
    |   |   ├── DevicesController.cs
    |   |   ├── PointsController.cs
    |   |   ├── StreamsController.cs
    |   |   ├── AlarmsController.cs
    |   |   ├── SyncController.cs
    |   |   └── RegisterController.cs  # 网关注册/心跳
    |   ├── appsettings.json           # { NodeCode, Token, VolProUrl }
    |   └── Program.cs
    ├── IntegrationGateway.Core/
    |   ├── Abstractions/ → 7 个分型接口
    |   ├── Models/       → 10 个标准化模型
    |   └── Infrastructure/ → AdapterRegistry / TokenManager / RateLimiter
    ├── IntegrationGateway.Adapters.Owl/
    └── IntegrationGateway.Adapters.MC4/

2.2 网关注册与心跳流程

管理端: gateway_nodes 表新增记录 → 生成 NodeCode + Token
网关配置: appsettings.json { NodeCode, Token, VolProUrl }
网关启动 → POST /api/gateway/register { nodeCode,token,adapterTypes,baseUrl }
Vol.Pro 校验 Token → 更新 AdapterTypes/BaseUrl/IsOnline=1
响应: { gatewayNodeId, devices: [Base_Device WHERE GatewayNodeId=当前网关] }
网关根据 AdapterCode 分流 → Adapter 连接第三方 → 发现子设备
网关 → POST /api/gateway/sync → Vol.Pro 写入 Base_Device 及子设备
网关每 15s → POST /api/gateway/heartbeat { nodeCode, token }
Vol.Pro 后台任务: IsOnline=1 且 LastHeartbeat < now-30s → IsOnline=0 → 级联设备离线

2.3 网关配置

{
  "VolProBaseUrl": "http://localhost:9100",
  "NodeCode": "gw-31ku",
  "NodeToken": "xxxxxxxxxx"
}

适配器类型由网关启动时扫描已注册的 Adapter 类自动获取,无需在配置中声明。

2.4 适配器能力矩阵

接口 Owl MC4.0 门禁(未来)
IHasOwnDeviceTree
IHasFlatDevices
IHasPoints
IHasStreams
IHasAlarms ⚠️
IAcceptsMetadataPush ⚠️

2.5 双向同步引擎

方向 说明 MC4.0 Owl
PullToVolPro 第三方→Vol.Pro FullReplace Merge
PushToSource Vol.Pro→第三方 告警确认/控制 元数据/PTZ
Bidirectional 先写第三方再更新本地 告警确认

2.6 Gateway API

# 注册与心跳
POST /api/gateway/register  { nodeCode, token, adapterTypes, baseUrl }
POST /api/gateway/heartbeat  { nodeCode, token }

# 设备与数据
GET  /api/gateway/devices?adapter=&page=&size=
GET  /api/gateway/devices/sync?adapter=
GET  /api/gateway/realtime/{adapter}/{deviceId}
POST /api/gateway/realtime/{adapter}/control
GET  /api/gateway/streams/{adapter}/{id}/live
POST /api/gateway/streams/{adapter}/{id}/ptz
GET  /api/gateway/alarms/{adapter}?from=&to=
POST /api/gateway/alarms/{adapter}/{id}/confirm
GET  /api/gateway/health

三、数据模型8 张表)

3.1 区域表 warehouse_regions现有

字段 说明
Id int PK
RegionName nvarchar(255)
ParentId int? (自引用树)

3.2 网关节点表 gateway_nodes新建

字段 类型 说明
NodeId INT AUTO_INCREMENT 网关节点ID
NodeCode NVARCHAR(50) 网关唯一编码(管理端配置)
NodeName NVARCHAR(100) 网关名称
NodeToken NVARCHAR(100) 认证令牌(管理端生成)
AdapterTypes NVARCHAR(200) 适配器类型(网关上报)
BaseUrl NVARCHAR(200) 网关地址(网关上报)
LastHeartbeat DATETIME 上次心跳时间
IsOnline TINYINT DEFAULT 0 在线状态
Enable TINYINT DEFAULT 1 启用

3.3 统一设备主表 Base_Device

字段 类型 说明
DeviceId INT AUTO_INCREMENT Vol.Pro内部ID
DeviceName NVARCHAR(100) 本地名称
AdapterCode NVARCHAR(50) "mc4:31号库房"(类型:实例)
SourceId NVARCHAR(100) 第三方原始ID
DeviceCategory NVARCHAR(50) Video/IoT/Access/Barrier/Alarm字典
RegionId INT? 所属区域ID
GatewayNodeId INT? 所属网关节点ID
IsParent TINYINT 是否父设备
ParentDeviceId INT? 父设备自引用
IsOnline TINYINT 在线状态
MapModelId NVARCHAR(100) VgoMap模型ID
MapModelScale FLOAT
MapModelRotation NVARCHAR(100)
Lat/Lng DOUBLE WGS84
ExtraData TEXT 适配器原始JSON
LocalOverrides TEXT 本地覆盖JSON
SyncVersion BIGINT 乐观锁
LastSyncTime DATETIME

唯一约束: (AdapterCode, SourceId)

3.4 扩展表

  • Device_Video_Ext: 视频设备扩展OwlDeviceId, Protocol, ChannelCount
  • Video_Channel: 视频通道扩展OwlChannelId, DeviceId, OwlStreamApp/Name, HasPtz, SnapshotUrl
  • Video_Record: 录像记录ChannelId, OwlRecordId, StartedAt, FilePath
  • Device_IoT_Ext: IoT设备扩展Mc4DeviceId, PointIndex, Unit, IsControlPoint, ObjectType
  • IoT_DeviceData: 历史归档DeviceId→子设备, PointValue, 仅存快照)
  • IoT_Alarm: 通用告警SourceAlarmId, DeviceId, AlarmLevel, State

3.5 层级示例

gateway_nodes: gw-31ku (32号库房网关, MC4+Owl)

warehouse_regions: 厂区 → 新库区 → 31号库房

Base_Device (RegionId=3, GatewayNodeId=gw-31ku.NodeId):
  东北角高位摄像机          (Category=1, Device_Video_Ext)
  人员计数摄像机            (Category=1, Device_Video_Ext)
  动环采集器               (Category=2, IsParent=1, Device_IoT_Ext)
  ├── 温湿度探头            (ParentDeviceId=采集器, Device_IoT_Ext.PointIndex=0)
  ├── 空调控制器            (ParentDeviceId=采集器, Device_IoT_Ext.IsControlPoint=1)
  ├── 除湿机                (ParentDeviceId=采集器)
  └── 紧急报警按钮          (ParentDeviceId=采集器)

四、管理端统一设备页面

4.1 布局

+------------------+---------------------------------------+
|  顶部工具栏       |                                       |
+------------------+---------------------------------------+
|  左侧区域树       |  右侧设备列表                           |
|                  |                                       |
|  📁 厂区         |  区域:31号库房  最后同步:05-15          |
|   📁 新库区      |  +---------------------------------+  |
|    📁 31号库房 ● |  | ▸动环采集器   MC4.0  █在线    |  |
|    📁 11号库房   |  | 东北角摄像机  Owl    █在线    |  |
|                  |  +---------------------------------+  |
|  [+新建区域]     |                                       |
+------------------+---------------------------------------+

4.2 前端文件

web.vite/src/views/warehouse/DeviceManager/
├── index.vue                  # 主页面
├── components/
│   ├── RegionTree.vue         # el-tree 区域树
│   ├── DeviceTable.vue        # el-table 可展开行
│   ├── DeviceEditDialog.vue   # 编辑弹框
│   ├── MapBindingPanel.vue    # 地图绑定面板
│   ├── VideoDeviceActions.vue # 视频按钮组
│   └── IoTDeviceActions.vue   # IoT按钮组
└── api/deviceManager.js

4.3 后端 API

接口 说明
GET /api/DeviceManager/GetRegionTree 区域树+设备数量
GET /api/DeviceManager/GetDevicesByRegion 区域设备列表(含子设备)
PUT /api/DeviceManager/{deviceId} 更新设备(含地图绑定)
POST /api/DeviceManager/SyncFromGateway 手动同步

4.4 操作按钮矩阵

Category 按钮
1-视频 实时预览/云台控制/查看回放/获取快照/同步通道
2-IoT 查看实时数据/设备控制/刷新点位/查看告警
3-门禁 远程开门/查看记录/查看告警
4-道闸 抬杆/落杆/查看记录

五、同步策略

MC4.0 → 区域树+设备

  • type=1 节点 → 名称匹配 warehouse_regions → 绑区或新建
  • type=2 节点 → Upsert Base_Device, RegionId=叶子区域, GatewayNodeId=当前网关
  • 模式: FullReplace, 频率限制: 2次/秒

Owl → 设备

  • GET /devices → Upsert Base_Device (Category=1, IsParent=1)
  • GET /channels → Upsert Base_Device (ParentDeviceId=NVR)
  • Owl 无区域概念 → RegionId=NULL, 管理员手动分配
  • 模式: Merge

反方向写回

操作 Owl MC4.0
设备改名 PUT /devices/:id
告警确认 ⚠️
设备控制 PTZ 点位写值

六、部署拓扑

Docker: Owl+ZLM (:80)    MC4.0-1 (:3000)   MC4.0-2 (:3000)
         |                      |                   |
         +----------+-----------+-------------------+
                    |
         +----------+-----------+
         |  Gateway gw-31ku     |    Gateway gw-11ku
         |    :5100              |      :5101
         +----------+-----------+
                    |
         +----------+-----------+
         |   VolPro.WebApi      |
         |      :9100           |
         |   MySQL / Redis       |
         +----------+-----------+
                    |
     +--------------+---------------+
     | web.vite :9000   warehouse :9200 |
     +--------------------------------+

七、实施路线

阶段 工期 内容
Phase 0 Day 1-2 Gateway骨架 + 8张表建表 + 代码生成
Phase 1 Day 3-6 OwlAdapter + 管理端视频设备页
Phase 2 Day 7-11 Mc4Adapter + IoT管理 + 区域树匹配 + SignalR
Phase 3 Day 12-17 warehouse端改造 + 全链路联调
Phase 4 Day 18-20 验证 + 缓冲

总计: 18-20 个工作日


八、新增整合流程

以接入「海康门禁」为例:

  1. 新建 IntegrationGateway.Adapters.HikvisionAccess 项目
  2. 实现 IHasFlatDevices + IHasAlarms
  3. 注册到 Host → 网关启动时自动上报到 Vol.Pro
  4. 前端新增 AccessDeviceActions.vue (~80行)
  5. Vol.Pro 后端零改动 总工作量: 1-2 天

九、代码组织规范

代码类型 路径 被覆盖?
第三方对接 gateway/
扩展Controller Controllers/*/Partial/
Entity扩展 DomainModels/*/partial/
前端业务逻辑 extension/warehouse/*.jsx
自定义页面 views/warehouse/DeviceManager/
自动生成代码 生成器默认路径

取代: V1.0 系列所有整合方案文档