Dec.2005
收稿日期:2005-6-30
Linux上基于SIP的IP软电话的设计与实现
高丽平邱志亮
(西安电子科技大学综合业务网理论及关键技术重点实验室,陕西西安710071)
摘
要:本文首先简要介绍了会话启动协议(SIP)和开源协议栈oSIP的基本内容。然后分层设计并实现
了一个基于SIP的IP软电话,重点介绍了其中两层的实现方法,并对其中一些技术进行了说明。关键词:会话启动协议(SIP);oSIP协议栈;IP软电话;Linux中图分类号:TN915.04
文献标识码:A
文章编号:1672-464X(2005)04-0072-04
SIP(SessionInitiationProtocol)会话启动协议是由IETF
定义,基于IP的一个应用层控制协议。它用于对多媒体通信进行控制,创建、修改和终结一个或多个参与者参加的会话。SIP得到了微软、AOL等厂商及IETF和3GPP等标准制定机构的大力支持。3GPP组织要求未来的3G终端支持
SIP。市场上也出现了越来越多的支持SIP的客户端软件和
智能多媒体终端,以及用SIP协议实现的服务器和软交换设备。本文利用一个开源的SIP协议栈oSIP,运用在Linux上进行软件开发的相关技术设计实现了一款基于SIP的IP软电话。
1SIP协议介绍
SIP协议采用客户机/服务器模式的工作方式,SIP网络
包含两类组件:用户代理和服务器。其中用户代理又分为负责发起SIP呼叫请求的用户代理客户端(UAC)和负责对呼叫请求做出响应的用户代理服务器(UAS),而服务器主要为用户提供注册、鉴权、认证和路由等服务。
SIP支持建立和结束多媒体通信的五个方面:用户定
位、功能与可用性、呼叫建立以及呼叫处理。
SIP消息有两种类型:从UAC发到UAS的请求消息和
从UAS发到UAC的响应消息。请求消息包含请求行、头字段、消息体三个元素。响应消息包含状态行、头字段和消息体三个元素。请求行/状态行和头字段定义了呼叫的特征,消息体于SIP协议并可以包含任何内容。消息体中传送的最重要的信息就是由SDP(SessionDescription
Protocol)协议描述的媒体控制信息,供终端协商并建立媒
体信道。
SIP是一个分层结构的协议,最底层是语法和编码,它
的编码使用增强Backus-Nayr形式语法(BNF)来规定。第二层是传输层,它定义了网络上一个客户机如何发送请求和接收响应以及一个服务器如何接收请求和发送响应。第三层是事务层,事务是SIP的基本元素。一个事务是由客户机事务发送给服务器事务的请求(使用传输层),以及对应该请求的从服务器事务发送回客户机的所有响应组成。事务
层处理应用层重传、匹配响应到请求、以及应用层超时。事务层具有客户机组成部分(称为客户机事务)和服务器组成部分(称为服务器事务),每个代表有限的状态机,它被构造来处理特定的请求。事务层之上的层称为事务用户(TU)。当一个TU希望发送请求时,它生成一个客户机事务实例并且向它传递请求、IP地址、端口和用来发送请求的传输机制。一个TU生成的客户机事务也能够被它删除。当客户机取消一个事务时,它请求服务器停止进一步的处理,将状态恢复到事务初始化之前,并且生成特定的错误响应到该事务。
在现阶段的很长一段时期,SIP将主要提供IP电话业务,本文将在分析oSIP协议栈的基础上设计实现一个基于
SIP的IP软电话。
2oSIP简介
oSIP是按照RFC3261(SIP)和RFC2327(SDP)标准,并使
用标准C语言编写的一个SIP协议栈。它是一个公开源码的免费协议栈。oSIP协议栈结构简单而小巧,它并不提供高层的SIP会话控制的API,它主要提供一些解析SIP/SDP消息的API和事务处理的状态机。
oSIP支持UTF8和完整的SIP语法,它包含一个语法分
析器,能够读写任何在RFC3261中描述的SIP消息。oSIP的核心是SIP协议中所描述的四个有限的状态机,事务是通过使用4个有限状态机定型的。每一个事物使用的
FIFO(先入先出队列),这些队列被外部模块填充。事件一经
用户请求便被列入队列。将一系列的动态回叫注册用于应用程序,能知道每一个事物的进展情况。
oSIP支持线程安全,既可以用于多线程的编程模式,也
可以用于单线程的编程模式。它可以用来开发用户代理,
IP软电话和SIP代理服务器等等。
oSIP协议栈开发之初便考虑了可移植性,它并不和任
何SIP开发商和操作系统紧密结合,可以被很快应用于支持
POSIX的任何系统当中,例如Solaris、HPUnix、RTOS、VxWorks、Windows以及GNU/Linux。而且oSIP的目标并不
仅仅在于PC应用,它具有足够的灵活和微小,便于在小的操作系统(例如手持设备)中满足其特定要求。在将来,oSIP会完美地适用于蜂窝设备和嵌入式系统。
作为一个开源的协议栈,oSIP既有优点也有缺点。优点在于它没有给开发者限定执行模式,能够使开发者选定一个比较适合自己的模式;其各个模块是相对清晰、的,因而去掉某个模块时也比较容易。oSIP的解析器提供了较为完善的API,包含了消息的构造、修改和产生等。oSIP的缺点则在于:首先,oSIP不提供任何快速产生请求消息和响应消息的方法,所有请求消息和响应消息的形成必须调用一组接口函数来手动组装完成。其次,由于oSIP结构简单,外围相关模块需要用户自己开发,如SIP消息的接收和发送,RTP/RTCP的语音数据处理等。
本文设计实现的基于SIP的IP软电话利用oSIP开发了一个SIP用户代理模块,用来在应用程序中建立连接或是修改或终结一个多媒体会话。
3基于oSIP的IP软电话的设计
3.1开发环境的选择
我们选择Linux来搭建开发环境,并使用C作为开发语言。
3.2实现的总体结构
图1是基于分层的设计思想,将该软电话划分为用户界面层,核心接口层,功能层和底层。其中,功能层包含四个模块:SIP用户代理模块、文件传输模块、语音处理模块和短消息模块。而底层模块主要为语音处理模块提供相关的接口。有一点要注意,图1中的oSIP库并不是应用程序中的一个模块,它是一个单独的库,SIP用户代理模块通过调用它提供的公共API来使用它。
用户界面层:基于Gtk+,包含程序的入口main函数,位于整个应用程序的最上层。它为
应用程序提供图形界面,并且确
定了应用程序的框架。
核心接口模块:是它所调用
的各个模块接口函数的组合。它
屏蔽了它所调用的下层模块的
细节,提供一些简单的接口,便
于用户界面层中控件的回调函
数调用,来完成诸如拨号或是发
短消息之类的具体功能。
SIP用户代理模块:它是基
于oSIP开发的SIP用户代理,在
IP软电话中实现对通话的控制。
完成诸如连接的建立,媒体属性
协商、修改等功能。
文件传输模块:完成在通话
双方间的文件传输。
短消息模块:实现通话双方间的即时消息通讯,基于UDP。
语音处理模块:完成语音的采集、处理和传输,它调用了底层的语音压缩模块、语音编解码模块和RTP/RTCP模块,其中RTP/RTCP模块用于实现语音的实时传输。3.3.用户界面层的实现方法
在Linux下开发一般的图形程序时,使用得较多的函数是图形用户界面支持库中的Gtk+、QT。考虑到授权的问题,我们选择Gtk+来开发我们的用户界面。
Gtk+有以下几个重要概念:
构件(widget):在Gtk+库里的窗口、菜单和按钮等应用实体,称为构件(widget)。
容器(container):可以像容器一样容纳其它构件的构件。
消息及回调函数:程序必须能对用户的操作作出反应,在基于图形界面的程序设计中,“消息”或“信号”是必要的。用户点击菜单、各种按钮、输入用户数据、查询运行结果和拖放都会产生消息或信号。信号可能需要由软件来加以处理,这时程序员就需要编写消息回调函数。
明确了以上的概念以后,图形界面程序的流程如下:首先调用gtk_init()函数初始化GTK+库;然后建立构件,安排各个构件的位置与层次关系;接下来对于程序应当响应的消息或信号,编写构件的回调函数;下一步调用循环函数gtk_main(),此时应用程序停在那里等待消息或信号的产生以执行相应的回调函数;当接收到关闭窗口的信号后,调用相应的回调函数;最终退出应用程序。
另外,我们可以利用Glade工具快速地设计图形用户界面,用它生成除了回调函数函数体以外的所有用户界面模块的代码。
图1:基于SIP的IP软电话实现的总体结构(注:图中的箭头表示调用关系)
73・・北京电子科技学院学报2005年
3.4功能层SIP用户代理模块的实现方法
该模块主要是通过调用oSIP库来实现。
首先我们需要了解oSIP主要包括六个模块,分别提供了相应的API:
TheParserModules:解析器模块,主要完成对SIP消息头结构解析、SDP(SessionDescriptionProtocol,会话描述协议)消息体的结构解析以及URI结构的解析。
TheSDPModules:该模块主要定义了关于SDP的接口函数和用SDP消息体进行媒体协商的机制。
TheOSPortModules:主要定义了关于线程、信号灯和互斥量的函数接口。
StateMachines:该状态机模块主要定义了ICT(InviteClientTransaction,客户端请求事务)、NICT(Non-inviteClientTransaction,客户端非请求事务)、IST(InviteServerTransaction,服务器端请求事务)、NIST(Non-inviteServerTransaction,服务器端非请求事务)四个状态机,分别与SIP协议(RFC3261)中的四个状态机对应,完成对某个事务(注册过程,呼叫过程等等)的状态记录,并在特定状态下触发相应的事件或回调函数。
oSIPDialogHandling:该模块用于维护和处理对话,能够帮助记录请求和响应消息,使终端能够快速准确地作出应答。
oSIPListHandling:这是一个工具模块,主要用于该协议栈中各种队列的管理。
基于oSIP开发SIP用户代理模块需要完成以下几个步骤。首先在使用oSIP前,必须先初始化oSIP,主要调用函数osip_global_init()和osip_init()。第二步在程序中注册回调函数,需要注册的回调函数主要包含发送消息、结束事务、发送失败、4个状态机(ICT、NICT、IST、NIST)相关函数。第三步是事务操作。在注册完回调函数后,SIP用户代理可以建立事务来调用oSIP的解析器和状态机模块的操作,实现对连接的控制。完成诸如连接的建立,媒体属性协商、修改等功能。
基于SIP的IP软电话中,连接控制部分的工作过程可以简要地概括为:初始化oSIP和注册回调函数;然后是添加事件、执行事务、取消事件、解析消息、触发回调函数;最后是在网络接口SOCKET上接收/发送消息来建立连接或修改/终结一个会话。
当软电话中的连接建立起来以后,就可以进行通信了。以语音通信来说,此时应用程序只需保存oSIP协议栈的状态,然后调用语音处理模块来接收/发送语音包就可以实现基于SIP的语音通信了。
3.5实现中的一些技术
对于多文件程序的开发,通常在写完代码后,编写一个叫Makefile的文件,然后使用make命令进行编译。但是手动编写的Makefile不易维护,因此在我们的项目中使用了GNUAutoTools。使用该工具能自动生成Makefile。
我们使用Autoconf来生成自动配置软件源代码脚本(configure),用Automake读取程序员编写的Makefile.am文件,从而产生Makefile.in文件。最后运行Autoconf产生的脚本configure就可以将automake生成的Makefile.in文件转化为Makefile。
另外,如果要分发源码包,在已经生成Makefile的情况下,运行makedist命令会将程序和相关的文档封装为一个压缩文档以供发布。
在程序的设计过程中,我们还考虑了软件的国际化,利用GNU的gettext工具使得软件可以支持中文和英文两种语言。
另外在开发过程中,我们还充分利用了网络上的开源资源,使用了几个比较稳定的开源库来缩短开发周期。例如语音压缩模块、语音编解码模块、RTP/RTCP模块都利用了已有的开源库,对它们进行相应的裁减以适合我们的要求。3.6进一步的工作
在后续的开发中,可以考虑将该程序移植到嵌入式系统中去,另外还可以借鉴当前流行的通信软件例如QQ、MSN等来进一步开发新的功能,如语音信箱,视频等。
4总结
本文描述了一个基于SIP协议的IP软电话的设计和实现方法。结果表明,本文设计实现的IP软电话完成了设计所要求的功能。本软电话的设计,对于在Linux下开发支持SIP的软件是一个良好的借鉴,具有比较实际的意义。
参考文献:
[1]RosenbergJ,SchulzrinneH,CamarilloG,etal.SIP:SessionInitiationProtocol[A].RFC3261,IETF[C].2002.
[2]HandleyM,JacobsonV.SDP:SessionDescriptionProtocol[A].RFC2327,IETF[C].1998.
[3]SchulzinneH,CasnerSL,FrederickR,etal.RTP:ATransportProtocolforReal-TimeApplications[A].RFC1889,IETF[C].1996.
[4]SchulzrinneH,RaoA,LanphierR.RealTimeStreamingProtocol(RTSP)[A].RFC2326,IETF[C].1998.
[5]陈建亚,余浩.软交换与下一代网络[M].北京:北京邮电大学出版社,2003.
作者简介:
高丽平(1981—),女,湖南常德人,西安电子科技大学综合业务网理论及关键技术国家重点实验室硕士研究生,研究方向为数据网络信令协议;
邱志亮,男,西安电子科技大学教授,硕士生导师。
74・・
高丽平邱志亮:Linux上基于SIP的IP软电话的设计与实现
第13卷
DesignandImplementationofASIPBasedIPSoftPhoneinLinux
GAOLi-pingQIUZhe-liang
(StateKeyLaboratoryofIntegratedServicesNetworks,XidianUniversity,Xi’an710071,China)
Abstract:ThispaperfirstbrieflyintroducesSessionInitiationProtocol(SIP)andoSIP,anOpenSourceSIPstack,thenpresentsimplementationofaSIPbasedIPsoftphonewithlayeredsoftwarearchitecture,focusingontheimplementationoftwolayersandsometechnologies.
Keywords:SIP;oSIPstack;IPsoftphone;Linux
AnalysisandProcessingofSpeechData
MaDao-junZhangJing-huai
(Dept.ofComputerScienceandTechnology,BESTI,Beijing100070,China)
Abstract:Itisasignificantsubjectincomputerandcontrolfieldtoanalyze,processanddistinguishthespeech。Asaresultofdataspeechfiles,itbringsanewwayandconveniencetoresearch.Inthispaper,wefindsomeimportantconclusionsbyanalyzingandprocessingthedatainspeechfile,comparingdifferentresultsandlookingintothechangeofspectrum,itispossibletooffersomebasesformoreprocessingaboutthespeechdata,suchasdistinguishingwhoisspeakingandsoon.Keywords:speechdata;analysis;processes;distinguish
(上接第63页)
75・・下载本文