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

.

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 协议完成路由、媒体协商以及会话的建立和管理,为直接的媒体流的传输提供基础。

. .

.

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

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

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

Sal.c 文件主要是对一些sal 相关的结构体的操作,包括SalMediaDescription 和

. .