嵌入式SIP服务器

2024-05-21

嵌入式SIP服务器(共4篇)

嵌入式SIP服务器 篇1

0 引言

随着国内外电信设备体系的不断完善,电信网技术也发生了深刻变革,通信市场的竞争也愈演愈烈。Vo IP技术采用IP网络传送音频、视频等业务,顺应了这种发展的要求,成为当今最热门的通信技术之一,各个运营商都相继推出了IP电话业务,对传统电话业务造成了很大的冲击。目前,电信网络多采用会话初始协议SIP,而SIP服务器负责建立网络中所有的SIP终端的会话,是整个SIP系统的控制和管理中心。

传统的SIP服务器运行于PC机,具有成本高、功耗大、部署难度大的缺点。目前,嵌入式系统作为未来信息产业主要的发展方向,它不但克服了传统计算机的缺点,而且具有实时性好、灵活、低成本、低功耗等优点[1]。本文针对传统SIP服务器的缺点,提出了嵌入式SIP服务器的具体设计方案,包括如何实现对各种消息事件的操作处理,通过这些操作,可实现呼叫发起、交换、维持、终止等功能。与传统SIP服务器相比,嵌入式SIP服务器具备了功耗低、可靠性高、易扩展等优点,在IP电话、视频监控、多媒体会议等实时通信领域中具有广阔的前景,在中小型企业中具有较强的实用价值。

1 SIP协议

SIP协议是一种信令控制协议,通常被用来创建、修改以及终止客户端之间的会话进程,这些会话可以是IP电话、音视频会议等。会话的参与者可以通过单播、组播的方式进行通信。与H.323协议相比,SIP协议更具有可扩展特性、互操作能力和开放性,将成为各大电信运营商构建其未来电话网络的基础协议。

SIP协议是一个基于文本的协议,它使用UTF-8字符集(RFC 2279)。SIP消息分为请求消息和响应消息;其中请求消息是从客户端向服务器发送的请求,响应消息是从服务器向客户端回送的响应[2]。SIP请求消息的起始行有Request-Line,作为与其它消息的区分,请求消息定义了6种请求执行的操作,如表1所示。SIP响应消息的起始行中有一个Status-Line,作为与请求消息的区分,响应消息中也定义了6种状态,如表2所示。

SIP系统采用C/S(客户端/服务器)架构,包含两种元素:SIP用户代理(UA)和SIP服务器。SIP用户代理是SIP通信终端,它是请求消息产生的起点和接收响应的终点,通过SIP服务器和其他SIP用户代理建立会话。图1描述了两个SIP终端之间会话的建立过程,两个用户代理UA1和UA2通过SIP服务器传送请求消息和响应消息,实现会话的建立、保持和终止。

2 系统体系结构与工作原理

2.1 嵌入式SIP服务器逻辑体系结构

嵌入式SIP服务器,由硬件平台,操作系统,SIP底层协议栈,注册服务器模块,代理服务器模块,重定向服务器模块组成,各个模块之间协同完成用户的注册和定位,会话的建立、终止、控制和处理等各种信令交互功能[3]。系统整体逻辑体系结构如图2所示。

2.2 系统工作原理

嵌入式SIP服务器是一个分布式的服务器,工作模型如图3所示。

代理服务器是SIP消息进入整个SIP服务器的起点,SIP用户代理通过以太网发送的SIP消息首先进入代理服务器,再由代理服务器进一步转发。如果是注册消息则将该消息发送到注册服务器,注册服务器对位置服务器进行查询、存储等操作,图3中的位置服务器是一个后端数据库。如果代理服务器需要知道下一跳的服务器或UA的地址,则向重定向服务器查询该地址,重定向服务器将从位置服务器获得的查询结果以3xx消息返回给代理服务器,代理服务器再进一步转发,最终将SIP消息发送到目的地,从而实现SIP用户代理之间呼叫的建立。

3 系统硬件设计

硬件平台以CPU处理器为核心,结合存储系统和外围接口电路,是嵌入式操作系统和应用程序运行的基础。目前,嵌入式处理器种类繁多,比较常见的有ARM、MIPS等系列的处理器。嵌入式SIP服务器作为一个网络通信服务器,对处理器的性能要求很高,经过查阅资料,比较各种处理器之后,选择了Samsung S5PV210处理器,该处理器基于ARM Cortex-A8内核,ARM V7指令集,主频可达1 GHz,并采用64/32位内部总线结构,32/32 KB的数据/指令一级缓存,512 KB的二级缓存,可以实现每秒运算2亿条指令集的高性能运算能力,符合该系统作为服务器的需要。其次,选择存储系统,存储系统包括512 MB的DDR2 RAM内存,和512 MB的NAND Flash。RAM作为系统运行时的主要区域。NAND Flash用于存放嵌入式操作系统、应用程序和用户数据等,并作嵌入式文件系统。以ARM处理器为核心,还设计了所需的外围接口,电源接口是为整个系统提供能量的入口,系统采用5 V直流电源供电,选用的电源插座型号为DC023B,外接5 V电源适配器即可为系统供电;SD卡接口用于下载操作系统镜像文件到存储系统中;以太网口提供了嵌入式SIP服务器接入以太网的物理通道,它采用了DM9000网卡芯片,可以自适应10/100M网络,RJ45连接头内部已经包含了耦合线圈,使用普通的网线即可将硬件电路板连接至路由器;串口用于连接目标板到PC机,可通过PC机上的Secure CRT终端仿真器控制和调试目标板,并将应用程序的可执行文件下载到Flash存储系统中;此外,还设计了USB扩展接口,供扩展开发使用。嵌入式SIP服务器硬件结构如图4所示。

4 系统软件设计

4.1 嵌入式操作系统

SIP服务器是应用层软件,它依赖于嵌入式操作系统提供的任务调度、内存管理、中断处理、共享资源的互斥访问等机制来提供实时服务。目前嵌入式操作系统发展迅速,常见的有Linux、Win CE、Vx Works等。本文设计的嵌入式SIP服务器采用Linux系统作为嵌入式操作系统,它是免费且开源的操作系统,具备很高的移植性。由于嵌入式系统存储空间小,还不足以直接安装一个Linux操作系统,因此,必须将现有的Linux操作系统裁剪,并修改硬件平台必要的设备驱动,将精简的Linux操作系统拷贝到SD卡,烧写到Flash存储器中。

