-
服务端源代码 github.com/gowvp/gb28181
-
前端源代码 github.com/gowvp/gb28181_web
介绍
go wvp 是 Go 语言实现的开源 GB28181 解决方案,基于GB28181-2022标准实现的网络视频平台,支持 rtmp/rtsp,客户端支持网页版本和安卓 App。支持rtsp/rtmp等视频流转发到国标平台,支持rtsp/rtmp等推流转发到国标平台。
技术栈
Golang v1.23, Goweb v1.x, Gin v1.10, Gorm v1.25 …
React 19, Vite 6.x, Typescript, React-Router v7, React-Query v5, shadcn/ui …
国标开发速知速会
GB/T 28181 是我国在安防视频监控领域的一项重要国家标准。
标准定义
GB/T 28181 全称为《安全防范视频监控联网系统信息传输、交换、控制技术要求》。它规定了安全防范视频监控联网系统中信息传输、交换、控制的互联结构、通信协议结构,以及传输、交换、控制的基本要求和安全性要求,明确了控制、传输流程和协议接口等技术要求,目的是规范视频监控联网系统,实现不同厂商设备和系统的互联互通与互操作。
发展历程
- 2011 年:推出 GB/T 28181-2011 版本,为安防行业的前端设备、平台服务器、平台客户端等安防产品的建设部署提供了基础标准。
- 2016 年:第一次修订,推出 GB/T 28181-2016 版本,进一步细化和完善了视频监控设备之间的通信协议规范。
- 2022 年:第二次修订,推出 GB/T 28181-2022 版本,于2023年7月1日实施,用于替代 GB/T 28181 - 2016 版本。此版本最新,相关实现的摄像机/NVR 等也较少。
Go WVP 基于最新标准 GB/T 28181 - 2022 开发,以为简称 GB28181。
一个最简单的监控域长这样,采集设备通过 SIP 信令注册到 GB28181 平台,
SIP 全称是 Session Initiation Protocol (会话初始协议),是一种应用层的信令控制协议。
SIP 协议由 IETF(互联网工程任务组)制定,用于创建、修改和终止多媒体会话,如语音通话、视频会议、即时消息等。它借鉴了 HTTP 和 SMTP 等协议的设计理念,具有文本格式、简单灵活等特点。
在 IP 电话、视频会议系统、即时通讯软件、在线游戏等多种实时通信应用中广泛应用。
在 GB/T 28181 标准中,SIP 协议被用作信令控制的基础协议,用于实现视频监控联网系统中设备之间的注册、会话建立、控制命令传输等功能。通过对 SIP 协议进行定制和扩展,GB/T 28181 规定了符合安防视频监控领域需求的信令流程和消息格式,使得不同厂商的视频监控设备能够基于 SIP 协议进行标准化的通信和互操作。
SIP 协议中的请求消息由请求行、消息头字段、消息体(可选)三部分组成,每部分都有特定的格式和功能。
SIP 报文
以为是 GB28181 注册的报文。
REGISTER sip:34020000002000000001@3402000000 SIP/2.0
Message Header
Via: SIP/2.0/TCP 192.168.10.9:41607;rport;branch=z9hG4bK67a61cd2
From: <sip:34020000001110000005@3402000000>;tag=7bebef2f
To: <sip:34020000001110000005@3402000000>
Contact: <sip:34020000001110000005@192.168.10.9:41607>
Call-ID: 41F04E9D7137EFA1@192.168.10.9
CSeq: 1 REGISTER
Max-Forwards: 70
Expires: 360
X-GB-Ver: 3.0
Content-Length: 0
请求行
REGISTER sip:34020000002000000001@3402000000 SIP/2.0
用于标识请求的类型,格式为 <请求方法> <请求 URI> <SIP 版本>。
- 请求方法:在 HTTP 协议中 Request Method 有
POST
,GET
,DELETE
,PUT
等等,而 GB28181 中常用的是REGISTER
,INVITE
,ACK
,MESSAGE
,INFO
,NOTIFY
等等。 - 请求 URI:指定请求的目标地址。
- SIP 版本:一般为
SIP/2.0
,表示使用的 SIP 协议版本。
消息头
通用头字段
- Via: 用于记录请求消息经过的路径,包含发送方的地址和端口等信息,例如
Via: SIP/2.0/TCP 192.168.10.9:41607;rport;branch=z9hG4bK67a61cd2
。 - Max-Forwards:指定请求消息在被丢弃之前可以经过的最大跳数,每经过一个服务器,该值减 1。如:
Max-Forwards: 70
。
请求头字段
- From:标识请求的发起者,包含发起方的 SIP 地址和显示名称等信息。例如:
<sip:34020000001110000005@3402000000>;tag=7bebef2f
,其中tag
用于标识本次请求的唯一性。 - To:指定请求的接收者,包含接收方的 SIP 地址和显示名称等。如:
To: <sip:34020000001110000005@3402000000>
。 - Contact:用于告知接收方,期望接收响应的地址和端口等信息。例如:
Contact: <sip:34020000001110000005@192.168.10.9:41607>
。 - Call-ID:用于标识一个呼叫会话,在整个会话过程中,所有与该会话相关的请求和响应消息都具有相同的
Call-ID
。例如:Call-ID: 41F04E9D7137EFA1@192.168.10.9
。 - CSeq:用于标识请求的顺序和类型,由一个序列号和请求方法组成。如:
CSeq: 1 REGISTER
,表示这是一个REGISTER
请求,序列号为 1。 - User-Agent: 用于标识身份,例如
GoWVP v0.0.1
标识这个开源项目的 v0.0.1 版本。
消息体头字段
- Content-Type:指示消息体的媒体类型,如
Content-Type: application/sdp
表示消息体包含 SDP(会话描述协议)信息。 - Content-Length:表示消息体的长度,以字节为单位。例如:
Content-Length: 0
表示没有消息体。
GB28181 头字段
- Expires: 用于表示注册的过期时间,0 表示注销,>0 表示多少秒以内有效,例如
Expires: 360
表示从注册时间开始 360 秒以内有效。 - X-GB-Ver: 用于标识 GB28181 实现的协议版本,是 2022 版本中新增的参数,
X-GB-Ver: 3.0
表示 GB/T 28181-2022,在 GoWVP 开发中,我们需要借助此标识,支持 2022 的设备更多功能,如果是旧版本不支持 2022 的特性给出对应错误提示。
消息体
根据 Content-Type 的定义,可能是 xml
,sdp
,manscdp
等等,根据实际报文解析出内容即可。
国标注册
- 注册和注销应进行认证,认证方式应支持 Digest (数字摘要认证),高安全级别的宜支持数字证书的认证方式。
- 注册成功后,在注册过期时间到来之前,应刷新注册,刷新注册流程与首次注册流程一致。
- 注册失败后,应间隔一定时间后继续发起注册,gowvp 的国标级联设计是间隔 10s。
- 注册与上一次注册时间间隔应可调,一般情况不应短于 60s,知名摄像头的设计都是间隔默认 1 小时,即 3600s,可提前 10 秒发出消息,避免对端超时过期。
- 注册成功则认为在线状态,注册失败或注册时间过期则认为离线状态。
- 对于开启网络地址转换 (NAT) 功能的路由器内测的 SIP 代理,宜支持 TCP 发送 sip 注册,注册成功后,保持长连接,信令部分依然按照上面的要求,多一条 tcp 通道断开则认为离线。
注册的源代码都在这里,没有太多好说的,姊妹篇是 [GB28181 七种注册姿势]。
有兴趣的话可以打开 github 看看源代码,再顺手点个 star ?