【GBT28181开发:SIP协议实践】之实况直播

10 篇文章 2 订阅
9 篇文章 22 订阅
实况直播(标准中的叫法是 实时点播,但是以前在HW,SE的设计文档里面是实况,叫习惯了,其实只是个叫法而已)是整个视频监控系统中比较核心的一个业务,GBT28181标准中对其也做了详细的设计。相对于设备信息、状态查询等业务,其稍微复杂点。

首先消息类型采用的是INVITE,然后消息体的描述采用SDP协议。SDP协议的之前已经学习过了,还算简单:http://blog.csdn.net/longlong530/article/details/9004707


下面介绍下学习的是实况直播的流程,主要通过模拟SPVMN系统向源设备发送实况直播请求,在GBT28181标准文档中对应的是实况流程中SIP服务器和媒体流发送者交互的子过程。记录下交互的消息,详细研究了下:

转载请注明出处:http://blog.csdn.net/longlong530


一.环境搭建:

环境准备:http://blog.csdn.net/longlong530/article/details/9176989

UAC(模拟IPC):

IP:192.168.10.177(同事人不在~,直接用自己的机子模拟了下)

Port:5061


UAS(模拟SIP服务器):

IP:192.168.10.177

Port:5060


SPVMN操作过程:
1.先选择调测设备类型
3.点击实时点播启动,会在左边的文本框中
v=0      			                     //Version 协议版本
o=34020000002020000001 0 0 IN IP4 192.168.43.178     //Origin 所有者/创建者和会话标识符
s=Play   					     //Subject 会话名称
c=IN IP4 192.168.43.178                              //Connection Data 连接信息
t=0 0                                                //Time 会话生命周期
m=video 6000 RTP/AVP 96 98 97                        //Media(Type、Port、RTP/AVP Profile)
a=recvonly                                           //扩展属性定义                
a=rtpmap:96 PS/90000                                 //扩展属性定义
a=rtpmap:98 H264/90000	                             //扩展属性定义
a=rtpmap:97 MPEG4/90000		                     //扩展属性定义
y=0100000001                                         //网上木有查到y的意思,最后在28181标准文档中查到:描述SSRC值
f=                                                   //网上木有查到y的意思,最后在28181标准文档中查到:描述媒体参数

4.点击发送消息,右边对话框即可显示消息交互的过程。(图就不截了~)

二.业务时序图:


三.消息详解:

第一步,UAS-->UAC

SPVMN每次实况前,会发送一个BYE消息,但是该操作在GBT28181标准中并没有规定。

BYE sip:34020000001320000001@192.168.10.177:5061 SIP/2.0
CSeq: 2 BYE
From: <sip:34020000002000000001@3402000000>;tag=67051446_53173353_7e47bbc7-c29c-4299-803b-71f7367975bb
To: <sip:34020000001320000001@3402000000>;tag=946196600
Call-ID: 5769dab035fe6ade9dafa5e544c3c6a5@0.0.0.0
Max-Forwards: 70
Via: SIP/2.0/UDP 192.168.10.177:5060;branch=z9hG4bK7e47bbc7-c29c-4299-803b-71f7367975bb_53173353_20235498592802
Content-Length: 0


SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.10.177:5060;branch=z9hG4bK7e47bbc7-c29c-4299-803b-71f7367975bb_53173353_20235498592802
From: <sip:34020000002000000001@3402000000>;tag=67051446_53173353_7e47bbc7-c29c-4299-803b-71f7367975bb
To: <sip:34020000001320000001@3402000000>;tag=946196600
Call-ID: 5769dab035fe6ade9dafa5e544c3c6a5@0.0.0.0
CSeq: 2 BYE
User-Agent: eXosip/3.6.0
Content-Length: 0

第二步,UAS-->UAC
发送INVITE消息,请求实况,消息体用SDP协议描述,其中每个字段的意义在上面已经介绍了
INVITE sip:34020000001320000001@3402000000 SIP/2.0
Call-ID: 1d7bbec98be4dfc5cf128e40ccde864e@0.0.0.0
CSeq: 1 INVITE
From: <sip:34020000002000000001@3402000000>;tag=97895568_53173353_401bffa2-3ee4-4d32-81b1-3881df7957d3
To: <sip:34020000001320000001@3402000000>
Max-Forwards: 70
Contact: "34020000002000000001" <sip:192.168.10.177:5060>
Content-Type: application/sdp
Route: <sip:34020000001320000001@192.168.10.177:5061;line=9a1ca01668b5778;lr>
Via: SIP/2.0/UDP 192.168.10.177:5060;branch=z9hG4bK401bffa2-3ee4-4d32-81b1-3881df7957d3_53173353_24913197787603
Content-Length: 227

v=0
o=34020000002020000001 0 0 IN IP4 192.168.43.178
s=Play
c=IN IP4 192.168.43.178
t=0 0
m=video 6000 RTP/AVP 96 98 97
a=recvonly
a=rtpmap:96 PS/90000
a=rtpmap:98 H264/90000
a=rtpmap:97 MPEG4/90000
y=0100000001
f=

第三步,UAC-->UAS

服务器响应101消息,表示会话正在正常建立,GBT28181标志没有提及该消息,但是1**的消息都属于Informational级别的通知消息,表示会话正在正常建立。比如网上有的例子还会有180 ring消息响应等。