4.2 SIP协议栈的设计

SIP协议栈是SIP协议应用的核心,SIP服务器的各模块都通过SIP协议栈来传输和转发信令。本文设计的SIP协议栈主要包括状态机模块、工具模块以及解析模块。协议栈体系结构如图5所示。

状态机模块:负责对注册、呼叫等事务的状态记录。状态机是SIP协议栈的核心,为了便于保持逻辑的清晰和代码模块化的实现,本文设计的SIP协议栈包含两对状态机,分别用来处理正常的Invite流程和非Invite流程,每一对状态机又有out状态和in状态,因此SIP协议栈有四个状态机:Invite客户端事务状态机、Invite服务端事务状态机、非Invite客户端事务状态机、非Invite服务端事务状态机。对不同的状态,采用不同的状态机处理,在这些状态机下,SIP协议栈对SIP消息进行处理,从而改变自身状态。

解析模块:负责解析SIP消息、URL结构以及SDP消息。

工具模块:该模块包括对话工具和SDP协商工具。对话工具是一个辅助工具,主要用于应答呼叫的终端,并且帮助记录请求消息和响应消息,利用这个工具使用户代理能做出准确地应答。SDP协商工具主要帮助SIP用户代理提供协商编解码的功能。

4.3 SIP服务模块设计

SIP服务器,是在SIP协议栈的基础上进一步实现,它是一个模块化的应用程序,功能是通过相应的插件来实现的。系统实现了SIP服务器的注册,代理和重定向等功能,并支持多线程,由主线程和多个监听线程组成,各线程的功能如表3所示。

程序启动时,主线程首先读取配置文件中各插件的配置参数,然后初始化SIP协议栈,并启动主线程和相应监听线程,完成相应的功能,线程之间的通信主要通过管道和共享内存等机制来完成。最后,用户终止线程执行,程序结束。SIP服务器程序流程如图6所示。

4.3.1 注册服务器模块设计

为了使代理服务器能找到SIP终端的位置,SIP终端必须先将地址信息发送到注册服务器,注册服务器接受来自SIP终端的注册消息(REGISTER请求),负责将注册消息中的地址信息(IP地址、端口和用户名)传送到位置服务器进行记录。注册分为以下几个步骤:

(1)SIP终端发出REGISTER注册请求;

(2)注册服务器取出头字段中的用户IP地址和Contact地址信息,将它们作为一对映射信息保存到位置服务器;

(3)注册服务器向用户代理客户端回送注册成功或失败消息。

4.3.2 代理服务器模块设计

代理服务器是SIP消息进入整个SIP服务器的起点,负责分析接收到的SIP消息,并回送响应消息。代理服务器同时担当着客户端和服务器角色,主要负责SIP消息的路由和转发,一方面路由SIP请求到UAS(用户代理服务器),另一方面路由SIP响应到UAC(用户代理客户端)。本文设计了一个有状态代理服务器,它在处理SIP请求消息时,一直维护着这个SIP消息的客户端事务以及服务器端事务,而且始终维护着这个SIP请求消息和对应的响应信息。代理服务器处理INVITE请求消息分为以下几个过程:

(1)代理服务器接收到INVITE请求消息;

(2)查询被叫用户的地址信息;

(3)若找到被叫地址信息,则转发INVITE请求到被叫,若没找到,则向主叫回送404响应。

4.3.3 重定向服务器模块设计

重定向服务器仅对呼叫请求消息回送包含位置信息的响应消息。它为UAC提供重新呼叫UAS的地址信息,当它接收到UAC的请求消息后,会查找UAS的地址信息,并向UAC返回这个地址信息,UAC向新的地址发起会话请求。重定向服务器处理一个INVITE请求分为以下几个过程:

(1)UAC向重定向服务器发送INVITE请求消息;

(2)查询UAS的地址信息,并返回查询结果;

(3)重定向服务器向UAC发送3XX响应消息,并向UAC返回UAS的地址信息。

4.4 嵌入式SIP服务器的负载均衡设计

当SIP终端的数量不断增加时,流入嵌入式SIP服务器的消息量逐渐增大,如果负载超出了服务器处理能力,会造成SIP消息的拥塞。为保证在高负载情况下嵌入式SIP服务器的处理效率,系统采用了基于重定向的负载均衡技术,在SIP消息的处理过程中,当挂接在某台嵌入式SIP服务器上的SIP终端数量超过了自身处理能力时,可将SIP请求消息重定向发送到网络中负载量较小的SIP服务器进行处理。具体实现是通过SIP服务器和数据库间建立心跳来实现服务器的负载统计和实时监控,当SIP服务器收到INVITE请求时,首先查询数据库中呼叫负载率最小的服务器,并将查询到的服务器IP地址返回给UAC,UAC重新发起INVITE请求到负载率最小的服务器。

5 应用测试

5.1 呼叫建立时间测试

呼叫建立时间,是指SIP终端从发送INVITE请求到接收到180 Ringing响应(拨通另一方)所需要的时间。将嵌入式SIP服务器接入路由器,连接到局域网,并启动运行,IP地址设定为192.168.1.111。另选两台Windows XP操作系统的PC机,与嵌入式SIP服务器接入同一个局域网,一台PC机IP地址为192.168.1.101,装有SIP软电话eye Beam,记为UA1,并装有Wireshark抓包软件,它能抓获UA1与嵌入式SIP服务器通信过程中的所有SIP消息;另一台PC机IP地址为192.168.1.102,也装有SIP软电话eye Beam,记为UA2。

测试时,将UA1和UA2在嵌入式SIP服务器上注册,账号分别为401和402。由UA1拨打UA2,并由Wireshark分析UA1发起INVITE请求的时刻和接收到180Ringing响应的时刻。测试5次,得到呼叫建立时间测试数据如表4所示。

另选一台PC机,接入同一个局域网,IP地址设定为192.168.1.100,在PC机上运行传统SIP服务器,将UA1和UA2注册到这个SIP服务器。由UA1拨打UA2,并由Wireshark分析UA1发起INVITE请求的时刻和接收到180 Ringing响应的时刻。测试5次,得到呼叫建立时间测试数据如表5所示。

