GB28181协议
GB28181协议会话通道实际上使用的是SIP协议,并且在SIP协议的基础之上做了些私有化处理。SIP是一个由IETF MMUSIC工作组开发的协议,作为标准被提议用于创建,修改和终止包括视频,语音,即时通信,在线游戏和虚拟现实等多种多媒体元素在内的交互式用户会话。SIP中一个比较重要的概念是用户代理(User Agent),指的是一个SIP逻辑网络端点,用于创建、发送、接收SIP消息并管理一个SIP会话。SIP用户代理又可分为用户代理客户端UAC(User Agent Client)和用户代理服务端UAS(User Agent Server)。UAC创建并发送SIP请求,UAS接收处理SIP请求,发送SIP响应。SIP协议会与许多其它的协议协同工作,如SIP报文内容发送会话描述协议(Session Description Protocol,SDP)4,SDP协议描述了会话所使用流媒体细节,如:使用哪个IP端口,采用哪种编解码器等等。SIP的一个典型用途是:SIP会话传输一些简单的经过报文的实时传输协议流,RTP本身才是语音或视频的载体。在GB28181协议中,联网系统在进行视音频传输及控制时应建立两个传输通道: 会话通道和媒体流通道。会话通道用于在设备之间建立会话并传输系统控制命令; 媒体流通道用于传输视音频数据, 经过压缩编码的视音频流采用流媒体协议RTP/RTCP传输。GB28181协议中具体通信协议结构图如下图所示:

GB28181 中 SIP 用到的核心能力
| SIP能力 | GB28181用途 |
|---|---|
| REGISTER | 设备注册 |
| MESSAGE | 心跳 / 目录 / 状态 / 控制 |
| INVITE | 实时预览 / 回放 |
| ACK | 确认媒体会话建立 |
| BYE | 结束预览 |
| CANCEL | 取消 INVITE |
| OPTIONS | 能力探测(部分平台) |
| 401/407 | Digest认证 |
| NOTIFY | 订阅通知(扩展/部分平台) |
REGISTER
注册流程
- SIP代理向SIP服务器发送Register(未鉴权)请求;
- SIP服务器向SIP代理发送响应401,并在响应的消息头WWW_Authenticate字段中给出适合SIP代理的认证体制和参数;
- SIP代理重新向SIP服务器发送REGISTER请求, 在请求的Authorization字段给出信任书,包含认证信息;
- SIP服务器对请求进行验证,如果检查出SIP代理身份合法,向SIP代理发送成功响应200OK,如果身份不合法则发送拒绝服务应答。
sequenceDiagram
participant Proxy as SIP代理
participant Server as SIP服务器
Proxy->>Server: 1. REGISTER
Server-->>Proxy: 2. 401 Unauthorized
Proxy->>Server: 3. REGISTER(携带认证信息)
Server-->>Proxy: 4. 200 OK
MESSAGE
当UA(User Agent)发现工作异常时, 应立即向本SIP监控域的SIP服务器发送状态信息; 无异常时,应定时向本SIP监控域的SIP服务器发送状态信息。状态信息报送采用IETF RFC3427中定义的方法MESSAGE实现。通过周期性的状态信息报送,实现注册服务器与源设备之间的状态检测即心跳机制。心跳发送方、接收方需统一配置“心跳间隔”参数,按照“心跳间隔”定时发送心跳消息,默认心跳间隔60s。心跳发送方、接收方需统一配置“心跳超时次数”参数,心跳消息连续超时达到“心跳超时次数”则认为对方下线,默认心跳超时次数3次。心跳接收方在心跳发送方上线状态下检测到心跳消息连续超时达到商定次数则认为心跳发送方离线; 心跳发送方在心跳接收方上线状态下检测到心跳消息响应消息连续超时达到商定次数则认为心跳接收方离线。
sequenceDiagram
participant Proxy as SIP代理
participant Server as SIP服务器
Proxy->>Server: 1. MESSAGE (状态信息报送)
Server->>Proxy: 2. 200 OK
SIP文本分析
REGISTER文本
SIP代理向SIP服务器发送:
1:REGISTER sip:41010500002000000001@192.168.10.27:8116 SIP/2.0
2:Via: SIP/2.0/UDP 192.168.2.179:5060;rport;branch=z9hG4bK1527517184
3:From: <sip:41010500001110000001@192.168.2.179:5060>;tag=1219350858
4:To: <sip:41010500001110000001@192.168.2.179:5060>
5:Call-ID: f3g4h51806249538@192.168.2.179
6:CSeq: 1 REGISTER
7:Contact: <sip:41010500001110000001@192.168.2.179:5060>
8:Max-Forwards: 70
9:User-Agent: VCP MWARE
10:Expires: 3600
RegMode: DEVICE;Describe=IPC2A5I-IR6-AUF40-B-DT;Register;DevVer=default
ReplaceDescribe: IPC2A5I-IR6-AUF40-B-DT;ProductId=defaultProductId;RegionCode=DT;Vendor=UNIVIEW;Resolve=HIC3MP;Ptzfg=0;;SnmpVer=v3
X-GB-Ver: 3.0
Ability: UCSStore=0
Content-Length: 0
**第一行:**REGISTER sip:41010500002000000001@192.168.10.27:8116 SIP/2.0
国标ID指的是由中心编码(8位) 、行业编码(2位) 、类型编码(3位)和序号(7位)四个码段共20位十进制数字字符构成
41010500 00 200 0000001是SIP服务器的国标ID ,SIP/2.0指的是SIP协议版本。
**第二行:**Via: SIP/2.0/UDP 192.168.2.179:5060;rport;branch=z9hG4bK327447864
Via头中包含了发送请求方的相关信息,后续需要使用这些信息进行回复。SIP/2.0/UDP表示使用的是2.0版本的SIP协议,使用的传输协议是UDP,也可以使用TCP协议。192.168.2.179:5060为请求发送方的IP地址和端口号,Via头中必须包含branch参数,具体值是一个在整个SIP通信过程中不重复的数值。branch是一个事务ID(Transaction ID),用于区分同一个UA所发起的不同Transaction,它不会对未来的request或者是response造成影响,对于遵循IETF RFC3261规范的实现,这个branch参数的值必须用”z9hG4bK”打头. 其它部分是对To, From, Call-ID头域和Request-URI按一定的算法加密后得到。rport字段表示使用rport机制路由响应,即发送的响应时,按照rport中的端口发送SIP响应,也就是说IP和端口均完全遵照从哪里来的,发回哪里去的原则,如果没有rport字段时,服务端的策略是IP使用UDP包中的地址,即从哪里来回哪里去,但是端口使用的是via中的端口,详情见IETF RFC35818。
**第三行:**From:<sip:41010500001110000001@192.168.2.179:5060>;tag=1219350858
From头中包含了请求发送方的逻辑标识,在GB28181协议中是发送请求的设备国标ID和域国标ID信息。tag参数是为了身份认证的,值为随机数字字符。
**第四行:**To: <sip:41010500001110000001@192.168.2.179:5060>
To头在SIP协议中是为了标明请求接收方的逻辑标识的,在GB28181协议中填写的是发送请求的设备国标ID和域国标ID信息。
**第五行:**Call-ID: f3g4h51806249538@192.168.2.179
Call-ID头是全局唯一的,在同一个session中保持一致,在不同session中不同
**第六行:**CSeq: 2 REGISTER
CSeq头又叫Command Seqence(命令队列),用于标识命令顺序,值为序号+Method,序号部分为无符号整数,最大值为2^31。序号起始值是随机的,后续在同一个session中依次递增,比如发1 REGISTER没返回—>再发2 REGISTER—>没返回—>再发3 REGISTER—>这时返回了2 REGISTER就知道是第2个请求得到了响应。对于ACK和CANCLE中的CSeq与INVITE中的Cseq保持一致。
**第七行:**Contact: <sip:41010500001110000001@192.168.2.179:5060>
Contact头包含源的URI信息,用来给响应消息直接和源建立连接用。在GB28181协议中为SIP设备编码@源IP地址端口。
**第八行:**Forwards: 70
Max-Forwards头用于设置包最大中转次数,默认是70。(宇视的是Forwards)
**第九行:**User-Agent: VCP MWARE
User-Agent头用于设置关于UA的信息,用户可以自定义
**第十行:**Expires: 3600
Expires头表示超时时间
**第11行:**Content-Length: 0
Content-Length头,Content-Length头表示SDP消息的长度,因为REGISTER消息不需要SDP,因此为0。
MESSAGE文本
MESSAGE消息头 Content-type 头为 Content-type: Application/MANSCDP+xml。状态信息报送命令采用MANSCDP(监控报警联网系统控制描述协议,Monitoringand Alarming Network System Control Description Protocol)协议格式定义, 详细描述见GB/T 28181—2016中A.2.5状态信息报送。状态信息报送命令应包括命令类型(CmdType)、设备/系统编码(DeviceID)、是否正常工作(Status)等, 采用MESSAGE方法的消息体携带。Message消息的成功和错误应答均无消息体,Message回复消息内容范例如下:
MESSAGE sip:41010500001110000001@192.168.2.179:5060 SIP/2.0
Call-ID: b6e51d3973e35d9a21a3a324789e3ebd@192.168.10.27
CSeq: 2 MESSAGE
From: <sip:41010500002000000001@4101050000>;tag=ac22a981778c40849a827b1e0246715f
To: <sip:41010500001110000001@192.168.2.179:5060>
Via: SIP/2.0/UDP 192.168.10.27:8116;branch=z9hG4bK3242685359;rport
Max-Forwards: 70
User-Agent: WVP-Pro v2.7.4.2026-06-02T16:15:21+08:00
Content-Type: Application/MANSCDP+xml
Content-Length: 151
<?xml version="1.0" encoding="GB2312"?>
<Query>
<CmdType>DeviceInfo</CmdType>
<SN>353602</SN>
<DeviceID>41010500001110000001</DeviceID>
</Query>
NVR 作为视频代理网关
- 对内(局域网):它管理着一大堆摄像头
- 对外(国标网):它把自己伪装成一个“大号的摄像头客户端”注册到 WVP 平台。
sequenceDiagram
autonumber
participant Receiver as Web前端
participant SIP_Server as SIP服务器
participant Media_Server as 媒体服务器
participant Sender as 媒体流发送者
Receiver->>SIP_Server: Invite (携带SDP消息体)
SIP_Server->>Media_Server: Invite
Media_Server-->>SIP_Server: 200 OK (携带SDP消息体)
SIP_Server->>Sender: Invite (携带SDP消息体)
Sender-->>SIP_Server: 200 OK (携带SDP消息体)
SIP_Server->>Media_Server: ACK (携带SDP消息体)
SIP_Server->>Sender: ACK
note over Sender, Media_Server: 【第一阶段】实时媒体流 (IPC/NVR -> ZLM)
Sender-->>Media_Server: 实时媒体流
SIP_Server->>Media_Server: Invite (携带SDP消息体)
Media_Server-->>SIP_Server: 200 OK (携带SDP消息体)
SIP_Server-->>Receiver: 200 OK (携带SDP消息体)
Receiver->>SIP_Server: ACK
SIP_Server->>Media_Server: ACK
note over Media_Server, Receiver: 【第二阶段】实时媒体流 (ZLM -> 前端播放器)
Media_Server-->>Receiver: 实时媒体流
note over Receiver, Sender: 【停止播放阶段】释放呼叫流程
Receiver->>SIP_Server: BYE
SIP_Server-->>Receiver: 200 OK
SIP_Server->>Media_Server: BYE
Media_Server-->>SIP_Server: 200 OK
SIP_Server->>Media_Server: BYE
Media_Server-->>SIP_Server: 200 OK
SIP_Server->>Sender: BYE
Sender-->>SIP_Server: 200 OK