摘 要 介绍了以Pocket PC2003为操作系统,带WiFi功能的智能移动设备平台下IP电话软件的设计方案与实现方法。实践证明,本软件具有实时性好、移植性强等优点。
关键字 智能移动设备;IP电话;PJSIP;WiFi;Pocket PC 2003
1 引言
IP电话以其低廉的价格,较好的通话质量,成为通信市场上有力的竞争者 。IP电话分为硬件电话和软件电话两类。硬件IP电话和传统电话一样使用方便,但需要额外的硬件投资。软件IP电话产品目前主要是基于PC平台,市场上基于Wi-Fi手机的软件IP电话产品还很少,因此,本文的研究具有较高的实用价值。
2 IP电话软件的设计
2.1 设计目标
本软件的功能要求如下:(1)用户之间完整的语音交互,包括对语音数据进行采集编码和利用RTP/RTCP实现语音的传输和控制;(2)呼叫控制,包括呼叫的建立、维护和终止;(3)注册功能,即在指定的SIP服务器上注册自己的号码;(4)友好的图形用户界面。
2.2 总体设计
在硬件平台之上,共分为操作系统模块、SIP信令模块、实时语音处理模块、应用程序管理模块四个部分,如图1所示。
终端用户
|
应用程序管理模块
|
SIP信令模块
|
实时语音处理模块
|
操作系统模块
|
系统硬件
|
图1 总体设计框架图
1)操作系统模块
操作系统模块是嵌入式应用软件开发的基础,属于底层软件开发。它将上层应用软件与硬件设备分离开来。主要用途是为了驱动相应的硬件设备,提供给上层应用软件一个统一的系统调用接口,使上层与底层的开发在逻辑上分离。本文选用Pocket PC2003操作系统。
2) SIP信令模块
SIP信令模块主要是用于进行呼叫控制,包括SIP消息的构造与发送、消息的接收与解析、SDP消息的构造与解析以及双方媒体协商以及UA终端注册等功能。
3) 实时语音处理模块
实时语音处理模块包括了语音处理和实时媒体传输两大功能,主要是用以完成在实时条件下,对语音进行采集、编解码和播放,以及语音媒体数据包的RTP封装与分解以及数据包的发送和接收。
4) 应用管理模块
应用管理模块是主控模块,用于实现终端程序的初始化,创建工作线程,控制其它各模块,并且是与用户进行交互的接口,负责在全局上控制和管理其它各模块的工作和通信,负责整个系统的呼叫发起、呼叫响应及呼叫结束的动作。主要完成了本用户代理终端的注册以及终端之间的会话。
3 IP电话软件的实现
3.1 操作系统模块的实现
本文使用Platform Builder实现操作系统模块的配置与编译。首先创建新的Platform并命名,接着对该Platform做配置,再进行编译,得到二进制系统镜像,并输出SDK安装包。
3.2 SIP信令模块的实现
SIP信令模块的功能由SIP协议栈完成。用于提供SIP操作所需的基本数据结构和应用程序编程接口API。包括了用于表示SIP中各种对象(如SIP消息、各种头域以及SDP消息体等)的数据结构以及对消息、消息体进行解析和封装的API。
在嵌入式系统中,对SIP协议栈的要求是尽可能精简、高效并且方便使用和移植。因此,在本系统中,使用基于C语言开发的开源协议栈PJSIP 为基础,并根据具体情况进行了相应的必要修改,然后移植到开发板。PJSIP的主要特点如下:①移植性强,可以方便的移植到各个目标平台;②协议栈占用空间极少,核心部分少于150KB,并且提供完整的SIP功能;③高效的处理能力;④提供SIP的完整功能以及大量扩展功能;⑤优秀的文档资料。
3.3 实时语音处理模块的实现
实时语音处理模块主要负责语音采集与回放、语音数据编解码和语音数据RTP实时传输。
3.3.1 语音采集与回放
在PJSIP中,提供一组高级的音频采集与回放的接口抽象层,封装了各种底层的音频处理方式,使得程序的移植性更强。其接口抽象函数主要包括:
①pjmedia_snd_open():打开音频设备并配置相关参数,然后进入等待状态。②pjmedia_snd_stream_start():启动音频流的播放或者录音。③pjmedia_snd_stream_stop():停止音频流的播放或者录音。④pjmedia_snd_stream_close():关闭打开的音频流。
3.3.2 语音的编解码
PJSIP中的高层类库PJMEDIA-CODEC提供了各种常用的语音编解码方案,包括G.711, GSM06.10, iBLC, L16, Speex等。本系统中,我们选用Speex语音编解码方案。
Speex是一个专门针对VoIP设计的开源的音频编解码标准。它是GNU项目的组成部分之一,是一个基于CELP的语音编解码器。Speex的设计目标是提供较高的会话质量和较强的带宽适应能力,在对语音数据的压缩比、失真度、还原能力处理上要明显优于其它一些音频编解码方式。Speex能适应2kbps到44kbps之间的传输速率,可以在绝大部分的网络条件下正常工作,尤其在低比特率传输时与同类编解码器比较更具优势。因此,Speex非常适用于Internet上的语音应用。
3.3.3 语音的RTP实时传输
RTP是一种建立在UDP基础上的用于多媒体数据实时传输的协议。
PJSIP中提供了RTP传输功能,主要接口定义如下:
①pjmedia_rtp_session_init():初始化一个RTP会话。②pjmedia_rtp_encode_rtp():根据RTP会话状态以及填入的参数,生成一个RTP头部数据。③pjmedia_rtp_decode_rtp():解码一个收到的RTP包,分解为RTP头部和RTP净荷。
3.4 应用管理模块的实现
本模块主要完成注册和管理用户代理(UA)之间的会话功能。应用管理模块的运行流程如图2所示。
图2 应用管理模块流程图
3.4.1 终端注册
终端启动上线后,通过用户代理客户机自动向所在域的服务器端发送注册请求;该服务器的SIP注册服务模块收到注册请求后,对其进行身份验证。终端注册主要代码如下:
pjsua_acc_config cfg;
pjsua_acc_config_default(&cfg); /*
初始化一个帐户信息*/
cfg.id = pj_str("sip:"+m_user+"@"+m_domain ); /*
以下配置帐户信息*/
cfg.cred_count = 1;
cfg.cred_info[0].realm = pjstr( domain );
cfg.cred_info[0].scheme = pj_str(
“digest” );
cfg.cred_info[0].username = pj_str(
“username” );
cfg.cred_info[0].data_type = PJSIP_CRED_DATA_PLAIN_PASSWD;
cfg.cred_info[0].data = pj_str(
“password” );
status = pjsua_acc_add( &cfg, PJ_TRUE, &acc_id ) /*
发出注册请求*/
if ( status != PJ_SUCCESS )
error_exit(
“Error registration.” );
/*
注册成功*/
……
3.4.2 会话控制
终端完成注册后,进入等待状态,等待主动发起呼叫或者被动接收呼叫。
(1)主叫模式。该模式下,本终端作为一个UAC,主动完成对远程UAS的呼叫。主要由函数pjsua_call_make_call()完成主叫功能。
(2)被叫模式。该模式下,本终端作为一个UAS,在默认端口5060接收远程UAC发来的会话请求并回应。主要由两个回调函数on_incoming_call(),和on_call_media_state()完成被叫应答功能。配置回调函数代码如下:
cfg.cb.on_incoming_call = &on_incoming_call;
cfg.cb.on_call_media_state = &on_call_media_state;
4 测试与结论
4.1 测试平台
本IP电话软件以带有Pocket PC2003操作系统的Wi-Fi功能的智能手机为软、硬件平台上。本文采用如图4所示的测试平台。
图4 测试平台
其中,WiFi Phone为运行IP电话软件的通话终端,是主要的测试对象;Brekeke SIP Server是一个SIP服务器;笔记本电脑上运行X-Lite软件作为测试VoIP通话的对端,并且通过笔记本电脑上的无线网卡与Airopeek抓包软件,完成抓取无线网络数据包的工作,以供分析。
4.2 结论
通过测试表明,该系统能够对SIP信令过程进行很好的控制,从而完成注册、呼叫、语音通信、呼叫撤销等基本功能。本终端除了可以与X-Lite互通,与KPhone、Linphone也进行了互通测试,都可以进行正常的呼叫建立语音通信,说明本系统互通性良好。
本软件在局域网内语音通话品质较好,没有出现明显的延迟和回音,实现了VoIP的基本功能需求,但其在恶劣的网络环境下的性能不太理想,有待于进一步提高。
参考资料
[1] 李文耀等.电信业务全IP化的发展趋势,通信世界,2008.1:P21-22
[3] 汪兵,李存斌, 陈鹏等. EVC高级编程及其应用开发,中国水利水电出版社,2005 年3月