对照表4和表5的数据分析,采用嵌入式SIP服务器为两个SIP终端建立呼叫时,每次呼叫建立时间均在0.1秒以内,平均时间为0.078517秒;而采用传统SIP服务器为两个SIP终端建立呼叫时,每次呼叫建立时间都大于0.1秒,平均时间为0.123022秒。从对照测试结果可以看出,在同样的条件下,使用嵌入式SIP服务器可以缩短呼叫建立时间,更能满足用户的需要。

5.2 并发性能测试

测试嵌入式SIP服务器处理并发呼叫的接通率。在测试时,采用了SIPp,它是一款对SIP协议进行性能测试的软件系统,能提供呼叫发起端(UAC)和呼叫接收端(UAS)的功能,模拟发起一个或者多个呼叫,通过呼叫完成对嵌入式SIP服务器的性能测试,在不同时间段,用SIPp测试5次,每次由SIPp模拟产生100个以上的并发呼叫,测试结果如表6所示。同样,将传统SIP服务器接入局域网,然后用SIPp每次模拟产生相同数量的并发呼叫,测试结果如表7所示。

对照表6和表7的数据分析,呼叫总数均为1750次,采用嵌入式SIP服务器时,成功呼叫总数为1668个,呼叫接通率为95.3%;采用传统SIP服务器时,成功呼叫总数为1589个,呼叫接通率为90.8%。测试结果表明,在相同的条件下,嵌入式SIP服务器比传统SIP服务器性能更稳定、可靠。

6 结语

本文首先介绍了嵌入式SIP服务器相对于传统SIP服务器的优势,并对SIP协议作了简单介绍,选用Samsung S5PV210嵌入式处理器和Linux操作系统,设计了底层SIP协议栈,实现了SIP服务器的注册、代理、重定向功能。最后对嵌入式SIP服务器进行了应用测试,结果表明:该系统能为SIP终端之间提供音视频会话的建立、保持和终止等服务,并且运行稳定,性能可靠,性价比高,在中小型企业内部的语音通话、视频监控、多媒体会议中具有较强的实用价值。

摘要:针对现有SIP服务器成本高、功耗大、稳定性低的缺点,设计一个能为SIP终端之间通信提供服务的嵌入式SIP服务器。系统采用ARM Cortex-A8内核的Samsung S5PV210处理器和嵌入式Linux操作系统,设计底层SIP协议栈,实现SIP服务器的注册、代理和重定向功能,并采用基于重定向的负载均衡技术来保证嵌入式SIP服务器在高负载情况下的处理效率。经过实测实验,该系统能为SIP终端之间通信提供服务,具有实时性好、功耗低、可靠性高的特点。

关键词:嵌入式SIP服务器,SIP协议,SIP协议栈,负载均衡

参考文献

[1]Lee C H,Huang C M,Tseng P H.Multihomed SIP-based network mobility for the scheduled public transit service[J].Wirel.Commun.Mob.Comput,2014,14(1):79-90.

[2]Rosenberg J,Sshulzrinne H,Camarillo G,et al.SIP:Session Initiation Protocal[S].RFC 3261,2002.

[3]胡建洲,田裕鹏.基于FreeS witch和DSP的多媒体会议系统的设计与实现[J].计算机应用与软件,2013,30(8):263-266.

[4]Wang Yulong,Wang Dong,Wang Lei.A Parsing Mode based Method for Malformed SIP Messages Testing for IMS Network[J].Journal of Networks,2013,8(4):812-821.

[5]唐宏斌,刘心松.对TAKASIP协议的分析和改进[J].计算机应用,2012,32(2):468-471.

[6]李钦德,周文安,马飞,等.基于RTP/RTCP的VoI P智能切换技术的实现方法研究[J].计算机科学,2011,38(2):68-71.

[7]Yang Hong,Huang Changcheng,Yan James.Applying control theoretic approach to mitigate SIP overload[J].Telecommunication Systems,2013,54(4):387-404.

[8]Voznak M,Safarik J.DoS attacks targeting SIP server and improvements of robustness[J].International Journal of Mathematics and Computers in Simulation,2012,6(1):177-184.

[9]李鸿彬,林浒,吕昕,等.一种高效抵御SIP洪泛攻击的防御模型[J].计算机工程,2013,39(2):119-124.

[10]Miroslav Voznak,Jan Rozhon.Approach to stress tests in SIP environment based on marginal analysis[J].Telecommunication Systems,2013,52(3):1583-1593.

嵌入式SIP服务器 篇2

关键词:SIP,回调函数,VoIP,会话

0 引 言

SIP协议简单、易于实现、可扩展性强[1], 在VoIP系统领域广泛应用, 并已成为下一代网络应用层的核心协议[2]。oSIP作为开源的SIP协议栈, 结构简单、小巧快速、功能丰富、易于移植, 非常适合移植到嵌入式系统中进行应用开发。

基于模块化的思想, 本系统框架结构层次划分非常详细。模块间通信采用统一的消息通信机制, 并广泛采用回调函数方式进行层次间的协作, 所以本系统终端效率高, 并且易于扩展。

1 系统结构

本系统平台采用ARM和DSP双处理器架构, 其中DSP负责音频数据编解码, ARM主要负责网络通信、协议栈运行及外设控制, 而ARM和DSP之间采用HPI (Host Port Interface) 接口进行通信。ARM上运行Linux操作系统, 稳定可靠、网络功能强大、移植性好, 易于应用开发。系统软件结构设计如图1所示。

应用层包括键盘操作和LCD显示等部分, 简称App层。主要作用是为用户提供一个具有会话功能的电话操作界面, 包括呼叫、接听、通话及挂断功能。

VOIP控制模块提供VOIP启动/关闭、接收应用层传来的消息, 并为SIGNAL模块、SIP等协议处理模块提供回调函数。这个模块简称VOIP模块。

SIGNAL模块对来自应用层的消息进行处理, 解析这个消息后调用协议层的回调函数对消息进行处理;接收来自协议层的消息通知, 将这个消息转发给应用层, 应用层收到消息后执行相应的动作。

抽象协议层对SIP库、RTP库进行封装, 为VOIP控制模块提供接口函数。这个层简称MiddleWare层。

