HHLee 2010-09-08
对于SIP协议,以及相关的SIP协议栈内容,我们也讲了一些内容。那么本文提出了一种基于SIP协议的软件电话的软件结构和设计实现方案.该方案以嵌入式Windows CE为平台,中间件采用开源的SIP协议栈oSIP/eXosip,通过协议栈的移植和在协议栈之上应用程序的开发,实现了SIP软件电话.测试结果表明,该软件电话在布置Windows CE的PDA上具有良好的语音通话质量.
1 引言
VOIP 的迅速普及,出现了越来越多的VOIP 的固定电话终端.随着VOIP 的进一步发展,为了满足移动用户VOIP 通信的需要,无线VOIP 通讯将是未来的发展趋势.现在手持 PDA 用户越来越多,都具有无线上网功能,如果能开发一个在PDA 上运行的VOIP 软件电话,就可以满足这些PDA 用户的无线VOIP 通信的需求,具有非常重要的实际
意义.由于嵌入式Windows CE(WinCE)是PDA 最流行的操作系统,而目前大多数VOIP终端都采用SIP 协议,因此,本文提出了一种Windows CE 平台下基于SIP 协议的VOIP 解决方案.该方案以嵌入式Windows CE 为平台,eMbedded C++ 4.0 为开发工具,中间件采用开源的SIP 协议栈oSIP/eXosip,通过进行协议栈的移植和在协议栈之上应用程序的开发,实现了SIP 软件电话.
2 设计方案
SIP 软件电话的结构包括呼叫控制和语音通信两大模块.呼叫控制由SIP 信令来完成,主要实现呼叫的建立、修改和拆除;语音通信模块由音频数据接口,音频编解码和 RTP 传输三个子模块组成,实现语音的采集,编码,传输和播放.
音频数据接口模块实现语音的采集和播放, 采用Windows CE 的低层音频服务, 因为低层音频服务中的回调机制为其提供了很大的方便;音频编解码采用的是G.729A 语音压缩技术,它属于低比特率话音编码,适合语音在IP 网络传输;语音采用RTP 包传输.对呼叫控制模块,直接移植开源 oSIP/eXosip 协议栈到WinCE 上,通过调用协议栈的API 函数,实现对呼叫的控制.RTP 传输用开源JRTPLIB,JRTPLIB 也需要在WinCE 进行移植.
3 具体实现
基于上述方案,具体实现包括协议栈移植、呼叫控制和语音通信三部分.
3.1 协议栈移植
oSIP/eXosip 主要支持Win32 及Linux、VxWorks 等一些嵌入式系统,将oSIP/eXosip 移植到WinCE 上,可以在Win32 基础上进行.WinCE 可以兼容大部分的Win32 API,在WinCE上移植oSIP/eXosip 主要有3 种情况:与Win32 兼容的API,与Win32 不兼容API 和不同的头文件支持和预定义.与Win32 兼容的API 只要修改条件编译选项,与 Win32 不兼容API可以用其他的WinCE 上的API 来代替并作相关修改,另外,WinCE 和Win32 的某些头文件和预定义也不同,也需要进行相关修改工作.表1 给出了移植的一些示例.
在 WinCE 上对JRTPLIB 进行移植与SIP 协议栈的移植类似,注意WinCE 下的RTP 装载数据包最大2K,和PC 上的64K 不同.
3.2 呼叫控制模块
呼叫控制模块用来向代理服务器注册以及进行会话的建立、修改和终止,实现对呼叫的控制.因此呼叫控制模块分为注册和呼叫两部分,都是通过底层的SIP 协议栈来完成的.上层应用程序调用SIP 协议栈提供的API 函数,通知协议栈进行相应的操作,协议栈将底层检测到的事件以消息的形式报告给应用层,应用层收到SIP 事件后作相应处理.
3.2.1 注册
注册的实现过程首先是由客户端向代理服务器发出 REGISTER 注册请求,并等待服务器返回响应消息.客户端必须在收到前一个REGISTER 请求的最终响应之后或者前一个REGISTER 请求超时的情况下,才能发送一次新的注册请求,注册流程和对应的SIP 协议栈API 函数调用或协议栈的事件通知分别如图2(B)和(A).
3.2.2 呼叫
本设计的 SIP 软件电话有两种呼叫模式:注册呼叫和Peer To Peer 呼叫.如果是呼叫一个公网的SIP 用户或是同一个私网的SIP 用户之间进行呼叫,就可以直接找到对方,而不必要通过代理服务器.下面以注册呼叫为例,终端注册成功后就可以进行呼叫.一个通过代理服务器的成功呼叫流程如图3 所示.
oSIP/eXosip 对消息的报告有2 种工作模式:事件模式和回调模式.本设计采用事件模式, 通过函数eXosip_event_wait 定时轮询获取SIP 事件.SIP 信令的实现如表2 .
3.3 语音通信模块
语音通信模块主要是对语音进行采样、编码压缩等处理,并封装成能在IP 网络上传输的RTP 包,接收端收到后解码,播放.语音通信模块程序流程如图 4:
RTP 传输模块通过使用开源的RTP 协议栈JRTPLIB 来实现,我们只需调用JRTPLIB 的少数几个函数就可以了.在通过SIP 信令建立会话后,准确地说是在主叫得知被叫应答即获取到事件EXOSIP_CALL_ANSWERED 后及被叫收到主叫的ACK 消息即获取到事件EXOSIP_CALL_ACK 后分别启动语音通信模块.会话结束(由呼叫模块控制)则关闭语音输入输出设备,结束语音流传输.
4 结束语
本文提出了一种 Windows CE 平台下基于SIP 协议的VOIP 软件电话终端的解决方案,并对方案的各模块及实现进行了详细的介绍.该软件电话实现了基于Windows CE 操作系统的PDA 用户的无线VOIP,通话话音清晰,延时较小,具有很好的实用价值.作为后续工作,还将在SIP 软件终端中增加视频功能.