设备数据模型(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.godevices.Devices 执行 AutoMigrateServiceContext 注入 DevicesModel
RPC / db 服务 core/app/sev/db/internal/logic/deviceservice/device_* 系列逻辑(列表、创建、更新、删除、Upsert、在线状态、按协议聚合统计等)操作 DevicesModeldevices.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-devicesTableName() 返回值)。

字段 含义 说明
id 主键 自增。
name 设备名称 展示与检索。
label 自定义标签 varchar。
accessProtocol 接入协议 14:流媒体源、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.SubSubscription 结构体)。
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. ItemDevices 的字段对应

Itemdata.go 中定义:

  • 内嵌 *Devices:标量字段的 JSON 与 Devices 一致(含 subscription 字符串字段的直接序列化;同时 Sub 为解析后的布尔子项)。
  • SubSubscription 结构体,由 Devices.ConvSubscription(subscription) 从四位字符串解析,JSON 字段名为 sub
  • MSIds:API 为 []uint64;落库为 msIds JSON 字符串。
  • ChannelFilters:API 为 []string;落库为 channelFilters JSON 字符串。
  • DepIds:API 为 []uint64;落库为 depIds JSON 字符串。
  • UseDBCachejson:"-"

更新场景下,CheckMap 校验列名属于 variables.Columns,并对 msIdsdepIdschannelFilters 做类型校验与 JSON 字符串化。 subscriptionColumns 中可按字符串整体更新;若要同时暴露结构化 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"。另有 AccessProtocolsMediaTransModeMapsBitstreamIndexesChannelFilters 等常量映射表,服务于协议展示、信令与过滤含义说明,不是表列名。


5. 行为与联调注意点

  • 缓存Devices.UseCache() 开启内存缓存(前缀为表名,约 60 秒);排障时注意缓存滞后。
  • 唯一性deviceUniqueId 为设备侧全局业务主键;通道、流媒体路由、统计等多处依赖该字符串。
  • Item.TransportProtocol():由 mediaTransModebitstreamIndex 推导 UDP/TCP 主动被动等播放/建联参数,供设备服务与拉流逻辑使用。
  • 与通道联动:删除设备时通常批量删除其下通道;channelFilters 与国标目录类型过滤、通道删除条件(通道包中的 DeleteWithChannelFilters)在同一业务域内配合使用。
  • 部门proc 等逻辑可能根据通道 depIds 批量回写设备 depIds,联调部门权限时需设备与通道两侧数据一起看。

6. 相关代码路径

  • 模型包:core/repositories/models/devices/
  • DB 迁移与模型注入:core/app/sev/db/internal/svc/init_database.goservice_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.gortsp_stream_groups_logic.gomedia_servers_with_channel_ids_logic.go
  • 与通道、部门同步:core/app/sev/db/internal/svc/proc.go
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