协议层使用开源的协议库。SIP协议采用开源的oSIP2, RTP库使用开源的oRTP库。这个层简称Protocol层。

驱动层是高层应用软件和硬件设备进行交互的接口。这个层简称Driver层。

2 系统设计

本系统采用模块化的思想, 各模块均维护自己独立的会话结构, 并利用消息机制进行接口间通信, 同时广泛采用回调函数方式, 尽量减小各模块之间的耦合性。系统支持多路会话, 各路会话相互独立, 通过统一的标识ID进行区分。使用多通道的方式与DSP进行交互, 每路会话对应不同的通道。

2.1 接口通信机制

应用模块、SIGNAL模块、VOIP控制模块和协议模块之间采用统一的消息进行通信, 这些消息定义为API通用消息。

(1) API通用消息的分类

API通用消息分为两类:Tel API消息和Cfg API消息。

Tel API消息:Tel API是双向接口, 消息分为请求消息和响应消息。请求消息是应用层向下发送到VOIP 控制模块以及抽象协议模块的消息。这些消息是由用户事件触发的, 如注册、注销、摘机、挂机、拨号、发起呼叫、接受呼叫、拒绝呼叫、结束呼叫等等。响应消息是抽象协议模块向上发送到应用层的通知或响应消息, 如注册成功或失败、摘挂机确认、呼入、呼叫成功或失败等等。

Cfg API消息:Cfg API是单向消息接口, 即只从应用层向下发送到VOIP控制模块, 并由VOIP控制模块分发到各个“Middleware”, 完成对协议或设备的配置操作。

(2) API通用消息的使用方法

App层与VOIP 控制层之间, 通过UNIX域套接口发送和接收的“软”接口 (在图1中用虚线表示) 实现消息传递。采用UNIX通信域套接口实现单机内部的进程间通信比较灵活, 而且UNIX通信域套接口通常是TCP套接口速度的两倍, 效率相对较高。VOIP 控制模块与其所属各个Middleware模块之间则使用直接函数调用的“硬”接口 (在图1中用实线表示) 。

(3) Tel API消息结构

Tel API的消息结构可分为四部分:

呼叫标识:包括pflcallid和vclcallid, 唯一标识一路呼叫。呼叫标识和每路会话的标识ID相互绑定, 采用双ID的方式贯穿于所有模块中。pflcallid由应用模块进行管理, 在用户发起会话时分配;vclcallid由协议模块进行管理, 在接收到一个会话请求时分配。

通道标识:通道标识描述了该消息属于哪个通道, 这个通道对应DSP的通道。

消息类型:消息类型描述了事件 (用户的操作, 或者SIP协议的执行结果) 的类型。

消息内容:描述事件的具体信息。

(4) Cfg API消息结构

CfgAPI的消息结构包括三部分:消息类型、消息体长度和消息体。其中包括四种类型:本地电话配置表、SIP配置表、RTP配置表和代理服务器配置表。

2.2 回调函数机制

回调函数的使用非常广泛, 在Windows中, 回调函数是应用程序提供给Windows系统DLL或其它DLL调用的函数, 一般用于截获消息、获取系统信息或处理异步事件[3]。应用程序把回调函数的地址指针告诉DLL, 而DLL在适当的时候会调用该函数。本系统所采用的oSIP2库也使用了回调函数的思想, 给封装工作预留了很多设置回调函数的接口, 例如osip_setcb_ist_invite_received (cf, cb_rcvinvite) 函数用来向oSIP2库设置接收到INVITE 消息的回调函数, IST transaction收到INVITE消息后就会调用cb_rcvinvite这个函数作进一步的处理。

回调和API非常接近, 它们的共性都是跨层调用的函数, 用于层间协作。但区别是API是低层提供给高层的调用, 一般这个函数对高层都是已知的;而回调正好相反, 是高层提供给低层的调用。对于低层它是未知的, 必须由高层进行安装, 这个安装函数其实就是一个低层提供的API, 安装后低层不知道这个回调的名字, 但它通过一个函数指针来保存这个回调, 在需要调用时, 只需引用这个函数指针和相关的参数指针。

本系统中MW SIP模块实现了oSIP2库的回调函数, 在初始化oSIP2库时设置进oSIP2库。其他模块也实现下层模块的回调函数, 在VOIP控制模块统一设置。

3 主要模块实现

MW SIP模块实现对oSIP2库的封装, 为上层模块提供调用接口, 并实现oSIP2库的回调函数。

MW SIP模块维护一个会话信息sip_session结构, MW SIP模块在初始化时分配一定数量sip_session结构。每一路sip_session和oSIP2库的transaction->your_instance指针一一对应, 会话建立后也赋值给dialog->your_instance指针, 这样从transaction也可以找到对应的sip_session, 从dialog也可以找到对应的sip_session。

系统启动后, 首先初始化各个模块, 启动MW SIP模块的监听端口。当一端用户发起呼叫, 双方的SIP模块之间开始进行SIP消息通信。通过双方协商媒体类型并判断用户是否愿意接受请求, MW SIP模块决定是否建立会话。SIP会话建立后, SIP终端间便开始传输数据。下面具体介绍MW SIP模块的函数实现。

3.1 MW SIP模块对外接口API函数

MW SIP模块需要封装以下函数才能满足上层的应用, 如表1所示。

以SIP_beginCaller函数为例, 函数实现如下:

【功能】

发起一路呼叫。

【描述】

int SIP_beginCaller (void *pPeer, void *pPhone) 。

【参数】

pPeer:对端电话信息。

pPhone:本端电话信息。

【返回值】

成功返回0;失败返回-1。

【实现流程】

如图2所示。

3.2 MW SIP模块对SIP库的回调函数列表

MW SIP模块在对SIP库的回调函数中进行针对应用层的处理, 回调函数包括收到SIP消息和发送SIP消息的回调函数, 如表2所示, 其中仅列出收到SIP消息的回调函数。例如可以通知应用层一些事件, 可以用sip_session保留一些呼叫的信息, 以便应答或挂断的时候根据这个保留信息生成对应的信息等等。

以cb_rcvinvte函数为例, 函数实现如下:

【功能】

收到INVITE消息的处理。

【描述】

void cb_rcvinvite (transaction_t *tr, sip_t *sip) 。

