复旦光华之osip工作原理和过程

上传人:j****9 文档编号:45198566 上传时间:2018-06-15 格式:DOC 页数:3 大小:37KB
返回 下载 相关 举报
复旦光华之osip工作原理和过程_第1页
第1页 / 共3页
复旦光华之osip工作原理和过程_第2页
第2页 / 共3页
复旦光华之osip工作原理和过程_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

《复旦光华之osip工作原理和过程》由会员分享,可在线阅读,更多相关《复旦光华之osip工作原理和过程(3页珍藏版)》请在金锄头文库上搜索。

1、OSIP 工作原理和工作过程 雷 OSIP 代码整理小组的工作。 一、概述: 首先说明一个概念:OSIP 是一个开原的标准 C 的 sip 3261 的 CORE,实际上是一个 SIP 的信令实现,从另一个角度说,它是 SIP 的一个信令解释器,任务是负责生成和解析 SIP 信令,仅此而已,其它的事情,比如收包,发包,建立 RTP 流的过程等等和 OSIP 没 有任何必然关系。理论上 OSIP 可以应用在任何可以编译 C 语言的系统上。二、工作原理OSIP 实现的核心是状态机,为了便于保持逻辑的清晰和代码模块化的实现,OSIP 分 成两对状态机,分别用来处理正常的 CALL 流程和其它非 C

2、ALL 流程,对应的每对状态机 又分成 out 和 in 两个状态,因此 OSIP 共有四个状态机。详细的状态机部分文挡请参考 OSIP 的状态机分析,在我们的资源连接里你可以找到它,你也可以登陆我的 BLOG 来寻 找它。对不同的状态 OSIP 相应的用不同的状态机处理,在这些状态机下,OSIP 对本身或 者来自对方的消息进行处理,从而推动自身状态的改变,这也就是 OSIP 的核心工作原理。和其它的 SIP 协议栈的实现一样,OSIP 采用 CALLBACK 函数的方法来对用户程序提 供接口,当系统有事件发生,或者状态改变的时候,OSIP 调用这些 CALLBACK 函数,来 完成用户的要求

3、(比如收到对方 180 消息后,本地要响铃,实现方法就是在 OSIP 的收到 180 消息的 CALLBACK 函数里实现响铃代码) ,因此 OSIP 用户需要自己编写这些 CALLBACK 函数,实现自己所需要的功能,然后在系统初始化过程中,和系统 callback 函 数挂接,这样当系统调用 CALLBACK 的时候就会执行你的函数,这也就是 OSIP 初始化 的时候,要设定一大堆 CALLBACK 函数的原因,在接触协议初期,也许你觉得烦琐,但 尽可能多的让用户能对事件进行处理,才能保证协议栈的可用性这样,这在系统越来越复 杂的情况下,或者应用比较复杂的情况下,尤为重要。二、工作过程1、

4、 系统初始化过程。在 OSIP 工作之前,必须先初始化,主要有以下几个部分: (1)系统资源申请,包括资源和链表的处理。 函数:osip_init() (2)设置系统 CALLBACK 函数 osip_set_cb_send_message (); /系统的信令发送函数,在这个函数中,要完成信令包的向外发送功能。这 个函数在后面会详细的讲。osip_set_kill_transaction_callback ();/设置四个状态机下消息传输失败的处理函数。 osip_set_message_callback (); /设置各种状态机下各种事件发生后用户的回调,注意:你可以只设置你需要的,对你不

5、关心的,你可以不设置,那么这些时间发生的时候,系统就不 会处理。比如你可以不对 1XX 消息处理,那么你不对挂 1xx 事件对挂就可 以了。 (3)打开接收远端消息接收通道。 打开通道就是保证远方的消息能够顺利的被本地接收到,然后交给 SIP CORE 处理,它包括以下几个步骤 Step1:监听端口 打开 SIP 端口 SOCKET,然后监听此端口,如 5060。但目前 SIP 被 封杀,所以建议您换一个。需要注意的是,SIP 支持 TCP 和 UDP 两种方 式,请注意这两种方式的不同。 Step2:解析消息 接收到消息后,调用 osip_parse 函数,来完成对消息包的解析。这 个函数完