SIP/2.0 101 Dialog Establishement
Via: SIP/2.0/UDP 192.168.10.177:5060;branch=z9hG4bK4b6c31ac-b631-4c5c-8576-0a82f27a8fbc_53173353_20235503434986
From: <sip:34020000002000000001@3402000000>;tag=03164492_53173353_4b6c31ac-b631-4c5c-8576-0a82f27a8fbc
To: <sip:34020000001320000001@3402000000>;tag=3823092636
Call-ID: 6fdcb598554bcd699b314c3719c2ba50@0.0.0.0
CSeq: 1 INVITE
Contact: <sip:34020000001320000001@192.168.10.177:5061>
User-Agent: eXosip/3.6.0
Content-Length: 0


第四步,UAC-->UAS

服务器响应200 ok消息,表示会话建立成功

SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.10.177:5060;branch=z9hG4bK4b6c31ac-b631-4c5c-8576-0a82f27a8fbc_53173353_20235503434986
From: <sip:34020000002000000001@3402000000>;tag=03164492_53173353_4b6c31ac-b631-4c5c-8576-0a82f27a8fbc
To: <sip:34020000001320000001@3402000000>;tag=3823092636
Call-ID: 6fdcb598554bcd699b314c3719c2ba50@0.0.0.0
CSeq: 1 INVITE
Contact: <sip:34020000001320000001@192.168.10.177:5061>
Content-Type: application/sdp
User-Agent: eXosip/3.6.0
Content-Length: 235


v=0
o=34020000001320000001 0 0 IN IP4 192.168.10.177
s=Embedded IPC
c=IN IP4 192.168.10.177
t=0 0
m=video 6000 RTP/AVP 96
a=sendonly
a=rtpmap:96 H264/90000
a=username:34020000001320000001
a=password:12345678
y=100000001
f=

第五步,UAS-->UAC

服务器返回ACK消息,最终确认消息,标志会话正式建立完成

ACK sip:34020000001320000001@192.168.10.177:5061 SIP/2.0
Call-ID: 6fdcb598554bcd699b314c3719c2ba50@0.0.0.0
CSeq: 1 ACK
From: <sip:34020000002000000001@3402000000>;tag=03164492_53173353_4b6c31ac-b631-4c5c-8576-0a82f27a8fbc
To: <sip:34020000001320000001@3402000000>;tag=3823092636
Max-Forwards: 70
Via: SIP/2.0/UDP 192.168.10.177:5060;branch=z9hG4bK4b6c31ac-b631-4c5c-8576-0a82f27a8fbc_53173353_20235513789448
Content-Length: 0

然后媒体流发送者(UAC)就开始向服务端指定的目的地( o=34020000002020000001 0 0 IN IP4 192.168.43.178)发送流媒体,UAC.EXE的截图:




在基于GBT28181SIP协议组件开发中,SIP服务端流程是非常关键的一部分。本文将介绍如何使用eXosip2实现SIP服务端流程。 一、eXosip2简介 eXosip2是一个基于SIP标准的开源协议栈,它提供了一组API,可以用来实现SIP客户端和服务端。eXosip2具有高度的可移植性和灵活性,可以在不同平台上运行。eXosip2的主要特点包括: 1. 遵循SIP标准,功能齐全。 2. 支持IPv4和IPv6协议栈。 3. 支持TLS和SRTP协议。 4. 提供了一组易于使用的API,方便开发人员进行二次开发。 5. 可以在不同的平台上运行,包括Linux、Windows、Android等。 二、eXosip2的使用 1. 安装eXosip2库 首先需要安装eXosip2库,可以通过以下命令在Ubuntu下安装: sudo apt-get install libexosip2-dev 2. 初始化eXosip2 在使用eXosip2之前,需要初始化eXosip2库,这可以通过调用eXosip_init函数来实现。例如: eXosip_t *g_eXosipContext=NULL; g_eXosipContext = eXosip_malloc(); if (g_eXosipContext!=NULL) { iRet = eXosip_init(g_eXosipContext); } 3. 注册SIP服务器 使用eXosip2可以实现SIP服务器的注册,这可以通过调用eXosip_register_build函数构造注册消息,然后通过调用eXosip_register_send发送注册消息。例如: eXosip_event_t *pEvent = NULL; osip_message_t *pMsg = NULL; int iRet = 0; iRet = eXosip_register_build_initial_register(g_eXosipContext, "sip:192.168.1.100", "sip:192.168.1.100", "sip:192.168.1.100", 3600, &pMsg); if (iRet == 0) { iRet = eXosip_register_send_register(g_eXosipContext, pMsg); osip_message_free(pMsg); } 4. 接收SIP消息 使用eXosip2可以接收SIP消息,这可以通过调用eXosip_listen函数实现。例如: while (1) { iRet = eXosip_listen(g_eXosipContext, 0, &pEvent); if (iRet >= 0) { switch (pEvent->type) { case EXOSIP_REGISTRATION_SUCCESS: // 注册成功 break; case EXOSIP_REGISTRATION_FAILURE: // 注册失败 break; case EXOSIP_MESSAGE_NEW: // 收到新的SIP消息 break; } eXosip_event_free(pEvent); } } 5. 回复SIP消息 使用eXosip2可以回复SIP消息,这可以通过调用eXosip_message_build_response函数构造回复消息,然后通过调用eXosip_message_send_response发送回复消息。例如: osip_message_t *pMsg = NULL; int iRet = 0; iRet = eXosip_message_build_response(pEvent->tid, 200, &pMsg); if (iRet == 0) { iRet = eXosip_message_send_response(g_eXosipContext, pEvent->tid, 200, pMsg); osip_message_free(pMsg); } 三、总结 本文介绍了如何使用eXosip2实现SIP服务端流程。eXosip2是一个功能齐全、易于使用的SIP协议栈,可以方便地实现SIP客户端和服务端。在GBT28181SIP协议组件开发中,eXosip2是一个非常好的选择。
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值