【参数】

tr:oSIP2库transaction指针。

sip:消息指针。

【返回值】

Void。

【实现流程】

如图3所示。

其中uaapp_rcv_invite函数实现如下:

【功能】

收到INVITE消息的处理。

【描述】

void uaapp_rcv_invite (transaction_t *tr, sip_t *invite) 。

【参数】

tr:oSIP2库transaction指针。

invite:消息指针。

【返回值】

Void。

【实现流程】

如图4所示。

4 测试环境

测试服务器选用asterisk服务器并安装插件app_conference使其具有会议功能, 该服务器是一个将注册服务器、代理服务器、位置服务器和重定向服务器融为一体的SIP服务器。测试流程, 首先将两个SIP终端注册到asterisk服务器上;其次由一个SIP终端呼叫另一个SIP终端或者召开会议测试SIP终端对会议功能的支持。图5是使用Ethereal抓包工具监控两个SIP终端通过asterisk建立会话并结束会话的过程, 发起会话的SIP终端A和应答会话的SIP终端B的IP地址分别为192.168.1.112和192.168.1.110, asterisk服务器的IP地址为192.168.1.20。由Ethereal捕获的SIP消息可以看到, A发送INVITE请求消息发起呼叫, B接收到后回复200 OK消息, A再发送ACK请求消息, 这个消息流程完全符合RFC3261的SIP协议规范。同时在32路SIP会话同时进行的网络负载下进行100次测试呼叫, 成功率为100%。

5 结 论

SIP协议的不断发展和完善, 使其越来越受到关注。本文设计的系统实现了具有基本呼叫功能的SIP终端, 测试结果表明系统运行稳定且高效, 并且易于扩展实现事件通知机制和参考方法等SIP扩展方法以支持会议终端功能, 可以广泛应用于许多多媒体会议系统中[4]。

参考文献

[1]Rosenberg J, Schulzrinne H.Session Initiation Protocol[S].RFC3261, 2002.

[2]沈鑫剡.多媒体传输网络与VOIP系统设计[M].北京:人民邮电出版社, 2005.

[3]熊华, 刘凤新, 潘小莉.Windows动态链接库原理分析及其应用[J].北京:北京化工大学学报, 2004.

嵌入式SIP服务器 篇3

本文以S3C2410为核心,通过几个功能模块的扩展,开发出一个基于SIP的嵌入式无线视频电话终端。该终端除了具备数字化和网络化特点外,还采用了开放的SIP同其他电话设备进行通信,从而将网络中任何一台主机变成终端。同时,基于WIFI的无线网络技术使得多媒体终端具备随时部署的特点,并且逐步得到企业的认可。

1 总体方案设计

1.1 硬件系统结构

本电话终端系统的硬件方案为:使用三星公司的通用ARM芯片S3C2410配合嵌入式操作系统WINCE5.0.NET实现各种外围接口,视音频编解码处理和传输控制协议等。这样既不存在芯片成本高的问题,又能保持很高的性能,可通过简单的程序下载实现软件升级或增加新的编解码标准。系统的硬件结构框图如图1所示。实现该系统的要点是:在WINCE下添加USB摄像头和USB无线网卡驱动模块。

1.2 系统软件结构

系统硬件配置完成后,就需要定制平台和编写代码实现各个功能模块,最终实现整个系统。系统的软件结构如图2所示。

(1)用户层:用户的使用层,实现用户用键盘拨号、接听和挂断电话等操作。

(2)接口层:完成两个功能,一是作为应用层和传输层的接口—建立套接字(SOCKET);二是拥有调用模块层各个模块的接口函数。

(3)模块层:系统核心层包括:SIP模块、数据传输模块、语音和视频模块。SIP模块实现OSIP协议栈的3个模块:解析器、有限状态机和工具模块。数据传输模块中传输层使用UDP协议,用RTP/RTCP进行实时传输和控制。语音模块和视频模块分别完成语音和视频的采集与编解码。

2 无线视频电话终端的设计与实现

2.1 系统平台设计

在WinCE产品开发中,内核定制和应用程序开发是非常重要的工作。

2.2 音频编码模块的实现

系统初始化以后,音频采集编码模块对应的子线程就被创建并挂起,当用户需要采集音频数据时再分别被唤醒。音频采集编码模块主要完成语音的录制和编码。首先打开波形音频输入设备,准备好缓冲区,然后利用声卡把语音录入到准备好的缓冲区。一个缓冲区录满后,就可以对缓冲区中的数据进行编码。其中音频采集通过调用Windows低级音频API函数族WaveIn和WaveOut来实现。编码通过调用G.7XX音频接口提供的编解码器接口实现。

2.3 视频采集编码模块的实现

笔者采用了OmniVision公司的OV7650 CMOS VGA芯片。该芯片是一款高性能图像压缩芯片,输出MJPEG视频流数据。它的误差稳定性非常好,可以获取清晰度很高的视频图像,还可以灵活设置各路视频清晰度,压缩帧数。本系统直接从摄像头驱动中获取MJPEG视频流数据,图像采集流程如图3所示。图像采集模块用到的主要函数有:

capInitCamera():用来初始化视频设备,并获取当前可用的视频设备数目。

capSetVideoFormat():设置视频格式和分辨率。本系统使用的视频格式为RGB24,分辨率为320×240像素。

capGrabFrame ():从驱动中抓取1帧图像,并存储在缓存FrameBuffer中。

capGetLastJpeg ():将抓取的MJPEG格式的图像转换成JPEG格式,送到无线发送模块。

视频采集部分还有查询视频采集格式、设置明暗度、设置对比度等相关函数,这里不再详述。在完成视频采集后,再对视频流进行MPEG-4的视频压缩。视频编码通过调用xvid视频解码器接口提供的编解码器接口实现。音频解码回放模块和视频解码回放模块将接收到的音频和视频数据解码后播放。视频播放则将视频数据格式转化为RGB,再用函数DrawDibDraw将其显示。

2.4 xvid解码算法在实时传输部分的优化

2.4.1 xvid解码对零系数块的处理分析

