核心概念
本文定位
逐节厘清国标监控的核心概念——按"业务含义 → 技术要点 → 对接落点"的次序展开。本章是理解整套模型的基础,读通之后,后续的协议、配置与操作各章都能与此处的概念一一对应。
一、概念全景
国标监控的对象有一条清晰主干——平台 → 设备 → 通道 → 流会话(下图粗箭头,层层包含),其余能力则分别挂载在主干的某个对象上(细线分挂)。理解了这张图,整套模型的脉络便清晰可循。
主干是"包含"关系:一个平台含多台设备、一台设备含多路通道、一路通道可发起多次流会话;媒体节点 / 级联挂在平台,订阅 / 设备日志挂在设备,分组 / 录像 / 抓图 / 预置位挂在通道。各对象的字段与状态机详见下文分节。
下表按"是什么"维度速览全部对象的核心定位,作为后续分节的索引:
| 概念 | 核心定位 |
|---|---|
| 平台 | 一个租户的国标接入门户(身份 + 准入策略) |
| 设备 | 一台物理国标硬件(IPC / NVR / 编码器) |
| 通道 | 设备里的"一路画面"——点播/回放/抓图的真正对象 |
| 媒体节点 | 干转流的 ZLM 实例(收 RTP、发 FLV) |
| 信令节点 | 承载 SIP 信令接入的 blade-server 进程,设备按其地址注册、它即该设备属主 |
| 流会话 | 一次"看视频"的运行实例(绑定 SSRC、有状态机) |
| 分组 | 把通道按行政区划/业务归类的树 |
| 订阅 | 让设备主动推送目录/告警/位置变化 |
| 级联 | 把本平台当下级,接到上级国标平台 |
| 录像计划/档案/下载 | 定时录 / 录完的归档 / 用户点下载 |
| 抓图 / 预置位 | 单帧截图 / 云台记忆点 |
| 视频墙看板 | 多格分屏实时监控页,布局以 JSON 存 iot_vms_live、按用户私有 |
| 设备日志 | 设备上行 Alarm 落库 iot_vms_alarm,按设备/方式/级别/时段查询 |
| 设备地图 | 设备地图打点 + Redis GEO 半径/近邻检索(按租户隔离) |
信令面 vs 媒体面——理解所有概念的总框架
上面这些概念可归入两个互不混用的"面":
- 信令面(走 SIP)——传"控制与元数据":平台、设备、通道目录、订阅、级联,以及 PTZ / 告警 / GPS / 校时。数据量小,本质是"命令"。
- 媒体面(走 ZLM)——传"画面本身":流会话、媒体节点、抓图、录像。设备推流进、浏览器拉流出。
SIP 负责"指挥",ZLM 负责"搬运视频",平台是两头的总调度。 通道很特殊:它的"目录信息"由信令面同步而来,它的"画面"在媒体面取——所以通道是设备目录的产物,但点视频用的是 channelId。
二、平台(Platform)
是什么 —— 一个租户在国标体系里的"门牌号 + 门禁规则"。每个租户对应一条平台配置。
含义(为什么) —— 国标设备要接入,必须知道"往哪个平台注册"。平台记录了这个身份(server-id / domain)和接入口令(password)、准入策略(register-mode)。多租户不是靠多个端口区分,而是靠 server-id:所有租户共用全局一个 5060 端口,设备报文里的 server-id 决定它属于哪个租户。
技术 —— iot_vms_platform,一租户一条;signal_node_id 绑定一个信令节点,SIP 接入地址 / 端口 / 传输 / 字符集 / 注册有效期 / 心跳间隔均按所绑节点自报值只读回填,不再是平台自身字段。注册模式 AUTO/MANUAL 决定陌生设备是否放行。
对接 —— POST /platform/submit 配置;GET /platform/sip-info 回填监听信息。详见 配置详解 §2;页面操作见 国标平台。
三、设备(Device)
是什么 —— 一台真实的国标硬件:网络摄像机(IPC)、硬盘录像机(NVR)、视频编码器等。
含义(为什么) —— 设备是"会自己上线"的主体:它主动向平台 REGISTER、周期发心跳,在线/离线由它驱动。平台不主动连设备,而是等设备来注册。设备可配独立密码覆盖平台默认密码,实现"一机一密"。
技术 —— iot_vms_device;online_status=ONLINE/OFFLINE 由 REGISTER + 心跳超时驱动;Digest 鉴权(qop=auth 自动适配)。
对接 —— 自动接入只需设备端填 SIP 参数;手动注册(MANUAL)需先在 POST /device/save 登记白名单。
四、通道(Channel)⭐
是什么 —— 设备下的一路视频流,也是点播、回放、抓图等一切视频操作真正作用的对象。
含义(为什么)——这是最容易被忽略的关键概念:
- 设备 ≠ 通道。一台 IPC 通常就 1 路画面 = 1 设备 1 通道;但一台 NVR 挂 16 个摄像头 = 1 设备 16 通道。所以平台把"设备"和"通道"拆成两层:设备负责接入与在线,通道负责承载具体画面。
- 几乎所有视频操作的入参都是
channelId而非deviceId:点播、回放、抓图、PTZ、录像计划——都作用在通道上。简言之,设备回答"谁接入了",通道回答"取哪一路"。 - 通道有自己的在线状态(
ON/OFF),与设备在线相互独立:NVR 在线但某一路摄像头掉线,是设备 ONLINE + 该通道 OFF。 - 云台能力、经纬度、厂商型号、主/子码流能力等业务属性都挂在通道上。
通道从哪来——不是手工建的:
通道由 Catalog(目录)同步从设备拉取落库;开了 CATALOG 订阅后,通道增删改还会增量推送(Event=ADD/DEL/UPDATE/ON/OFF)。所以接入设备后第一步往往是"同步目录",通道才会出现。
技术 —— iot_vms_channel;20 位国标编号(与设备编号同构,见 §十三);onlineStatus 把设备上报的 ONLINE/在线/1 归一为 ON;streamModeCount 标识是否支持子码流。
对接 —— GET /channel/list(分页查询)、/channel/list-by-device;点播 POST /stream/start?channelId=...;通道配置页支持批量分配业务分组。
设备与通道的核心区分
设备 = 接入单位(标识谁在线);通道 = 媒体单位(标识看哪一路)。 视频操作一律以 channelId 为入参。
五、媒体节点(MediaNode)
是什么 —— 专司"转流"的流媒体服务(ZLM)实例:接收设备的 RTP/PS 流,转换为浏览器可直接播放的 FLV/HLS/RTMP。
含义(为什么) —— 国标设备推送的是 RTP/PS 裸流,浏览器无法直接播放,中间需要一个媒体服务完成协议转换与分发。本平台将其设计为租户级、可多实例:每个租户配置自有节点,配置多个即自动组成负载集群,每路新流落到"并发最低"的节点——配几个节点即构成几节点的集群,无需集群开关。
技术 —— iot_vms_media_node(租户级,node_id 全局唯一须等于 ZLM mediaServerId);pickNode 选并发最低的启用节点,会话按 node_id 绑定后续一切回查同一节点;on_server_keepalive 心跳驱动在线状态。
收流端口模式(rtp_port) —— 节点用一个 rtp_port 字段决定收流方式,直接影响 Docker 放行策略:
| 模式 | 配置 | 行为 |
|---|---|---|
| 单端口 | rtp_port>0(须与 ZLM [rtp_proxy] port 一致) | 所有取流共用这一个固定端口,ZLM 按 SSRC 解复用建流;平台不再为每路流调 openRtpServer,直接复用常驻收流口,closeRtpServer 为空操作;Docker 仅需放行该端口 |
| 多端口 | rtp_port=0(默认) | 每路流由 openRtpServer 动态分配独立端口;Docker 需放行整个端口段 |
对接 —— 【媒体节点】页增删改;ZLM 侧配 mediaServerId + 4 个 hook。详见 配置详解 §三。
与信令节点的分工
媒体节点扩展的是「媒体面」(转流的 ZLM 集群),与之对应的「信令面」入口是信令节点——每个 blade-server 信令进程启动时自注册进 iot_vms_signal_node,设备按其对外 SIP 地址注册、该进程即设备属主。多实例分片部署时,点播/回放/云台等控制请求会路由到设备属主信令节点下发,媒体流仍由媒体节点按并发择优承载,两者各自独立水平扩展。详见 配置详解 §2 与操作侧 信令节点。
六、流会话(StreamSession)
是什么 —— 一次"看视频"的运行期实例。你每点开一路直播/回放,就产生一个流会话。
含义(为什么) —— 视频是有生命周期的:从"发起→等设备推流→播放中→关闭"。把这一次过程建模成会话,才能管住资源(SSRC、ZLM 端口),避免泄漏。会话绑定一个 SSRC(流的唯一身份)和一个媒体节点。
技术 —— iot_vms_stream_session;sessionType=invite/playback/cascade/record(record 为计划录制的独占会话,走 s=Play 新增流,不进实时点播复用池);完整状态机如下。
| 状态 | 含义 |
|---|---|
| WAITING | 已下发 INVITE,等待设备建立 RTP 流 |
| RUNNING | RTP 已到达媒体节点,WS-FLV/HLS/RTMP/WebRTC 拉流地址已就绪 |
| CLOSE_PENDING | 用户已停流,但底层关闭端口失败,等待重试任务收尾 |
| CLOSED | 正常终止,资源已释放 |
| EXPIRED | CLOSE_PENDING 重试耗尽(累积超 2h 或连续失败 ≥ 5 次)的终态,SQL 报表可识别长期失败会话 |
CLOSE_PENDING 设计动机
媒体节点关闭 RTP 端口可能因短暂网络不可达失败。直接置 CLOSED 会释放 SSRC,但底层端口仍占用,新的 INVITE 会因端口冲突失败。CLOSE_PENDING 是"延迟收尾"状态,后台每 5 分钟重试,成功后才释放 SSRC。关键防护:重试期间收到 Hook 关流通知必须忽略,避免提前释放 SSRC 让重试失去关联。
级联会话的"三路收敛"
本平台作为下级响应上级 INVITE 也产生流会话(sessionType=cascade、sipCallId 存上级 Call-ID)。关闭走三路任一:上级 BYE(按 Call-ID 反查)/ 下级断流(SSRC 反查 + 主动 stopSendRtp)/ ACK 超时 + GC 兜底(2h)。任一触发后另两路命中终态直接 no-op,保证幂等。
七、分组(Group)
是什么 —— 把通道归类的树。两种:行政区划(CIVIL) 与 业务分组(BUSINESS)。
含义(为什么) —— 几百路通道平铺无法管理。行政区划树按通道编号里的区划码自动建(无需人工);业务分组让管理员按"项目/楼栋/重点区域"自定义归类。一个通道可同时属于多个业务分组(多对多)。
技术 —— iot_vms_group 自关联树 + iot_vms_group_channel 多对多;CIVIL 由 Catalog 的 civilCode 自动建。
对接 —— GET /group/tree、POST /group/assign|unassign;通道配置页可批量挂载业务分组。
八、订阅(Subscription)
是什么 —— 让设备主动推送变化,而不是平台反复轮询。三种:目录 / 告警 / 位置。
含义(为什么) —— 轮询费流量又延迟高。订阅后设备在"通道变了/有告警/位置动了"时主动 NOTIFY,实时且省资源。订阅有有效期,平台自动续约,设备重连后自动重发,不依赖设备记忆。
| 订阅类型 | 用途 | NOTIFY 事件 |
|---|---|---|
| CATALOG | 通道增量变更 | ADD / DEL / UPDATE / ON / OFF / VLOST / DEFECT |
| ALARM | 设备告警事件 | 复用 Alarm Notify 报文格式 |
| POSITION | 移动设备 GPS 上报 | MobilePosition(经/纬/速/向/海拔) |
技术 —— iot_vms_subscription;平台周期扫描到期订阅自动续约,优先 in-dialog refresh(RFC 6665)、失败回退新建 SUBSCRIBE。续约时点与前瞻窗口参数见 通信协议 §3.2。
对接 —— POST /device/subscribe?type=CATALOG|ALARM|POSITION。
九、级联(Cascade)
是什么 —— 把本平台当作下级,注册到区/市级上级国标平台(如雪亮工程、公安专网)。
含义(为什么) —— 国标平台可层级组网:下级把自己的通道目录上报给上级,上级能跨级点播下级的摄像头。本平台支持作为下级:主动注册 + 心跳 + 响应上级的 Catalog 查询 / 订阅 / INVITE 被点播 / Control 转发 / BYE。
技术 —— iot_vms_cascade;cascadeStatus=REGISTERED/UNREGISTERED/FAILED;qop=auth 自动适配 + 401 复用 Call-ID;被点播会话走级联三路收敛(见 §六)。
对接 —— 【国标级联】页 POST /cascade/save|register|unregister。页面操作见 国标级联。
十、录像:计划 / 档案 / 下载
国标录像有两条相关但不同的链路,别混淆:
| 概念 | 是什么 | 触发 |
|---|---|---|
| 录像计划(RecordPlan) | "每周末 0-8 点录某通道"的定时任务定义 | cron 自动 |
| 录像档案(RecordArchive) | 录像计划每次执行产生的成品记录(关联 plan_id) | 计划触发后生成 |
| 录像下载(RecordDownload) | 用户手动"把某段历史录像下载存档"的任务 | 用户点击 |
含义(为什么) —— "计划"是规则,"档案"是规则跑出来的结果,"下载"是用户即时取证。三者都由 ZLM 录到自身磁盘、平台再经 HTTP 拉流直传 OSS(录像去本地化、无需共享卷),避免长录像阻塞线程。
技术 —— iot_vms_record_plan / record_archive / record_download;两阶段异步(同步起录 + 定时回调收尾);下载用国标 s=Download + a=downloadspeed 加速取流。
对接 —— POST /record/plan/save、/record/download;*/url 返回 OSS 外链。详见 运行流程 §三。
十一、抓图(Snapshot)与预置位(PtzPreset)
- 抓图 —— 单帧 jpeg。有流直接抓;无流自动开流→等就绪→抓→关流。存 OSS,默认 7 天过期。触发类型 MANUAL/ALARM/SCHEDULE。
- 预置位 —— 云台的"记忆点"(1-255)。set 记住当前位置、call 转过去、remove 删除;平台可缓存设备远程预置位列表。
十二、视频墙看板 / 设备日志 / 设备地图
围绕"看视频"主线之外,平台还提供三项面向使用与运维的能力,与前述核心对象解耦:
- 视频墙看板(MonitorBoard) —— 多格分屏(1 / 4 / 9 / 16)的实时监控页。看板布局(分屏数 + 各格绑定的通道)以 JSON 持久化到
iot_vms_live.config,按用户私有(create_user)保存与加载;后端只透传存取,布局 schema 由前端拥有。 - 设备日志(报警记录,Alarm) —— 设备经 GB28181 上行的 Alarm 报文落库自有表
iot_vms_alarm(报警方式 / 类型 / 子事件 / 级别 / 时间 / 经纬度 + 原始报文兜底),以"设备日志"形式按设备 / 告警方式 / 级别 / 时间段分页查询。与"订阅(§八)"的区别:订阅让设备主动推告警,报警记录是推上来后的落库与查看。 - 设备地图(DeviceMap) —— 设备坐标由人工在地图打点维护;近邻 / 半径范围检索走 Redis GEO(key 按租户隔离),与
iot/device设备地图同源;另提供"同步 / 清除 / 计数"管理该地理缓存生命周期。
十三、关键编码
SSRC 10 位编码(GB28181-2016 附录 D.3.1)
SSRC 是一路流的"身份证号",贯穿"取流建链 / Hook 反查 / 关流"。
ssrc(10位) = 前缀(1位) + 域标识(5位) + 序号(4位)
前缀: 0 = 实时点播 1 = 历史回放 / 下载
域标识: SIP 域(server-id)第 4-8 位
序号: 自增计数,触顶 9999 重置防串台:流释放后 30 秒进黑名单,新分配自动跳过;序号回绕后还会回查活动会话占用,避免与未释放的长寿命流撞同 SSRC;触顶兜底重试 100 次,失败抛异常防返回不安全 SSRC。
单端口模式下 SSRC 还是 ZLM 的解复用键:被动建流的媒体流名取自 RTP 头中 SSRC 的 8 位大写十六进制(如 0200000035 → 0BEBC223),平台按此还原成标准 10 位十进制 SSRC 反查会话——否则媒体已在流而会话卡在 WAITING。
国标设备/通道编号(GB28181-2016 §4.2)
设备与通道都是 20 位编号,同构:
34020000 00 132 0 000001
中心编码 行业 类型 网络 序号
(1-8) (9-10)(11-13)(14) (15-20)| 段 | 位 | 含义 |
|---|---|---|
| 中心编码 | 第 1-8 位 | 前 6 位为行政区划(如 3402=安徽合肥);分组树据此自动建 |
| 行业编码 | 第 9-10 位 | 公安 / 政务 / 民用等 |
| 设备类型 | 第 11-13 位 | 132=IPC 摄像机 / 118=NVR / 200=平台 |
| 网络标识 | 第 14 位 | 设备网络标识码 |
| 序号 | 第 15-20 位 | 同类型自增 |
十四、状态枚举速查
| 对象 | 字段 | 取值 |
|---|---|---|
| 设备 | onlineStatus | ONLINE / OFFLINE |
| 通道 | onlineStatus | ON / OFF(设备上报的 ONLINE/在线/1 归一为 ON) |
| 流会话 | sessionType | invite(点播)/ playback(回放)/ cascade(级联被点播)/ record(计划录制,独占会话不进点播复用池) |
| 流会话 | sessionStatus | WAITING / RUNNING / CLOSE_PENDING / CLOSED / EXPIRED |
| 录像下载 | taskStatus | PENDING / RECORDING / DONE / FAILED |
| 录像归档 | archiveStatus | RECORDING / DONE / FAILED |
| 订阅 | subscribeType / subStatus | CATALOG/ALARM/POSITION · ACTIVE/EXPIRED/FAILED/CANCELLED(CANCELLED=显式退订,上线不自动恢复) |
| 分组 | groupType | CIVIL(行政区划)/ BUSINESS(业务分组) |
| 级联 | cascadeStatus | REGISTERED / UNREGISTERED / FAILED |
| 平台 | registerMode | AUTO(自动接入)/ MANUAL(手动注册白名单) |
| 媒体节点 | enabled / online | 启用开关(选节点准入)/ 心跳在线(派生展示) |
| 抓图 | triggerType | MANUAL / ALARM / SCHEDULE |
