1.1 GB28181简介
GB/T28181《安全防范视频监控联网系统信息传输、交换、控制技术要求》是由公安部科技信息化局提出,由全国安全防范报警系统标准化技术委员会_百度百科(SAC/TC100)归口,公安部一所等多家单位共同起草_百度百科的一部国家标准。目前更新到GB/T28181-2016。
该标准规定了城市监控报警联网系统中信息传输_百度百科、交换、控制的互联结构、通信协议结构,传输、交换、控制的基本要求和安全性要求,以及控制、传输流程和协议接口等技术要求。该标准适用于安全防范监控报警联网系统的方案设计、系统检测、验收以及与之相关的设备研发、生产,其他信息系统可参考采用。
(注:关于GB28181的详细功能和交互流程请查看国标文档,本文档仅对NVR项目组28181功能开发过程中涉及到的流程和问题进行归纳和总结)
GB28181的服务器可使用网上的开源服务器 LiveGBS,该软件可免费使用,有效期30天,该软件到期后,从网站上重新下载即可再次使用。该网站有安装使用和常见问题说明,此处不再赘述,软件的链接如下:
LiveGBS GB28181流媒体服务 | 青柿视频流媒体服务解决方案
(注:关于GB28181的本地服务器的使用和平台对接请查看文档“28181平台对接使用说明”)
1.2 SIP简介
GB28181协议会话通道使用的是SIP协议,在SIP协议基础上做了私有化处理
SIP协议,英文为 Session Initiation Protocol, 中文翻译为会话发起协议。顾名思义,就是在网络上发起会话。
1.2.1 SIP账号
会话双方需要有一个SIP账号,也称为URI,例:sip:peter@company.com:5060
其中:
(1) sip: 表示采用sip协议
(2) peter是用户名, 也称为帐号. 用字母和数字均可。
(3) company.com 是帐号所属的服务器域名( 也可以用IP地址,例如: sip:peter@192.168.1.100)
(4) 最后的5060是端口号。 SIP协议默认端口为5060, 默认采用UDP传输
:5060的意思是,客户端在名为 company.com的服务器的5060端口号上等待对方连接
如果端口号是 5060,也可以省略不写。
则,上述SIP帐号写为: sip: peter@company.com
除了sip:这几个字母, SIP帐号就像一个邮件帐号
没错,SIP协议设计者的意图就是让SIP帐号与邮件帐号一致,方便与邮箱服务整合。
对用户来说方便,你要打电话给我,我的电话号就是邮箱号。
1.2.2 SIP消息
上面讲过,一个通话过程,两端要传递多种信号。在SIP协议中,这些信号是一种约定格式的IP数据包,称为SIP消息。
SIP消息有好几种,让我们看一个通话过程理解一下
1, 软电话A 向 B 发送一个 SIP消息 INVITE, 邀请B通话
2, 软电话B振铃,向A 回复一个SIP消息 RING, 通知 A 正在振铃中,请A等待
3, 软电话B提机,向A发一个SIP消息 OK, 通知 A 可以通话了
4, 软电话A 向 B 回复一个回应消息 ACK,正式启动通话
5,接下来,双方通话
6,软电话B挂机,向 A 发一个SIP消息 BYE, 通知 A 通话结束
7, 软电话A 向 B 回复一个消息 OK, 通话结束
SIP协议规定了会话的发起过程,但没有规定会话的内容及格式。会话内容可以是文本、语音、视频等。因此,SIP协议要结合其它协议,如:用SDP协议描述要传递的内容格式,用RTP,RTSP流媒体协议传输媒体,才能完成整个通信过程。 SIP协议这样做为了简化协议,留下扩展的灵活性。
1.2.3 SIP消息内容及格式
SIP协议是由国际互联网协会(IETF)制定的,这个协会也制订了HTTP协议。所以,这两个协议有很多地方是相似的。
与HTTP协议相同,SIP协议也采用Client/Server模式,Client发请求,Server响应,请求和响应消息均采用纯文本方式。
INVITE 是主叫做为Client, 被叫做为Server, 发起的一个请求 (类似HTTP请求,例如POST)
请求消息分成几个部分,一是起始行(start line), 二是消息头部(message head),内含一个或多个头字段(head field), 三是一个空行(empty line),表示头部的结束。四是一个消息体(message body)
(1)起始行
起始行格式:Method URI SIP_VERSION
(1)Method:请求方法,类似于HTTP协议中的POST、GET;
SIP协议规定的Method有六种: INVITE, ACK, CANCEL用于创建对话,BYE用于结束对话, REGISTER用于登记,OPTIONS用于查询服务器能力
(2)URI:请求的用户或服务器
(3)SIP_VERSION:SIP版本号
(2)消息头部
头部包含一个或多个头字段(head field), 每个字段一行。
一个字段行 = name : value ; value;
一个请求消息头部至少要包含六个字段:Via, To, From, CSeq, Caller-ID, Max-Forwards
(3)消息体
编码方式主要是由头部确定,现在一般为SDP。
v=0 //版本号为0
o=user1 685988692 621323255 IN IP4 192.168.31.131
//建立者用户名+会话ID+版本+网络类型+地址类型+地址
s=- //会话名
c=IN IP4 192.168.31.131 //连接信息:网络类型+地址类型+地址
t=0 0 //会话活动时间 起始时间+终止时间
m=audio 49432 RTP/AVP 0 8 101
//媒体描述:媒体+端口+传送+格式列表
音频 + 端口49432 + 传输协议RTP + 格式AVP,有效负荷0(u率PCM编码)
a=rtpmap:0 PCMU/8000
//0或多个会话属性: 属性 + 有效负荷+ 编码名称 + 抽样频率。
// rtpmap + 0型 + PCMU + 8KHz
a=rtpmap:8 PCMA/8000 //a 可以有多个, 见SDP协议
a=rtpmap:101 telephone-event/8000
a=sendrecv
二、常用交互流程和类型
2.1 注册和注销(Register)
2.1.1 注册和注销流程
如上图所示为注册和注销流程,流程比较明确,主要涉及到4次交互
(1)设备端向平台端发送注册信令 REGISTER
(若是注销,消息里带的有效期参数Expires值为0)
(2)平台端回应401,同时回应认证信息给设备端
(3)设备端再次向平台端发送注册信令 REGISTER,同时带了认证信息参数
(若是注销,消息里带的有效期参数Expires值为0)
(4)认证成功,平台回应200 OK
2.1.2 注册流程抓包内容实例
2.2 控制命令
如上图所示为设备控制交互流程,包含很多命令,如设备目录信息查询(Catalog),前端设备控制(DeviceControl),设备信息查询(DeviceInfo),预置点查询(PresetQuery),报警通知(Alarm)等等
2.2.1 设备目录信息查询(Catalog)
平台端发通过此信令获取设备的目录信息,即设备端的通道设备信息,如NVR有几个通道,各个通道的设备信息和在线状态等等
抓包内容示例
2.3 视频播放
如上左图图为完整的一次音视频点播流程图
对于设备端(即媒体流发送者)来说,可以将流程简化为如上右图所示
1、平台端向设备端发起INVITE请求,即请求取流
2、设备端回复200 OK
3、平台端向设备端向发送ACK
4、设备端向平台端发送媒体流数据
5、平台端向设备端发起BYE请求,即结束取流
6、设备端回复200 OK,停止发送媒体流数据
2.3.1 视频流传输模式
GB28181的流传输模式分为三种:
(1)UDP
服务端监听UDP端口,通过INVITE信令告知设备端口,设备端向服务端发起流传输。
(2)TCP被动
服务端监听TCP端口,通过INVITE信令告知设备端口,设备端去connect服务端,连接成功后,设备端向服务端发起流传输。
(3)TCP主动
设备端监听TCP端口,通过INVITE信令的回复内容告知服务端端口,服务端去connect设备端,连接成功后,设备端向服务端发起流传输。
2.3.2 会话与流传输的TCP和UDP
在2016版以前,会话和流传输是使用UDP的方式;在2016版已经支持TCP方式。此处进行简单说明
此处的TCP主要指两个方面
(1)信令连接支持TCP
信令连接主要指代设备端与平台端进行信息交互的连接
注:信令连接使用TCP还是UDP是由设备端决定
(2)取流连接支持TCP
取流连接主要指代设备端与平台端进行流数据发送的连接
取流的TCP方式分为两种,TCP主动和TCP被动,这两者的差异主要在建立TCP送流
a、TCP被动:平台端监听端口,平台端被动的等待设备端建立TCP送流连接
b、TCP主动:设备端监听端口,平台端主动的与设备端建立TCP送流连接
注:取流连接使用TCP还是UDP是由平台端决定
请求播放过程抓包内容实例:
INVITE信令部分参数说明
如上图所示,个别选项的取值和含义
选项 | 选项含义和取值 |
s=Play | 操作类型为播放实时流 实时播放:Play 录像回放:Playback 录像下载:Dowmload 对讲:Talk |
m=video 30015 TCP/RTP/AVP 96 97 98 | 媒体类型为视频/视音频,传输端口为30015,采用RTP over TCP方式,负载类型为96 97 98 视频/视音频:video,音频:audio TCP:TCP/RTP/AVP,UDP:RTP/AVP |
a=recvonly | recvonly 仅接收 sendonly 仅发送 |
a=rtpmap:96 PS/90000 a=rtpmap:98 H264/90000 a=rtpmap:97 MPEG4/90000 | 媒体流格式 96:PS流 97:H264 98:MPGE4 |
a=setup:passive | TCP连接方式为被动 TCP被动:passive,TCP主动:active |
a=streamprofile | 请求主码流/子码流 0:主码流 1、子码流 |