在解码过程中,如果知道图像宏块/块为零系数块,则可以直接跳过该块的解码过程(包括IQ和IDCT过程),从而大大节省解码的计算量。在MPEG-4编码器模型Xvid的程序中看到,在IDCT部分,参数CBP(编码块模式)是专门用来指示正在进行编码和不再进行编码的宏块的信息。它是一个6bit的稽核,每个都代表了一个宏块的一小块。bit的状态表示了该块是否被编码。如果块的所有系数都为零,则块就没有被编码。这个参数在进行IQ、IDCT、反向扫描和重建之前被检验,这些过程并不对CBP为零的块进行。通过CBP解码过程,在块的基础上的所有冗余计算都被减少了。

在Xvid解码程序decoder.c的decoder_mbinter()函数中,最后有如下判断:

If(cbp)

Decoder_mb_decode(dec,cbp,bs,py_cur,pu_cur,pv_cur,reduced_resolution,pMB);

由此说明在参数CBP为零的情况下是不做宏块解码工作的。

但是这里可以看出,CBP参数为零代表的是整个宏块量化后的DCT系数都为零,这里执行的是对整个宏块后续解码的跳出工作。而对于整个宏块量化后的DCT系数不全为零,只有几个8×8的块量化后的DCT系数为零的情况下,在decode.c的decoder_mb_decode()函数中有如下过程:

从以上程序看出:由于CBP有6bit,每个bit都代表了一个宏块中的一个8×8小块,因此当相应的8×8块为零时,就直接跳过对该8×8块的反向量化和IDCT过程。

2.4.2 xvid解码中IDCT和IQ的优化

在IDCT程序中加入判断语句,把全系数IDCT根据判断前6个(精确度低一些)或者10个DCT系数的值分别进行0系数IDCT变化(直接赋零)、3系数IDCT变换、64系数IDCT变换,这样得到的程序计算量比原程序减少很多。

在这里用If判断,如果这10个DCT系数都为零,则认为此块是全0DCT系数,直接令此块的所有IDCT后的系数为零。如果前3个系数block[0]、block[1]、block[8]不全为零,后7个系数block[2]、block[3]、block[9]、block[10]、block[16]、block[17]、block[24]全为零,则认为此子块系数是3DCT系数的,直接对其进行3系数的IDCT(程序已编好)。如果上述两种都不满足,就对其进行全系数的IDCT。

判断工作在XVID程序的idct.c中进行,在原始的函数idct_int32(short*const block)中加入判断程序。

IQ部分的优化思路和IDCT优化类似,不再详述。

2.5 用户代理的实现

SIP UA模块用于会话的建立、修改、终止,起着信令控制作用。此模块使用的SIP协议栈是OSIP2和EXOSIP。

OSIP2协议栈的开发步骤为:

(1)初始化:主要调用函数osip_global_init()和osip_init(),操作代码如下:

Osip栈需要在运行前初始化。在使用Osip栈之前,osip_global_init()函数是第一个被调用的,并且只能调用一次。调用这个函数将初始化语法分析。

(2)注册回调函数:包括发送消息、结束事务、发送失败和4个状态机相关的函数。

(3)建立事务:在注册完回调函数后,应用可以建立用来调用OSIP的解析器。

EXOSIP有二种工作模式:事件模式和回调模式。本软件采用的是事件模式。使用一个定时器,定时到时就通过函数eXosip_wait_event()去获取SIP事件,SIP事件主要有EXOSIP_CALL_NEW、EXOSIP_CALL_ANSWERED等。事件获取后,调用相应的事件处理函数,如SipCallNew、SipCallRinging、SipCallAnswered等。要建立、修改、终止呼叫还需要调用EXOSIP的osip_build_initial_invite、eX-osip_initiate_call等函数。

2.6 音视频数据传输的实现

利用RTP/RTCP实现语音视频流的实时传输。RTP负责数据发送和接收,RTCP负责网络丢包、误码情况的反馈等。通过调用JRTPLIB提供的库函数就可以开发出高质量的音/视频传输程序。

发送端调用JRTPLIB提供的库函数实现语音视频等的实时发送过程为:(1)通过调用RTPSession类的构造函数创建一个RTP会话实例,然后调用RTPSession类的方法对其初始化,设置负载类型、标识和时戳增量,以及指定流媒体的目标地址;(2)设置RTP会话参数,通过调用RTPSessionParams类的SetOwnTimeStampUnit()方法设置时间戳和RTP传输参数;(3)通过调用SendPacket()方法向目标地址发送采集编码后的音视频数据。接收端的创建RTP会话实例和RTP会话参数设置与发送端的设置相同。

本文设计和实现了一个基于SIP的嵌入式网络无线可视电话终端模型。该终端支持音频和视频的实时通信。终端之间采用开放的SIP进行通信,SIP的应用避免了采用私有协议所带来的封闭性,提高了同其他设备的互通性;同时利用WiFi技术提高了视频电话终端的便携性。SIP协议具有简单、可扩展的特性,将会在下一代网络中占有重要地位。目前对SIP在视频电话系统中的应用还处于试验阶段,能与之通信的SIP设备还不多,但随着NGN平台的建立和SIP设备的不断增多,其灵活性和互通性的优点会逐渐体现出来。支持多人的可视电话终端将是进一步要研究的课题,前景一片光明。

参考文献

[1] ROSENBERG J,SCHULZRINNE H,GANNARILLO G.SIP:Session Initiation Protocol[S].IETF RFC3261,2002.

[2] Osip2[EB/OL].http://ftp:gnu.org/gnu/osip/libosip2. 3. 0. tar.gz.

[3] 微软公司.Microsoft Windows CE 设备驱动程序开发指南[M].北京:希望电子出版有限公司,1999.

[4] 周毓林,宁杨,陆贵强,等.Windows CE.net 内核定制及应用开发.北京:电子工业出版社,2004.

[5] 段小涛,李俊.基于 SIP 网络可视电话的原理与实现[J].微电子学与计算机,2005,22(3) :12-16.

嵌入式SIP服务器 篇4

1设计目的及相关技术

1. 1设计目的

目的是在FPGA平台上,以Micro Blaze软核处理器、Petalinux为操作系统环境下,设计一个能够管理、调度及网络传输经硬件语言压缩编码的视频码流的应用程序( 视频服务器) ,实现FPGA平台与PC机客户端之间的实时视频数据传输。

1. 2相关技术

