会话初始合同(SIP合同)是一种用于IP网路多媒体通讯的应用层控制合同,可完善、修改、和中止多媒感受话。SIP具有良好的互操作性和开放性,支持多种服务且具有多媒体协商能力,才能在不同设备之间通过SIP服务器或其他网路服务器进行交互。同时SIP便于扩充,支持用户联通性,才能充分满足设备对联通性服务的需求,但是SIP简单灵活,估算量小,尤其适宜在嵌入式应用环境中应用。为此,将SIP引入到嵌入式应用中,凭着SIP自身的特点可有效提升嵌入式网路设备的互操作性和接入网路的便利性。但SIP合同本身只给出SIP消息的文法定义以及自然语言描述的消息处理,并未给出SIP合同栈的实现机制。这儿讨论在嵌入式终端设备上构建嵌入式Linux系统,并完成SIP的嵌入式,以及代码的嵌入式移植和测试。
1嵌入式Linux系统开发
1.1构建交叉编译环境
本文使用的是实验室的ARMSYS2410-B开发板。打算好必要的软件包后,构建交叉编译环境实际上就是对cross2.95.3.tar.bz2的解压过程。具体过程如下:
1)在编译Linux之前,先安装交叉编译toolclhain,在/usr/local目录下构建名为ann的目录,步入该目录,执行解包:
cd/usr/local/armtarxjvf/mnf/cdrom/linux/toolchain/cross-2.95.3.tar.bz2
2)编辑/etc/profile,找到pathmunge/usr/local/sbin,在其下边添加一行:
Pathmunge/usr/local/arm/2.95.3/bin这样,内核或其他应用程序均可使用arm-linux-来指定使用该交叉编译器。
1.2BootLoader移植
BootLoader是在嵌入式Linux操作系统内核运行之前运行的一段小程序。通过这段程序可以将内核从Flash储存器拷贝到RAM,并执行内核。还要完成初始化硬件设备,构建显存空间的映射图,因而将系统的软硬件环境带到一个合适的状态。用烧写软件jflash-s3c2410通过JTAG口向硬件板下载BootLoader二补码文件,向硬件板Flash中下载引导程序,这样BootLoader就可以成功运行。
1.3重新编译内核
从官方网站上下载的内核不能直接在硬件平台上运行,须要依照具体的硬件平台重新剪裁、编译内核,按照硬件平台特点编撰相关代码,将Linux移植到平台上。以下是对内核代码的更改:1)更改内核目录树皮下的Makefile,指明交叉编译器;2)配置Flash分区,更改arch-/arm/mach-s3c2410/devs.c,用以指明分区信息,该文件的内容完善NandFlash分区表;更改arch/arm/machsmachs33cc24102410/machsmdk241-0.c文件指定启动时初始化,kernel启动时根据对分区的设置进行初始配置:3)配置和编译内核,在Linux源文件目录下,执行makemenuc-onfig命令,配置内核形成config文件。之后依次运行#makeclean;#makedep;#makezImage,完成对内核的编译。
2嵌入式SIP合同栈的设计与实现
2.1嵌入式下实现SIP合同栈
嵌入式环境下SIP合同的开发,主要须要考虑嵌入式系统资源有限的局限性,需依照系统应用的特性,在设计时充分考虑CPU、存储空间等系统资源的借助。因为资源的限制,嵌入式系统通常作为用户终端设备,故这儿主要实现合同栈中用户代理(UAC/UAS)的功能。
首先是合同栈的简化。按照RFC3261中定义的SIP合同栈模型可知,SIP是一个分层体系结构的合同。该合同主要由4层组成,底层为句型编解码层(Syntax&Encoding);第2层是传输层(TransportLayer),该层定义网路上的顾客机和服务器怎么接收恳求和发送响应;第3层为事务层(Transaction),负责事务处理;最前面一层为事务用户层(TransactionUser),每位SIP实体都是事务用户,当一个事务用户希望发送恳求时,就创建一个顾客机事务实例以发送恳求。
这些合同栈的设计实现方式应用到嵌入式环境中有以下不足:1)合同栈设计层次过多会降低系统堆栈的开支。为了不过多占用堆栈,在系统资源分配时需分配较大的堆栈空间。而嵌入式环境下的空间资源是有限的,SIP模块占用过多的堆栈空间linux入门,会导致其他任务空间分配遭到限制。2)层次与层次之间的调用会降低系统的延时,增加系统的实效性。而作为用户终端设备,快速响应是设计的重要准则。
2.2SIP合同栈的总体结构
按照以上剖析,在设计中需对SIP合同栈进行更改和剪裁,使其尽量少地占用资源并能最大限度地实现快速响应。本文设计的嵌入式SIP合同栈模型如图1所示。
合同栈主要分成传输层和事务层。传输层主要负责收发消息,它管理套接字(socket)和网路联接,使用TCP或UDP传送数据。事务层则负责创建并管理事务对象。每位事务对象负责维持状态,并发消息和使用传输层重传消息。事务层也须要将从传输层传来的消息映射到相应的事务。
SIP合同栈管理层负责系统配置、分配内管理资源、提供登入合同栈和进行管理的命令以及所有其他层的初始化和关掉。应用程序使用该合同栈前,必须先调用该层的初始化插口以初始化要使用的层,在结束应用程序前,必须调用该层的关掉插口关掉相应的层。
SIP编码解析是合同栈运行过程中比较花费时间的一个模块,为满足嵌入式环境,该合同栈使用了一种“懒汉”解析策略,当从网路上收到一个原始的SIP消息时,消息被解析成好多“关键字和关键字值对”,关键字是恳求行或SIP头域名linux移植时需要编译设备树文件吗,关键字值是没有解析的恳求行和头域值。到事务层,在应用程序要访问恳求行或某个头域时,就会对其完全解析,这些策略可有效提升SIP解码的速率,极大提升这些须要处理繁杂网路流量的应用。
2.3事务层和传输层的实现
图2为事务层和传输层的软件结构。这2层都使用SIP消息编码解析层的功能处理SIP消息。其中传输层包含3个模块:1)TcpConn模块使用TCP实现收发消息功能;2)UdpConn模块使用UDP现收发消息功能;3)SipMessageSendRcv模块借助TcpConn和UdpConn向应用程序提供统一的消息收发插口。在TcpConn和UdpConn中,还会创建2个线程,分别负责接收和发送SIP消息。
事务层创建并管理事务对象。TransactionSendRcv提供发送不同SIP消息的插口,并以反弹函数的形式在收到消息时通知应用程序。Tr-ansactionSendRcv使用传输SipMessageSendRcv提供的收发消息功能收发SIP消息,并按照收发的消息类型形成风波,将风波以及风波体(主要是SIP消息)作为参数传递给相应模块UACTransactFSM和UASTransactlFSM。事务层的核心就是这2个模块,分别表示UA顾客端和服务器端收到不同消息的处理流程,具体的状态转换如图3所示。
3SIP合同栈的测试结果
本文实现的系统将在ARM9平台的设备终端上运行,将交叉调试好的程序烧讲到ARM9的Flash储存模块中,再进行调试和运行测试。其测试方式是在ARM9平台上实现一个简单的SIP终端系统,该系统借助SIP侦听程序,当一段用户发起呼叫时,双发的SIP模块开始通讯。借助SIP鉴权主动发起呼叫或接收对方呼叫构建会话联接,联接构建好后传送RTP数据,直至一方用户提出结束恳求,中止该次会话,系统恢复SIP侦听状态。SIP终端之间呼叫流程如图4所示,开始时主叫(IP=192.168.36.1)向代理服务器(IP=192.168.51.24)发起呼叫,当主叫与被叫的链路搭建成功后,主叫与被叫开始语音通讯,语音通讯采用的标准是G.729,主叫发送SIP鉴权给代理服务器采用UDP传输合同,主叫与代理服务器之间在SIP呼叫过程中也同时进行媒体协商,采用网路合同剖析工具Ethereal抓包剖析,结果如表l~表3所示。
由表2可见,代理服务器向被叫发起呼叫,并同时对主叫做出响应。被叫对呼叫代理做出响应主要采用SIP/SDP合同,是为了使主叫和被叫的媒体协商达成一致。由表3可见,被叫对主叫所发起的呼叫才能做出响应,主叫与被叫之间才能实现SIP呼叫,并进行语音通讯。测试结果证明,SIP合同栈在嵌入式Linux系统平台下,运行良好linux移植时需要编译设备树文件吗,基本满足设计须要。
4结束语
本文阐述了SIP合同在嵌入式环境下的应用,讨论了嵌入式SIP合同栈的设计方式。完成了在ARMSYS2410-B的实验室开发板上构建嵌入式Linux系统并在其上实现SIP合同栈主要模块的主要工作。测试结果表明:该合同栈占用空间小,呼叫构建时间短,呼叫成功率高linux计划任务,满足嵌入式式设备对实时性、可靠性和储存空间小的要求,具有良好的性能。