6、成后,消息就从普通信令消息分解成了 OSIP2 自己可以理解的 消息事件。osip_parse 函数在 srcosipparser2,应该说是比较复杂的,需 要的时候可以自己看代码,但我的建议是,在不需要的时候,没有看这 些代码的必要,这些代码中,只有你在深入的时候,才需要理解,如果 您是初学,似乎没有这个必要。 Step3:将消息送给 SIP CORE 处理 解吸后的消息,系统调用 osip_find_transaction_and_add_event 函数, 把消息发送给和此消息相关的处理事物(或者说 session) ,如果系统中 没有和这个消息相关的 session(也就是说是个新的

7、request) ,那么此时 将新建立一个 session(或者说 transaction,因为在不同层面有不同理解),用 于处理新的事务。实际上,这个 session 创立的过程也就是一个新的系统 状态机的建立过程,根据这个消息的种类,osip_transaction_init 负责初 始化,建立一个新的和种类对应的状态机(四种状态机中的一种) ,然后 调用 osip_transaction_add_event 把消息扔给这个刚建立起来的状态机处 理。一个新的状态机也就开始运做。 到此,OSIP 就已经正常工作,可以接收网络来的消息。2、 一个呼叫过程。下面通过一对呼叫的连接过程说明 OSI

8、P 的消息的整个处理过程。假设终端 A 呼 叫终端 B,两放都是用的 OSIP CORE。注意:阅读以下的东西的时候我认为你已经理 解了我上面说的东西,并且对 OSIP 的状态机有了一个比较完整的理解,如果不理解, 请先阅读另一篇文挡:osip2 的状态机分析。 Stp1:A 生成一个 Invite 消息 这个过程是大家都熟悉的过程,也就是利用本地信息,组建一个 SIP 包的过程, 具体的请参考 EXOSIP,不再说明,需要注意的是:rtp 流的本地接收发送端口是在这 里就建立的,然后放到 SDP 中。 Step2:A把生成的消息交给核心处理。 首先系统调用 osip_transaction_

9、init ,产生一个新的状态机。在发送 invite 请求的 时候,这个状态机是 ICT(带 invite 的 client 端状态机)。状态机产生后,系统调用函数 把消息扔给状态机处理,osip_transaction_add_event 负责把消息插到队列中, Step3:A 的 ICT 状态机调用 ict_snd_invite 函数发送 invite 包给对方,状态机自身从初始状态跳转到 calling 状态,等待对方回应,并设置响应的 A 超时和 B(忘记是什 么了,自己看去吧)超时,当 A 超时到达的时候,向对方重发一次数据包,并且把 A 时间的时间增加一倍(最长为 4S,如果超过

10、4S,将不再增加) 。当 B 时间到达后,系 统认为对方没有响应,则释放资源,结束本次操作。 Step4:B 的信令监听端口接收到此 invite 请求包,调用 osip_parse 函数,来完成 对消息包的解析,然后系统调用 osip_find_transaction_and_add_event 函数来试图把此 消息包插入已经存在的 session 的传输队列(比如系统还有另外一个呼叫) ,当系统发 现当前信令包并不属于已经存在的 session 的时候,系统认为之是一个新的呼叫过程, 因此,系统调用 osip_transaction_init 函数建立一个信的状态机来处理这个 sessio

11、n,这 个状态机也就是 IST(带 invie 的 server 状态机),然后把信令消息插到新状态机的事件 列表中,供其处理。 Step5:B 的 IST 处理 A 的 invite 请求,自身的状态机从 IST_PRE_PROCEEDING 跳转到 IST_PROCEEDING 状态,并发送 100 消息给对方,调用用户设置的回掉函数 来完成用户收到请求时候的处理。注意,B 应该发两次 1XX 消息给对方,一个是 100,一个是 180。因为这两个类似,我比较懒,就不写了,下面的状态也一样。 Step6:A 收到 1xx 的回应,自身从 ICT_CALLING 状态跳转到 ICT_PROC

12、EEDING 状态,并调用用户的回掉函数来完成用户的要求。注意,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 接收地址和

13、端口,B 在 200 OK 中 告知了 A 本地的 RTP 的接收地址和端口,因此,信令结束后,A 和 B 就可实现 流的互通(通常是音频) ,需要注意的是,RTP 并不是 OSIP 的一部分,从模块上 说,它是逻辑上的另外一个部分,RTP 流是依靠 SIP 信令里的信息建立起来的, 但和 SIP 或者 SIP 信令本身而言并没有任何必然联系。 另外,就 RTP 要传送的音频数据本身而言(例如音频数据) ,和 SIP 更没有 必然联系。通常,数据是这样产生的,A 采集音频数据,然后交给编码部分编码 (例如 711,723) ,压缩完后的数据,由 RTP 打包,然后发送给 B。B 接收这些 数据,拆 RTP 包,拿出原始数据,交给解码,解出数据后给播放进行播放。从这 里也可以看出,OSIP2 和这部分也是没有任何联系的。 其实这个过程也是很简单的过程,主要是熟悉下 RTP 的使用,数据产生后调 用 RTP 函数发送出去就可以了,当然,还需要监听本地的 RTP 接收端口。 关于 RTP 流的建立的过程会在另外一个代码整理文挡,RTP 流的建立的文挡 里面详细的写(希望不是我干) 。好,就这么多,我想该说的我都说了,如果有任何问题,请在群里寻找答案。雷

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号