Petalinux操作系统[3]是面向Micro Blaze软核处理器的全功能嵌入式Linux操作系统,集成了针对Micro Blaze处理器定制的Linux2. 4 /2. 6内核源码、U-boot源码、相关的开发工具及参考硬件配置的压缩包,方便开发人员使用。

BSP[4]( Board Support Package) 是为给定的板子提供特定操作系统支持的代码,是介于主板硬件和操作系统之间的一层,主要目的是为了支持操作系统,使之能够更好地在硬件主板运行。

SIP协议[5]是在应用层通过信令控制的方法,用来建立、终止、修改多个用户参与的多媒体实时会话( 或者会议) ,该协议不定义会话的类型,只定义如何管理会话,而且独立于传输层,将独立于底层设施的用户灵活地结合起来,是不同平台之间建立连接的首选技术。

RTP协议是网络上的一个实时传输协议,用来在互联网上传输音频和视频数据,通常用于实时视频会议、流媒体技术和一键通系统等应用中[6]。RTP技术本身没有提供按时发送机制或其他服务质量保证,依赖于底层服务来实现传输这一过程。RTP在传输过程中,是按数据包传输的,而且遵循有序传输,也就是RTP在传输前,将数据在发送端按照一定的顺序打包,每包有相应的序列号,然后发送给接收端,接收端接收到数据包后,按照相应的序列号解包,这样收到的数据就是连续实时的,序列号也可以用来决定数据包位置关系。

2设计方案

FPGA平台选择XUPV5LX110T目标开发板、Micro B- laze软核处理器和Petalinux操作系统,首先实现了Petal- inux操作系统在XUPV5LX110T开发板上的移植,其次在Cent OS5. 6操作系统上搭建了与Micro Blaze系统相应的交叉编译环境,并在该环境下完成整个应用程序的编译, 然后下载到目标板进行测试。系统的整体设计流程如图1所示。

建立交叉编译环境后,在仿真测试监控系统前,需要设计系统应用程序模块,主要包括建立SIP视频会话、从系统RAM获得视频数据、基于RTP的视频数据传输三个部分,具体工作流程如图2所示。

2. 1 Petalinux移植

在移植Petalinux之前,首先采用Xilinx EDK 10. 1在XUPV5LX110T开发板搭建一个简化的硬件平台,用Xil- inx EDK的BSP产生器配置BSP,其次进行软件平台配置,生成auto-config. in文件,然后需要对内核进行裁减, 并且通过PC机上的虚拟机对内核进行交叉编译,最后将编译生成的image文件通过XMD调试工具下载到目标板中,启动Petalinux操作系统,这样就完成了Petalinux的移植,参考文献[2]中针对Petalinux操作系统的移植给出了详细的移植方案,可作为参考,在此不做详细叙述。

2. 2建立交叉编译环境

本设计在宿主机上以Cent OS5. 6操作系统作为编译应用程序的平台,采用Petalinux开发套件中提供的交叉编译工具Petalinux-uclinux-gcc,将Petalinux安装包解压后,在文件夹Petalinux-v0. 4-final /tools/linux-i386 /mi- croblaze-uckinux-tools / bin下可以找到交叉编译工具。

2. 3实现SIP信令控制

视频服务器作为视频数据的发送端,采用信令控制的方式[3]接收并响应客户端发出的请求,经过三次握手建立会话。建立会话的过程中,视频服务器根据请求消息的内容,获得远程客户端的IP地址以及端口等,为下一步进行RTP数据传输提供必要信息。本设计中首先对SIP协议栈进行交叉编译获得相应的库,然后基于这些库编写了视频服务器SIP模块。

2. 3. 1交叉编译SIP协议栈

SIP协议栈包括o SIP2和e Xo SIP2,是完全用C语言编写的开源代码。其中o SIP2协议栈短小简洁,主要针对SIP底层解析,开发效率较高,但是对于新手较难掌握,官方的示例大都是一些伪代码。而e Xo SIP2是官方发布的o SIP2的扩展开发库,提供了一些实际应用的参考示例程序,开发人员可以根据需求很容易创建一个完整的SIP应用程序。

本设计使用官方网站提供的最新的o SIP2协议栈li- bosip2 - 3. 0. 2,在此基础上形成扩展库libe Xosip2 - 3. 2. 0。具体的编译过程如下:

1 ) 编译osip2库

代码为:

2) 编译libe Xosip2库

编译libe Xosip2库需要osip2库的支持,因此首先将libosip2. a和libosipparser2. a拷贝到路径/ usr / lib / 下,将osip2头文件拷贝到libe Xosip2 / include / 下,然后再进行编译。代码为:

生成e Xosip2. a和e Xosip2. la。顺利完成以上编译过程后,可获得完整的e Xosip库,利用它们提供的良好接口函数可以开发基于Micro Blaze的SIP协议栈应用程序。

2. 3. 2编写SIP模块

SIP模块主要任务是进行会话管理以及媒体协商。 使用SIP会话时只要知道对方的名字而不需知道对方的IP和端口号等信息,极大地简化了通信的过程,而且能突破局域网的限制进行互联网通信。但是在建立会话之初, 需要用户先在注册服务器上注册用户的信息。注册服务器获得了该用户的IP地址和SIP名称信息后,其他用户方可与该用户建立会话。

1) 初始化SIP库

此过程主要是为SIP协议栈提供函数支撑。在初始化e Xosip库时,调用e Xosip_init( ) 函数对整个SIP协议栈进行初始化,e Xosip_set_user_agent( “V5”) 用来设置本地SIP用户名称为“V5 ”。e Xosip _ listen _ addr ( IPPROTO _ UDP,NULL,0,AF_INET,0) 用来设置使用的网络协议标准为UDP。倘若上述函数调用失败立即调用e Xosip_quit( ) 函数结束SIP进程。

2) SIP注册

此过程需要SIP视频服务器向注册服务器发送注册请求,注册请求内容用UDP协议来描述,注册服务器收到请求确认并应答实现用户注册。本设计注册内容为: 代理服务器的IP地址为192. 168. 0. 203; 端口号5060; Micro B- laze处理器IP地址为198. 168. 0. 10,处理器用户名为V5; Expires选项用来设定本次注册的有效时间为1 800 s,超过此时间且未建立会话或请求的用户注册就会过期,需要重新注册。用户V5收到注册服务器应答信号后会在SIP事件检测循环中做出处理,注册过程结束。

