exosip2协议栈原理分析以和总结 下载本文

内容发布更新时间 : 2024/6/28 22:23:56星期一 下面是文章的全部内容请认真阅读。

.

这样在后面执行状态机的接口时,该事件会被正确的处理。如果osip 没有拿走该事件,则说明针对该事件还没有事务与之对应。此时,我们首先检查其类型,如果是request,则说明很可能是一个新的事件到来( 这将触发服务端的状态机的建立), 调用eXosip_process_newrequest 接口进行处理。如果是response , 则调用接口

eXosip_process_response_out_of_transaction 处理。在 eXosip_process_newrequest 接口中,如果是合法的事件,则会为其创建一个新的事务。

也就是说这是新事务的第一个事件。经过一大堆的处理后,该事件可能就被osip 消化了, 或者被exosip 消化了。如果需要上报给应用,由应用拿来对一些信息进行存储或者进行图 形显示之类,则会将该事件添加到exosip 的事件队列上。如下图所示:

应用程序在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) { .... .... }

else if (je->type == EXOSIP_CALL_ACK) { .... .... }

else if (je->type == EXOSIP_CALL_ANSWERED) { .... .... }

. .

.

else ..... .... ....

eXosip_event_free(je); }

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

5.2 发送过程

要发送数据时,需要根据消息类型,调用exosip 对应模块的api 接口函数来完成。如果 要发送的sip 消息不属于当前已有的任何事务,则类似接收过程,调用osip 的相关接口创建

一个新的事务,同时根据消息生成一个事件,加到事务的事件队列上。最后,唤醒exosip 后台进程,使其驱动osip 状态机,执行刚添加的事件,从而完成数据的状态处理和发送。 当然,也有一些消息并不通过osip 状态机,而是由exosip 直接调用回调函数cb_snd_message 完成发送。

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

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

. .

.

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

. .

.

此时,应用调用exosip 提供的辅助函数(上图中虚线示意此关系),构造osip 事件,将 其添加到osip 的事务队列上。同时,应用通过s-ctl 管道通知exosip 后台任务执行状态机。

在exosip 执行状态机的过程中,sip 消息会被发送到网络另一端的终端。

7、linphone与exosip2的关系分析

7.1 linphone功能模块说明

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

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

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

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

. .