复旦光华之osip工作原理和过程.doc_第1页
复旦光华之osip工作原理和过程.doc_第2页
复旦光华之osip工作原理和过程.doc_第3页
复旦光华之osip工作原理和过程.doc_第4页
全文预览已结束

下载本文档

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

文档简介

OSIP工作原理和工作过程雷 /wcl0715感谢OSIP代码整理小组的工作。一、概述:首先说明一个概念:OSIP是一个开原的标准C的sip 3261的CORE,实际上是一个SIP的信令实现,从另一个角度说,它是SIP的一个信令解释器,任务是负责生成和解析SIP信令,仅此而已,其它的事情,比如收包,发包,建立RTP流的过程等等和OSIP没有任何必然关系。理论上OSIP可以应用在任何可以编译C语言的系统上。二、工作原理OSIP实现的核心是状态机,为了便于保持逻辑的清晰和代码模块化的实现,OSIP分成两对状态机,分别用来处理正常的CALL流程和其它非CALL流程,对应的每对状态机又分成out和in两个状态,因此OSIP共有四个状态机。详细的状态机部分文挡请参考OSIP的状态机分析,在我们的资源连接里你可以找到它,你也可以登陆我的BLOG来寻找它。对不同的状态OSIP相应的用不同的状态机处理,在这些状态机下,OSIP对本身或者来自对方的消息进行处理,从而推动自身状态的改变,这也就是OSIP的核心工作原理。和其它的SIP协议栈的实现一样,OSIP采用CALLBACK函数的方法来对用户程序提供接口,当系统有事件发生,或者状态改变的时候,OSIP调用这些CALLBACK函数,来完成用户的要求(比如收到对方180消息后,本地要响铃,实现方法就是在OSIP的收到180消息的CALLBACK函数里实现响铃代码),因此OSIP用户需要自己编写这些CALLBACK函数,实现自己所需要的功能,然后在系统初始化过程中,和系统callback函数挂接,这样当系统调用CALLBACK的时候就会执行你的函数,这也就是OSIP初始化的时候,要设定一大堆CALLBACK函数的原因,在接触协议初期,也许你觉得烦琐,但尽可能多的让用户能对事件进行处理,才能保证协议栈的可用性这样,这在系统越来越复杂的情况下,或者应用比较复杂的情况下,尤为重要。二、工作过程1、 系统初始化过程。在OSIP工作之前,必须先初始化,主要有以下几个部分:(1)系统资源申请,包括资源和链表的处理。函数:osip_init()(2)设置系统CALLBACK函数osip_set_cb_send_message ();/系统的信令发送函数,在这个函数中,要完成信令包的向外发送功能。这个函数在后面会详细的讲。 osip_set_kill_transaction_callback (); /设置四个状态机下消息传输失败的处理函数。 osip_set_message_callback ();/设置各种状态机下各种事件发生后用户的回调,注意:你可以只设置你需要的,对你不关心的,你可以不设置,那么这些时间发生的时候,系统就不会处理。比如你可以不对1XX 消息处理,那么你不对挂1xx事件对挂就可以了。(3)打开接收远端消息接收通道。打开通道就是保证远方的消息能够顺利的被本地接收到,然后交给SIP CORE处理,它包括以下几个步骤Step1:监听端口打开SIP端口SOCKET,然后监听此端口,如5060。但目前SIP被封杀,所以建议您换一个。需要注意的是,SIP支持TCP和UDP两种方式,请注意这两种方式的不同。Step2:解析消息接收到消息后,调用osip_parse函数,来完成对消息包的解析。这个函数完成后,消息就从普通信令消息分解成了OSIP2自己可以理解的消息事件。osip_parse函数在srcosipparser2,应该说是比较复杂的,需要的时候可以自己看代码,但我的建议是,在不需要的时候,没有看这些代码的必要,这些代码中,只有你在深入的时候,才需要理解,如果您是初学,似乎没有这个必要。Step3:将消息送给SIP CORE处理解吸后的消息,系统调用osip_find_transaction_and_add_event函数,把消息发送给和此消息相关的处理事物(或者说session),如果系统中没有和这个消息相关的session(也就是说是个新的request),那么此时将新建立一个session(或者说transaction,因为在不同层面有不同理解),用于处理新的事务。实际上,这个session创立的过程也就是一个新的系统状态机的建立过程,根据这个消息的种类,osip_transaction_init负责初始化,建立一个新的和种类对应的状态机(四种状态机中的一种),然后调用osip_transaction_add_event把消息扔给这个刚建立起来的状态机处理。一个新的状态机也就开始运做。到此,OSIP就已经正常工作,可以接收网络来的消息。2、 一个呼叫过程。下面通过一对呼叫的连接过程说明OSIP的消息的整个处理过程。假设终端A呼叫终端B,两放都是用的OSIP CORE。注意:阅读以下的东西的时候我认为你已经理解了我上面说的东西,并且对OSIP的状态机有了一个比较完整的理解,如果不理解,请先阅读另一篇文挡:osip2的状态机分析。Stp1:A生成一个Invite消息这个过程是大家都熟悉的过程,也就是利用本地信息,组建一个SIP包的过程,具体的请参考EXOSIP,不再说明,需要注意的是:rtp流的本地接收发送端口是在这里就建立的,然后放到SDP中。Step2:A把生成的消息交给核心处理。首先系统调用osip_transaction_init ,产生一个新的状态机。在发送invite请求的时候,这个状态机是ICT(带invite的client端状态机)。状态机产生后,系统调用函数把消息扔给状态机处理,osip_transaction_add_event负责把消息插到队列中,Step3:A的ICT状态机调用ict_snd_invite函数发送invite包给对方,状态机自身从初始状态跳转到calling状态,等待对方回应,并设置响应的A超时和B(忘记是什么了,自己看去吧)超时,当A超时到达的时候,向对方重发一次数据包,并且把A时间的时间增加一倍(最长为4S,如果超过4S,将不再增加)。当B时间到达后,系统认为对方没有响应,则释放资源,结束本次操作。Step4:B的信令监听端口接收到此invite请求包,调用osip_parse函数,来完成对消息包的解析,然后系统调用osip_find_transaction_and_add_event函数来试图把此消息包插入已经存在的session的传输队列(比如系统还有另外一个呼叫),当系统发现当前信令包并不属于已经存在的session的时候,系统认为之是一个新的呼叫过程,因此,系统调用osip_transaction_init函数建立一个信的状态机来处理这个session,这个状态机也就是IST(带invie的server状态机),然后把信令消息插到新状态机的事件列表中,供其处理。Step5:B的IST处理A的invite请求,自身的状态机从IST_PRE_PROCEEDING跳转到IST_PROCEEDING状态,并发送100消息给对方,调用用户设置的回掉函数来完成用户收到请求时候的处理。注意,B应该发两次1XX消息给对方,一个是100,一个是180。因为这两个类似,我比较懒,就不写了,下面的状态也一样。Step6:A收到1xx的回应,自身从ICT_CALLING状态跳转到ICT_PROCEEDING状态,并调用用户的回掉函数来完成用户的要求。注意,A会收到B过来的两次1XX消息,参考step5的说明。Step7:B的用户认可,可以接收A的此次呼叫,B发送调用ist_snd_2xx函数,发送200 OK消息给A,B的状态机IST从IST_PROCEEDING IST_TERMINATED。完成一次IST的服务。Step8:A接收到200 0K,状态机跳转到ICT_TERMINATED状态,完成一个ICT服务。3、 信令结束后,RTP流的建立在Invite信令中,A告诉了B本地的RTP接收地址和端口,B在200 OK中告知了A本地的RTP的接收地址和端口,因此,信令结束后,A和B就可实现流的互通(通常是音频),需要注意的是,RTP并不是OSIP的一部分,从模块上说,它是逻辑上的另外一个部分,RTP流是依靠SIP信令里的信息建立起来的,但和SIP或者SIP信令本身而言并没有任何必然联系。另外,就RTP要传送的音频数据本身而言(例如音频数据),和SIP更没有必然联系。通常,数据是这样产生的,A采集音频数据,然后交给编码部分编码(例如711,723),压缩完后的数据,由RTP打包,然后发送给B。B接收这些数据,拆RTP包,拿出原始数据,交给解码,解出数据后给播

温馨提示

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

评论

0/150

提交评论