exosip2协议栈原理分析以及总结_第1页
exosip2协议栈原理分析以及总结_第2页
exosip2协议栈原理分析以及总结_第3页
exosip2协议栈原理分析以及总结_第4页
exosip2协议栈原理分析以及总结_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文格式为Word版,下载可任意编辑——exosip2协议栈原理分析以及总结inti;

TRACE_INITIALIZE(6,stdout);i=eXosip_init();if(i!=0)return-1;

i=eXosip_listen_addr(IPPROTO_UDP,NULL,port,AF_INET,0);if(i!=0){

eXosip_quit();

fprintf(stderr,\return-1;}

...thenyouhavetosendmessagesandwaitforeXosipevents...

这样,在初始化完成后,我们基本上完成了对内存中所用数据结构的配置,同时启动了一个后台任务负责osip状态机的驱动。

5、数据收发整体框架

5.1接收过程

在初始化过程中我们创立了一个后台任务,现在可以看看这个后台任务都做了哪些操作。任务的执行函数为_eXosip_thread,在该接口中,循环不断的调用eXosip_execute。在每一次的eXosip_execute执行中,完成如下的工作:

a.首先计算出底层osip离当前时间最近的超时时间。也就是查看底层所有的超时事件,

5

找出其中的最小值,然后将其与当前时间做差,结果就是最小的超时间隔了。这步是通过调用接口osip_timers_gettimeout完成的。主要检查osip全局结构体上的ict、ist、nict、nist以及ixt上所有事务的事件的超时时间。假使ict事务队列上没有事件,则说明没有有效的数据交互存在,返回值为默认的一年,实际上就是让后面的接收接口死等。如果有事务队列上的事件的超时时间小于当前值,则说明已经超时了,需要马上处理,此时将超时时间清为零,并返回。

b.调用eXosip_read_message接口从底层接收消息并处理。假使返回-2,则任务退出。c.执行osip的状态机。具体为执行osip_timers_ict(ist|nict|nist)_execute和osip_ict(ist|nict|nist)_execute这几个函数。最终还检查释放已经终结的call、registrations以及publications。

d.假使keep_alive设置了,则调用_eXosip_keep_alive检查发送keep_alive消息。这样,当远端的终端代理发送sip消息过来时,会被之前创立的监听端口捕获(sip协议默认的端口为5060)。在调用eXosip_read_message接口时会将其接收上来。接收上来的数据存放在buffer中交给接口_eXosip_handle_incoming_message来处理。在其中首先调用osip_parse进行消息的解析,这是osip的核心功能之一。数据解析后,会生成一个osip_event类型的事件。接着调用osip_message_fix_last_via_header将接收到该消息的ip地址和端口根据需要设置到数据头的via域中。这在消息返回时有可能发挥作用。为了能够让消息正确的被处理,调用osip_find_transaction_and_add_event接口将其添加到osip的事务队列上。处理在这之后发生了分叉,假使osip接纳了该事件,接口直接返回,由于这说明该事件在osip上已经有匹配的事务了,或者说该事件是某一个事务过程的一部分。这样在后面执行状态机的接口时,该事件会被正确的处理。假使osip没有拿走该事件,则说明针对该事件还没有事务与之对应。此时,我们首先检查其类型,假使是request,则说明很可能是一个新的事件到来(这将触发服务端的状态机的建立),调用eXosip_process_newrequest接口进行处理。假使是response,则调用接口eXosip_process_response_out_of_transaction处理。在eXosip_process_newrequest接口中,假使是合法的事件,则会为其创立一个新的事务。也就是说这是新事务的第一个事件。经过一大堆的处理后,该事件可能就被osip消化了,或者被exosip消化了。假使需要上报给应用,由应用拿来对一些信息进行存储或者进行图形显示之类,则会将该事件添加到exosip的事件队列上。如下图所示:

6

应用程序在exosip初始化完之后需要调用如下类似的代码,不断从事件队列上读取事件,并进行处理。

eXosip_event_t*je;for(;;){

je=eXosip_event_wait(0,50);eXosip_lock();

eXosip_automatic_action();eXosip_unlock();if(je==NULL)break;

if(je->type==EXOSIP_CALL_NEW){}

elseif(je->type==EXOSIP_CALL_ACK){}

elseif(je->type==EXOSIP_CALL_ANSWERED){}

else

eXosip_event_free(je);}

读到事件后,判断其类型进行对应的处理。这样整个接收流程就完成了。

5.2发送过程

要发送数据时,需要根据消息类型,调用exosip对应模块的api接口函数来完成。假使要发送的sip消息不属于当前已有的任何事务,则类似接收过程,调用osip的相关接口创立一个新的事务,同时根据消息生成一个事件,加到事务的事件队列上。最终,唤醒exosip后台进程,使其驱动osip状态机,执行刚添加的事件,从而完成数据的状态处理和发送。当然,也有一些消息并不通过osip状态机,而是由exosip直接调用回调函数cb_snd_message完成发送。

7

6、exosip与上层应用以及osip之间的流程关系

exosip是对osip库的扩展,那么它与osip之间是什么样的关系呢,这可参看下图:

上图为接收过程的示意图。Exosip后台任务不断从网络另一端读取sip消息,交给osip的parser模块解析,并将其转换为events,添加到事务队列上。同时,exosip后台任务在不断的驱动osip的状态机,这样,事务队列上的事件就会被处理。假使需要响应对端,状态机遇根据回调函数的设置,直接完成数据的发送。同样,假使要将当前处理反馈给应用,则将其发送到事件队列上(这里是exosip的事件队列),并通过e-ctl管道通知应用进行处理。应用需要发送数据时,流程如下图所示:

此时,应用调用exosip提供的辅助函数(上图中虚线示意此关系),构造osip事件,将其添加到osip的事务队列上。同时,应用通过s-ctl管道通知exosip后台任务执行状态机。在exosip执行状态机的过程中,sip消息会被发送到网络另一端的终端。

8

7、linphone与exosip2的关系分析

7.1linphone功能模块说明

Liblinphone核心引擎实现了linphone所有的功能函数,而且能够便利的添加音频和视频的呼叫功能。Liblinphone也提供高层的API,用来初始化,接收或者终止呼叫。Liblinphone依靠于下面三个组件:1Mediastreamer2

这是一个支持多种平台的轻量级的流技术引擎,主要适合于开发语音和视频电话应用程序。该引擎主要为linphone的多媒体流的收发,包括语音和视频的捕获、编码解码以及渲染。2ortp2

Ortp是一个RTP库。为基于RTP协议的媒体流传输提供支持。通过mediastream2编码的数据就是使用ortp库发送到网络的另一端。3eXosip2

Exosip2为sip协议的实现。这部分实际上是由exosip2和osip2两个库共同完成的。使用sip协议完成路由、媒体协商以及会话的建立和管理,为直接的媒体流的传输提供基础。

通话双方在通信前使用exosip进行会话协商。Exosip后台任务完成数据的接收和发送,并通过事件队列通知linphone底层的状态变化。filter的构建在会话协商成功建立后就顺带完成了,并且ticker任务也跑起来了。此时依照filtergraphics构建的通道,音视频流不断的从硬件设备上读取,并经过编码压缩送给RTP会话,之后送到对端,对端到达的音视频流也经过RTP会话接收送到解码解压缩filter,还原出原始的音视频流交给硬件设备播放。媒体数据在这两路流中源源不断的滚动,完成了双方的可视通话。上层linphone的core任务也不断的对底层进行迭代检查。所做的基本工作如下:对于sip协议部分,core一直等待从事件队列上拿事件。这些事件是exosip任务在处理sip消息过程中添加到事件队列上的。每当得到新的事件后,core就从应用层的角度出发,进行处理。对于视频流:基本上只处理rtcp数据包到达的事件。stream上也有一个事件队列,用于保存该流上的相关事件。对于rtcp数据包事件,core也只处理sr类型rtcp包,即发送端报告,得到jitter和包丢失率。假使设置了自适应比特率,则调用相关接口进行处理。此过程不断进行,直到当前事件上的包处理完。对于音频流,检查流是否还是活动的。通过比较RTPstats中接收的数据包数目是否发生变化,假使在超时时间到达后,接收的数据量还没有发生变化,则认为音频没有响应。

7.2linphone中sal模块完成对exosip的封装

Sal模块其实应当是最重要的,最核心的模块了。该模块对exosip进行了简单的封装,间接的对osip模块进行了封装,使用该模块的接口可以完成sip协议的处理以及媒体描述的处理。

Sal.c文件主要是对一些sal相关的结构体的操作,包括SalMediaDescription和sal_op。处理包括创立这些结构体的实例,获取或者设置其中的一些操作域。

Sal_exosip2_sdp.c基于osip库提供的sdp相关操作的接口,在sal层实现将其与sal相关的结构体关联起来操作。譬如根据SalMediaDescription结构体信息将其转换为sdp结构体,或者反之。

9

Sal_exosip2_presence.c包括了对in和out的subscribe的操作。Text数据的发送(基于osip和exosip)。

Sal_exosip2.csip这块比较重要的封装。包含了对sal_op结构体的创立和基本操作。对exosip重要结构体的封装,包括初始化和释放。包含了对sal结构体的创立和基本操作的封装,更重要的是包含了对sal和sal_op,sal_media_desc,sal_stream_desc这些上层结构体与底层osip_message,

sip_message,sdp_message等数据结构之间数据的转换和共享,以及对底层相关接口的调用。这种调用主要包括跟据上层结构体中包含的信息设置底层结构体,并调用底层接口完成具体功能,以及根据底层结构体得到的数据设置上层结构体的相关信息。一个基本的描述就是:sal作为signalabstractlayer包含了上层所主要理解的交互信息,这些信息对于理解电话操作而言已经足够了,在底层,选择了osip和exosip来支持这项操作。所以实际上来说,可以用其他支持sip的库的接口来替代现有的,保存sal层接口的功能定义。在linphone中,虽然大部分使用了sal层的封装来完成sip交互过程,但是也调用osip和exosip库本身的其他接口,所以这层封装主要还是再次简化协议层的处理,使得功能更具体,而不是更单一。

几个关键数据结构之间的关系:

Sal一个基本的结构体,通过这个结构体可以搜寻到上层所需的所有sip协议相关的信息。具体的call,register等信息保存在sal_op这个结构体中,多个实体通过链表串接起来,挂在sal上。Sal_op包含了sal_op_base结构体,这个结构体保存了一些通用的不变的信息,对多个实体而言,譬如路由信息,本地媒体信息,远端媒体信息等。其root指针由返回指向了sal这个基础,所以通过sal_op可以找到sal。另外,在媒体信息中包含了所有流的信息,所有这些类似一个树的组织结构,sal类似树根,通过它可以找到所有的枝叶及其上的信息。

7.3linphone初始化过程中对sip协议栈的初始化

7.3.1调用sal_init进行sip协议栈的初始化。该过程将返回一个sal结构体。Exosip全局结构体的创立以及初始化。需要注意,在这里相当于有三层封装调用:一层为sal层的封装调用,一层为exosip层的封装调用,最底层为osip层的基本调用。另外需要注意的是在这里没有创立exosip任务,而是在后面的读取并配置sip配置信息时才创立exosip任务,并监听特定端口。

将lc->sal的up指针指回linphonecore全局结构体设置sal上的回调函数,这些回调函数在对应的sip协议处理完后用于调用来处理外层有关call与media流的一些处理。假使配置文件中没有设置sip会话的过期时间,则在这时将其设置为200将所有sipsetup配置串联到registered_sip_setups全局链表上

7.3.2读取配置文件中有关sip协议的相关信息,并以此来配置linphone的sip模块。配置是否在发送数字时使用sipinfo信息。配置是否在发送数字时使用rfc2833信息配置是否使用ipv6

配置sip的传输端口信息。指定是使用随机值还是知名5060端口将端口信息设置到linphonecore中,并启动sip监听。这样,当sip协议数据到达时即可被处理。

首先调用sal_listen_port启动监听端口。在这里,协议层被选择和设置,一般状况下都是udp,这里为eXtl_udp。之后创立并启动_eXosip_thread任务,该任务处理sip协议数据

10

的接收,协议的处理,状态机的处理,数据的发送等。即几乎所有与sip协议有关的处理都会在该任务中处理完。最终保存用户代理信息。获取配置文件中的联系人信息,假使联系人为空,或者配置文件中联系人信息不为空,但在将其设置为主联系人信息时出错(譬如格式错误),则基于环境变量中的host和user信息创立主联系人,否则将配置文件中的联系人信息设置到sip_conf结构体的联系人上。假使配置文件中设置了猜测主机名,则将该配置设置到linphonecore的sipconfigure结构体上配置incomingcall的超时时间,假使超过超时时间没有answer则terminate该call

读取并配置代理信息,所有的代理者信息都被添加到sipconfigure的代理者链表上读取并配置默认代理者信息。默认代理者会从所有代理者中挑拣,根据配置文件,然后放到linphonecore结构体的default_proxy上读取并配置认证信息。首先从配置文件中读取usrname,userid,password,ha1,realm等信息,并根据这些信息创立一个新的认证信息结构体,将其添加到linphonecore的auth_info链表上。同时,查找所有处于pending状态的待认证事件,假使linphonecore中能找到一致的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论