SkeyeVSS开发笔记-设备数据模型
设备数据模型(core/repositories/models/devices)
本文说明 接入设备(流媒体源、RTMP、ONVIF、GB28181、EHOME 等) core/repositories/models/devices 包中的职责、与项目各层的对接方式,以及字段含义与 API/库形态对应关系。
项目源码地址 https://github.com/openskeye/go-vss
姊妹篇:7.2 通道数据模型(channels)、7.0 组织部门数据模型(departments,与本文 depIds 对应)。
1. 在项目中承担的作用
该模型描述 平台接入设备 的核心实体:数据落在表 sk-devices,通过统一 ORM 接入 db 服务。设备 deviceUniqueId 在表内唯一,是 通道表 sk-channels 的外键语义关联字段。设备上还维护 接入协议、信令/流媒体参数、订阅位、媒体服务器列表、通道过滤规则、部门归属 等,支撑注册、保活、拉流、统计与后台管理。
| 层级 | 作用 |
|---|---|
| 数据层 | core/app/sev/db/internal/svc/init_database.go 对 devices.Devices 执行 AutoMigrate;ServiceContext 注入 DevicesModel。 |
| RPC / db 服务 | core/app/sev/db/internal/logic/deviceservice/ 下 device_* 系列逻辑(列表、创建、更新、删除、Upsert、在线状态、按协议聚合统计等)操作 DevicesModel 与 devices.Item。 |
| HTTP / backend | core/app/sev/backend/internal/handler/device/items(/device/item 等)及 handler/videos/devices(录像相关设备列表)等,经 RPC 访问 db 服务。 |
| 与其它模型 | Channels 通过 deviceUniqueId 归属本设备;depIds 为部门 id 数组(库内 JSON 字符串),与组织机构表对应;channelFilters 存放通道类型/业务过滤串(如国标目录中某类节点的编码前缀),与 variables.ChannelFilters 说明配套使用。 |
设备是 通道的父级接入实体:协议与连接参数在设备上配置,具体监控点位与目录行在通道表展开。
2. 表与字段:数据库列 ↔ Go ↔ JSON
实体 Devices 映射表 sk-devices(TableName() 返回值)。
| 字段 | 含义 | 说明 |
|---|---|---|
id |
主键 | 自增。 |
name |
设备名称 | 展示与检索。 |
label |
自定义标签 | varchar。 |
accessProtocol |
接入协议 | 1~4:流媒体源、RTMP、ONVIF、GB28181与 variables.AccessProtocols 一致)。 |
deviceUniqueId |
设备业务唯一 ID | CHAR(70),唯一索引;通道表引用此字段。 |
originalDeviceUniqueId |
平台原始设备 ID | 对接侧原始编码。 |
state |
启用状态 | 0 未启用,1 启用。 |
online |
在线状态 | 0 不在线,1 在线。 |
expire |
注册到期时间 | 秒级时间戳。 |
sourceType |
来源 | 0 主动注册,1 后台添加。 |
address |
接入地址 | 如 UDP://ip:port。 |
mediaTransMode |
流媒体传输模式 | UDP 被动 / TCP 被动 / TCP 主动(与 MediaTransModeMaps 对应)。 |
username / password |
设备登录凭据 | 敏感字段,接口层需按安全规范处理。 |
streamUrl |
码流接入 URL | 流媒体源等类型使用。 |
channelCount |
通道数量 | |
smsIP |
推流目标流媒体 IP | 空则用全局/本地流媒体配置。 |
clusterServerId |
集群服务器 ID | 预留。 |
manufacturerId |
厂商字典 id | 关联厂商表。 |
modelVersion |
型号与版本 | 文本描述。 |
subscription |
订阅开关位 | CHAR(4) 四位 0/1,依次表示目录 / 报警 / 位置 / PTZ;ConvToItem 解析为 Item.Sub(Subscription 结构体)。 |
msIds |
媒体服务器 id 列表 | 库内 JSON 数组字符串;Item.MSIds 为 []uint64。 |
channelFilters |
通道过滤列表 | 库内 JSON 字符串数组;Item.ChannelFilters 为 []string(如国标Catalog 中某类编码前缀,见 ChannelFilters 映射说明)。 |
depIds |
部门 id 集合 | 库内 JSON 数组字符串;Item.DepIds 为 []uint64。 |
bitstreamIndex |
码流索引 | 与 BitstreamIndexes 等映射配合,用于取主/子码流参数。 |
offlineAt |
下线时间 | 毫秒时间戳。 |
onlineAt |
上线时间 | 毫秒时间戳。 |
keepaliveAt |
心跳时间 | 毫秒时间戳。 |
registerAt |
最后注册时间 | 毫秒时间戳。 |
createdAt / updatedAt |
创建 / 更新时间 | 毫秒时间戳;Correction / CorrectionMap 维护。 |
onvifManualOperationState |
ONVIF 是否手动录入 | gorm:"-",不落库,仅请求/响应过程使用。 |
3. Item 与 Devices 的字段对应
Item 在 data.go 中定义:
- 内嵌
*Devices:标量字段的 JSON 与Devices一致(含subscription字符串字段的直接序列化;同时Sub为解析后的布尔子项)。 Sub:Subscription结构体,由Devices.ConvSubscription(subscription)从四位字符串解析,JSON 字段名为sub。MSIds:API 为[]uint64;落库为msIdsJSON 字符串。ChannelFilters:API 为[]string;落库为channelFiltersJSON 字符串。DepIds:API 为[]uint64;落库为depIdsJSON 字符串。UseDBCache:json:"-"。
更新场景下,CheckMap 校验列名属于 variables.Columns,并对 msIds、depIds、channelFilters 做类型校验与 JSON 字符串化。 subscription 在 Columns 中可按字符串整体更新;若要同时暴露结构化 sub,需业务层约定是否只读解析或双写。
4. 列名常量(variables.go)
| 常量 | 数据库列 |
|---|---|
ColumnID |
id |
ColumnName |
name |
ColumnLabel |
label |
ColumnAccessProtocol |
accessProtocol |
ColumnBitstreamIndex |
bitstreamIndex |
ColumnDeviceUniqueId |
deviceUniqueId |
ColumnOriginalDeviceUniqueId |
originalDeviceUniqueId |
ColumnState |
state |
ColumnOnline |
online |
ColumnExpire |
expire |
ColumnAddress |
address |
ColumnMediaTransMode |
mediaTransMode |
ColumnUsername |
username |
ColumnPassword |
password |
ColumnStreamUrl |
streamUrl |
ColumnChannelCount |
channelCount |
ColumnSmsIP |
smsIP |
ColumnClusterServerId |
clusterServerId |
ColumnManufacturerId |
manufacturerId |
ColumnModelVersion |
modelVersion |
ColumnSubscription |
subscription |
ColumnSourceType |
sourceType |
ColumnMSIds |
msIds |
ColumnChannelFilters |
channelFilters |
ColumnDepIds |
depIds |
ColumnOfflineAt |
offlineAt |
ColumnOnlineAt |
onlineAt |
ColumnRegisterAt |
registerAt |
ColumnKeepaliveAt |
keepaliveAt |
ColumnCreatedAt |
createdAt |
ColumnUpdatedAt |
updatedAt |
PrimaryId 为 "id"。另有 AccessProtocols、MediaTransModeMaps、BitstreamIndexes、ChannelFilters 等常量映射表,服务于协议展示、信令与过滤含义说明,不是表列名。
5. 行为与联调注意点
- 缓存:
Devices.UseCache()开启内存缓存(前缀为表名,约 60 秒);排障时注意缓存滞后。 - 唯一性:
deviceUniqueId为设备侧全局业务主键;通道、流媒体路由、统计等多处依赖该字符串。 Item.TransportProtocol():由mediaTransMode、bitstreamIndex推导 UDP/TCP 主动被动等播放/建联参数,供设备服务与拉流逻辑使用。- 与通道联动:删除设备时通常批量删除其下通道;
channelFilters与国标目录类型过滤、通道删除条件(通道包中的DeleteWithChannelFilters)在同一业务域内配合使用。 - 部门:
proc等逻辑可能根据通道depIds批量回写设备depIds,联调部门权限时需设备与通道两侧数据一起看。
6. 相关代码路径
- 模型包:
core/repositories/models/devices/ - DB 迁移与模型注入:
core/app/sev/db/internal/svc/init_database.go、service_context.go - 设备 RPC 逻辑:
core/app/sev/db/internal/logic/deviceservice/device_*.go - HTTP 处理器:
core/app/sev/backend/internal/handler/device/items/、handler/videos/devices/ - 在线与流媒体辅助:
core/app/sev/db/internal/logic/deviceservice/online_state_logic.go、rtsp_stream_groups_logic.go、media_servers_with_channel_ids_logic.go - 与通道、部门同步:
core/app/sev/db/internal/svc/proc.go
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)