3) 事件监听

此过程主要是对监听到的全部SIP事件做出相应处理,处理包括客户端的呼叫请求以及与客户端建立连接。

e Xosip_event_t : e Xosip事件结构体,它包含的成员type是用来判断SIP事件的类型,根据该事件类型做出相应处理。

e Xosip_lock( ) ,e Xosip_unlock( ) : 遇到临界信号做出锁定和解锁。

e Xosip_event_wait ( int tv _s,int tv _ms) : 等待SIP事件,时间为tv_s( 秒) + tv_ms( 毫秒) 。如果在这段时间检测到有SIP事件,则立即把事件返回给指针uac_e( 相应事件指针) ; 如果超出设置的时间范围仍然没有收到SIP事件,此时返回NULL给指针uac_e,然后再一次进入事件检测函数,继续等待。需要注意的是,每次返回SIP事件后, 要判断用户在注册服务器的注册时间是否过期,如果过期则需要刷新注册服务器。

通过uac_e的type成员变量判断得出不同类型的SIP事件,e Xosip协议栈对每个不同事件type都定义了一个枚举类型e Xosip_event_type,并定义了相对应的字符串,例如EXOSIP_CALL_INVITE,EXOSIP_CALL_ACK, EXOSIP_REGISTRATION_SUCCESS等。以下是本设计涉及到的主要事件的描述:

( 1) EXOSIP_CALL_INVITE: 呼叫请求消息处理,由客户端呼叫本机。此过程处理消息主要用到e Xosip_call_ build_answer,通过e Xosip_call_send_answer给请求的客户端建立一个回应,发送给请求的客户端。本地对INVITE消息进行分析,获得客户端的IP和端口号。

( 2) EXOSIP_CALL_ACK: 接收到请求的客户端的ACK回应消息后开始建立双方连接。此处理过程中主要是通过oRTP协议栈建立RTP连接,需要开启新的线程用来发送数据。

2. 4获得视频数据流

实时视频监控[7],就是将实时采集的视频数据,压缩编码后实时发送给客户端并解码显示。本设计负责将数据流从系统缓冲区RAM中读出来,然后通过RTP打包发送给客户端。采集并压缩视频数据的任务由FPGA的硬件编码模块承担,并独立输出到系统缓冲区RAM。该部分任务由课题组其他成员负责,这里不做详细讨论。选择系统缓冲区RAM尺寸设置预定值为5 kbyte,大概3帧压缩后的CIF格式数据。

2. 5实现RTP模块

在视频服务器端和客户端建立SIP会话后,该模块负责视频服务器端向客户端传输视频数据流的传输协议。 本设计首先在Micro Blaze端进行RTP协议栈交叉编译, 然后编写了基于RTP协议的视频传输线程。

2. 5. 1交叉编译

oRTP是用C语言编写的符合RFC3550RTP的一个实现库,具有良好的性能和易用性,并具有包调度、自适应抖动补偿等功能。本系统采用最新版本ortp - 0. 13. 1。 具体编译过程为:

定义环境变量MYMCPATH为Micro Blaze平台上的/ usr / local目录( microblaze - uclinux平台) ,prefix设置将生成的目标库文件安装到MYMCPATH目录下。以上指令执行后会在MYMCPATH/lib目录下生成libortp. a和li- bortp. la文件,在MYMCPATH / include目录下生成oRTP目录,即oRTP库的头文件。完成以上编译后在Cent OS 5. 6编译平台上就有了oRTP协议栈。

2. 5. 2 RTP传输线程

建立了SIP会话,开启新的RTP线程传输视频数据。 RTP线程有初始化RTP库、数据流传输过程、传输任务结束这3个阶段。初始化过程主要对RTP库进行初始化, 为下一步调用库函数做准备。数据流传输过程初始化Rtp Session,配置本地和客户端IP地址、端口和负载类型以及封装、打包和传输数据流。压缩后的视频数据流从RAM中读出,通过调用oRTP协议栈中的rtp_session_send_ with _ ts ( Rtp Session * session,const unit8 _ t * buffer,int len,uint32_t userts) 函数将压缩数据流打包再通过网络发送出去。session指针是任务指针,描述了该任务的基本属性; buffer为存储数据的缓冲区首地址; len为打包的数据流长度,userts为时间戳。该函数的调用可将数据流加上RTP协议头、UDP头、IP头,得到一个完整的数据包。 数据包尺寸直接关系到客户端显示图像的质量,包尺寸越大,图像显示延时抖动会越明显; 反之图像显示流畅但丢包现象容易出现。所以包尺寸需要反复试验确定,本设计为每包5 kbyte左右。

3系统测试

在交叉编译环境下将应用程序编译成可执行文件, 通过挂载的方式复制到目标板上的Petalinux操作系统环境中,然后执行。具体测试过程如下:

1 ) 编译SIP视频监控视频服务器应用程序;

2 ) 目标板上启动Petalinux操作系统;

3) 将应用程序复制到Petalinux操作系统的根文件目录/var下;

4) 启动视频监控客户端和视频服务器,查看测试视频服务器结果( 见图3) 和客户端( 见图4) 。

4结论

本文详细介绍了移植在FPGA的嵌入式Petalinux操作系统上,视频监控终端视频服务器与客户端建立SIP会话的具体流程和基于RTP协议传输数据的设计方案,成功实现了FPGA平台与PC机之间的虚拟连接和视频数据的实时传输。信令控制的呼叫模式确保了数据传输的可靠性和安全性,为下一步基于FPGA平台视频系统的发展奠定了基础,具有很高的实用价值。

摘要:详细介绍了在FPGA平台上,以MicroBlaze软核为处理器、Petalinux为操作系统环境,如何设计与实现一个基于SIP协议的视频服务器。本设计实现了Petalinux操作系统在FPGA平台的XUPV5LX110T开发板上的移植,给出了SIP视频会话建立的各个过程以及基于RTP协议的视频数据传输方案,解决了FPGA平台与PC机之间的虚拟连接与视频数据通信的难题。

上一篇:岩巷应用下一篇:吊装应用