1、 引言
目前,IETF的SIP协议(Session Initiate Protocol, 会话初始协议)已获得业界越来越多的关注和支持,正逐步成为下一代网络(NGN)中的核心协议之一[1]。SIP协议相对简单、易于实现、可扩展性强、更适合IP网络,被广泛的用于VoIP系统的组建[2]。oSIP及其扩展eXosip作为开源的SIP协议栈,以其结构简单、功能丰富、易于移植等优点成为在嵌入式系统上构建VoIP应用的首选。本文分析了oSIP协议栈的运行机制,设计实现了将oSIP协议栈移植到嵌入式操作系统并以此为基础开发嵌入式SIP客户端的方案。
2、 oSIP协议栈
2.1 SIP协议
SIP协议是一个用于建立、更改和终止多媒体会话的应用层协议。现在的协议文本是IETF于2002年7月发表的RFC3261。SIP分别从用户定位、用户状态查询、用户能力查询、会话建立、会话管理五个方面实现对多媒体通信的控制。作为一种信令控制协议,它需要和IETF的其它协议如SDP、RTP、RTSP和SAP等协同工作。SIP会话中的媒体交换可以使用任何传输协议,但工程上一般都以RTP(Real-time Transmit Protocol,实时传输协议)作为传输协议。
SIP采用C/S模式的工作方式,包含两类元素:SIP用户代理(User Agent, UA)和SIP服务器。根据用户代理在会话中扮演的角色不同又可分为用户代理客户机(User Agent Client, UAC)和用户代理服务器(User Agent Server, UAS),前者发起呼叫请求,后者响应呼叫请求。
2.2 oSIP协议栈
oSIP是遵循IETF标准,使用ANSI C编写,源代码开放的SIP协议栈。oSIP主要有下列优点:
(1)结构小巧简单,只有400K左右,适合在嵌入式系统上应用;
(2)可移植性好,已被成功的应用于Solaris、HP Unix、VxWorks、Windows和GNU/Linux[3] (2.2.16和2.4.7)等系统中;
(3)工作稳定、兼容性强。
oSIP主要由解析模块、工具模块和状态机模块构成,其核心是状态机模块[4](如图1所示)。
图1 oSIP结构
解析模块完成对SIP请求和响应进行封装与解析处理。解析模块又可分为SIP解析、SDP解析与URL解析。
工具模块主要提供一些处理工具用于对话管理和SDP协商。
状态机模块负责对某个事务(如注册过程、呼叫过程等)状态的维持及处理,并在特定的状态下触发响应的事件或回调函数。根据RFC描述中关于SIP协议事务层的定义,oSIP
协议栈有4种状态机:客户端邀请事务(ICT),客户端非邀请事务(NICT),服务器端要求事务(IST),服务器端非邀请事务(NIST)。前两种状态机是由客户端发起的,后两种状态机是由服务器发起的,这4种状态机涵盖了SIP的各种事务类型。其中ICT(如图2所示)是SIP客户端中最常见的事务。
图2 ICT状态机状态转换图
图2中,cb_ict_xxx_xxx表示oSIP中ICT状态机回调函数,当ICT从一种状态到另一种状态时oSIP协议栈将调用此函数。
oSIP专注于SIP底层解析,这使得它具有很高的效率。但另一方面,由于没有提供高层的SIP会话控制API,使得上层应用在调用协议栈时很破碎,降低了易用性。为此oSIP的开发者们又在oSIP的基础上开发了eXosip。eXosip是oSIP的扩展,它部分封装了oSIP协议栈,使得它更容易被使用。eXosip实现了作为单个SIP终端的大部分功能。
3、 嵌入式SIP终端系统体系结构
3.1 嵌入式SIP终端的功能
嵌入式SIP终端是一个运行在嵌入式操作系统上的SIP用户代理,主要包括SIP电话的注册、呼叫、接听、挂断等功能。它直接与用户交互,接收输入信息,进行格式检查,根据用户的动作初始化SIP消息,同时得到本地语音媒体接口信息,形成SDP描述,完成UDP或TCP封装。
3.2 系统软硬件平台的选择
为选择合适的软硬件平台,我们收集了大量相关资料,经过反复比较并结合现有实验条件做出了如下选择:
(1)嵌入式处理器种类繁多,我们选择了三星的S3C2410A微处理器。该处理器基于ARM920T内核,主频最高为203MHz。是一款高性价比、低功耗、高集成度的CPU,专为手持设备和网络应用设计,能满足嵌入式系统低功耗、高性能、小体积的要求。同时,S3C2410系列处理器已得到广泛使用,技术资料丰富,这也是采用S3C2410平台进行开发的有利条件。此外,我们还选用了带有的触摸屏的SHARP L35T23 3.5”液晶显示器作为系统输入/输出设备。
(2)嵌入式操作系统方面,考虑到GUI界面开发的难易程度,我们选择了Microsoft的Windows CE.NET 4.2。WinCE 4.2版本在内核、实时性和网络支持等方面做了很大的优化和增强,同时还为基于WinCE的嵌入式系统的开发提供了强大的工具——Platform Builder 4.2(PB 4.2)。这些特性有助于我们快速开发嵌入式系统。
(3)在开发工具的选择上,我们选用了与Windows CE.NET 4.2同时推出的Microsoft Embedded Visual C++ 4.0(eVC 4.0)。这个开发环境和VC6.0十分类似,易于掌握,同时还包含有许多WinCE专用的标准开发工具和远程调试工具。
3.3 系统体系结构
我们设计的嵌入式SIP终端系统总体结构如图3所示:
图3 嵌入式SIP终端系统体系结构
整个系统分为3个层次:
(1)系统平台层:包括硬件平台及运行在其上的嵌入式操作系统,这是整个系统的基础。
(2)协议栈层:运行SIP协议栈,为用户程序提供调用。RTP模块我们采用了开源的jrtplib。jrtplib采用C++编写,可以方便的移植到WinCE系统上。移植jrtplib到嵌入式操作系统不是本文的重点,具体做法在此不再赘述。
(3)用户程序层:负责接收用户的输入,根据用户请求类型调用协议栈层功能,同时实现oSIP的回调函数,并将结果反馈给用户。
4、 嵌入式SIP终端的实现
4.1 系统平台层实现
本系统开发使用的硬件设备都直接向设备供应商购买,但由于嵌入式系统是软硬件高度结合的系统,还需要根据硬件条件定制一个WinCE平台。在PB中可以定制出满足各种不同需求的CE系统。我们使用设备供应商提供的BSP,利用PB平台创建向导新建了一个WinCE映象文件并将其下载到开发板中固化。
4.2 协议栈层的实现
oSIP协议栈在设计之初就考虑到了满足嵌入式操作系统的的特定要求,这使得只需做很少量的修改(主要是需要加入一些针对WinCE的头文件)就能将oSIP移植到WinCE系统中。
另外,WinCE的API中没有time()函数的实现,我们需要自己实现这个函数,代码如下:
#ifdef _WIN32_WCE
SYSTEMTIME t;
#endif
……
#ifdef _WIN32_WCE
GetSystemTime(&t);
now = (int)((t.wYear-1970)*365*24*3600+t.wMonth*30*24*3600+t.wDay*24*3600+t.wHour*3600+ t.wMinute *60+t.wSecond);
#else
now = time(NULL);
#endif
完成必要的修改后,重新编译就可以得到能在WinCE系统上使用动态链接库。
4.3 用户程序层的实现
在系统启动过程中,用户程序首先根据用户配置对系统全局变量进行赋值操作,然后向oSIP协议栈注册回调函数,并启动数据包监听线程。一旦接受到数据包,则调用协议栈功能生成相应事件并判断该事件的处理事务是否存在,若存在则将事件放入该事务中,否则生成新的事务,启动事务执行线程。同时根据用户动作生成相应事件交由协议栈处理。
oSIP通过状态机回调函数与用户程序通信,向用户程序通告事件的发生及事务状态。用户程序调用oSIP协议栈API发起oSIP动作(添加事件,事件处理等)。
5、 结束语
本文提出了一个基于ARM9核心的处理器平台,以oSIP协议栈为基础的嵌入式SIP终端设计方案,并就嵌入式系统平台搭建、协议栈移植、SIP用户代理的实现等问题进行了讨论。测试结果表明,根据该方案实现的嵌入式SIP终端系统能实现预想的功能和性能。有理由相信,随着SIP协议的广泛应用和嵌入式技术的不断发展,嵌入式SIP终端将具有美好的前景。
本文作者创新点:本文讨论并实现了oSIP协议栈在WinCE系统上的移植和应用,提出了一个嵌入式SIP终端的系统分层结构同时指出了上述分层结构中各层次在实现时要注意的主要问题。
参考文献
[1] 司端锋,韩心慧,龙勤等.SIP标准中的核心技术与研究进展[J].软件学报.2005 16(2).
[2] 刘志军,王风著,张孟辉等.软交换技术协议SIP及其在VoIP中应用[J].微计算机信息.2006,09-3:169-172
[3] 卢华,王保保.oSIP协议栈的研究及应用[J].电子科技.2006.2.
[4] libosip Documentation 2.2.0.http://www.gnu.org/software/osip/doc/html/