2014/05/01 meeteasy
SIP(Session Initiation Protoco1)称为会话初始化协议,工作在应用层,用来建立、修改、终结一个或者多个参与者会话的 进程。SIP协议是基于lP网络的实时通信应用协议,主要用来解 决lP网络上的信令控制,为因特网的成功应用提供的接入。SIP电话是通过lP网络承载语音业务,且IP电话系统、多媒体会议 控制系统在VOIP系统实现、多媒体通信系统、无线语音通信领域应用更加广泛,且大多数系统均采用SIP协议作为其信令控制协议,因此,SIP协议栈的选择和应用就显得尤为重要。
eXosip2是一个源码公开的、使用标准C编写的免费协议栈,是oSlP的扩展协议集,部分封装了oSIP协议栈,结构简单小巧,更容易被使用,是实现SIP协议的较好的选择。
1、oSIP和eXosip协议栈简介
1.1 oSIP协议栈特点
oSlP是按照RFC3261(SIP)和RFC2327(SDP)的标准,公开源代码,应用标准C语言的一个协议栈。oSlP结构简单、快速、小巧、功能齐全,在SIP客户端、服务器端和嵌入式系统等方面具有广泛的应用前景。
oSlP不提供高层的 SIP会话控制的API,主要提供一些解析SIP/SDP消 息的API和事务处理的状 态机。oSIP协议栈主要由 语法解析器模块、状态及模块和工具模块构成。如图1所示。
oSIP解析模块主要用来对SIP请求与响应进行封装和解析处理,完成SIP消息的结构分析、SDP消息结构分析和URL结构分析。
状态机模块主要完成对某个事务的状态记录,并在特定的状态下出发相应的回调函数完成对该事件的响应行为。状态机的类型可分为:ICT(Invite Client Transaction)、NICT(Non—In vite Client Transaction)、IST(Invite Server Transaction)、NIST (Non-Invite Server Transaction)。
工具模块主要由两部分组成:SDP协商工具和对话管理工具。SDP协商用于终端之间的能力协商功能,主要采用offer/an—swer模式,对话管理工具主要是利用协议栈提供的一些API函数来实现自己的对话管理,把不同的事务映射到相应的事务层。
1.2 eXosiP协议栈
eXosip是oSlP协议栈的一个扩展协议集,部分封装了oS-IP,使其更容易被使用。它实现了作为单个的SIP终端的大部分功能,如认证、注册、呼叫等。eXosip使用UDP socket来实现底层SIP协议的接收与发送,并且使用定时轮询的方式来调用 oSlP的事务处理函数,通过添加与读取事务消息管道的方式来 驱动事务的状态机,使得远端的SIP信令能够汇报给调用程序, 来自调用程序的反馈能通过SIP信令回传给远端。使用jevent 消息管道向上通知调用程序底层发生的事件,调用程序只需要 读取该消息管道,即可获得感兴趣的时间,进行相关的处理。 eXosip增加了call、dialog、registration、subscription等过程的解析,使其使用性更强,但由于局限于UA的实现,在register、 sip server等应用中不容易,且eXosip未增加线程并发处理机制,只实现了音频支持,缺少对视频及其他数据格式的支持。因此,oSlP与eXosip协议栈相结合是实现SIP协议栈较好的选 择,但需要根据不同的需求增加相应的内容。
2、SIP电话的设计
2.1系统总体设计
eXosip是分布式的协议栈,采用 C/S结构的消息机制,将控制信息封装到消息的头域中,通过消息的传递来实现呼叫控制。与基于其他协议如H.323协议的IP电话相比,利用eXosip协议栈实现的SIP电话结构更加小巧,更加的智能化,更加简单灵活、可扩展性强,可传递数据、控制信息等,实现呼叫、注册、接听、挂断 等功能。SIP终端系统的总体架构主要由3部分组成:底层硬件平台部分、操作系统、SIP终端软件系统(应用程序)。设计框架如图2所示。
2.2硬件设计
本设计硬件部分采用三星公司的ARM9开发板Mini2440,以Samsung S3C2440为微处理器,包含专业稳定的硬件特性,该设 计硬件主要包含以下几部分:电源系统,复位系统,网络通信系统,串口通信部分及JTAG调试部分。
经过大量的资料收集,选择Mini2440开发板,该处理器集 成度高,外围电路简单,高性价比,低功耗,基于ARM92OT内 核,主频为400MHz,最高可达533MHz,非常适用于手持设备和网络应用,能够满足嵌入式系统对于体积小、低成本、低功耗、高性能的要求。
存储系统包括,~DRAM内存和Flash存储。该开发板采用两片外接的共64M bytes的SDRAM芯片,并接形成32.bit的 总线数据宽度,增加了访问速度,用于运行操作系统和应用程序。Mini2440具备两种Flash:Nor Flash和Nand Flash,本设计中使用Nand Flash,主要用来存储操作系统、应用程序和用户数据等。
网络接口采用DM9000网卡芯片,可以自适应1O/10OM 网络。
2.3软件设计流程
软件系统的设计主要包含两个方面:协议栈层和用户程序层。协议栈层主要实现的是消息解析,UAS及UAC事务处理,多媒体流的传输等功能,主要包括SIP模块和RTP模块,应用socket的 模式与上层进行信息交换,本设计采用eXosip2协议栈和oRTP 协议栈来实现。用户程序层主要由用户交互模块,用户代理模块及语音处理模块等组成。用户交互模块主要负责接收用户输入的信息,同时向用户反馈底层的信息。用户代理模块则根据用户的请求类型去调用协议栈层的功能,实现eXosip的回调,同时将结果反馈给用户。语音处理模块主要实现音频的编解码功能。
2.3.1协议栈层
eXosip是一个分布式的协议栈,采用C/S结构的消息机制,提供SIP操作所需的基本数据结构和各种应用程序编程接口,将控制信息封装到消息头域中,通过消息的传递来实现呼叫控制。点到点的呼叫流程如下:首先,用户要想服务器端发起注册请求,平台进行鉴权分析,确认用户注册权限并接受注册请求。用户代理U1向服务器端发出lNVITE请求发起会话,并通过服务器设备转发,到达另一用户代理U2,若U2同意建立本次会话,返回2xx响应,不同意则返回 3xx、4xx、5xx、6xx响应。在U1收到最终响应之前,U2可发送临时响应通知U1当前处理进展。U1收到服务器端的响应后,发送ACK确认收到响应,之后便建立会话,消息传输结束时一方发送Bye请求,另一方给一个200响应结束会话,流程如图4所示。
RTP模块采用开源的RTP协议栈oRTP,可以方便的实现对实时媒体的传输控制。RTP提供了时间戳、序列号及其他结构 来控制实时数据的流放,在接收到RTP/RTCP包时,轴线需要 条哟过RTP/RTCP捷豹模块进行拆包,之后根据一定的时间标 签调用去抖缓冲中的函数把压缩语音包传给CPU,并通过CPU 恢复成原始的媒体信号,再经过C0DEC芯片进行D/A转换, 最终送至终端输出。
2.3.2 用户程序层
语音处理模块主要实现语音信号的采集、编码、解码和回放,由语音数据发送和接收两部分组成,其工作流程如图5。
首先音频信号通过编解码芯片完成脉冲编码调制,将模拟信号转化为数字信号,并采用所选的编码标准对数字信号进行压缩编码,再加上RTP头字段和其他的头字段将封装数据包UDP信号传输层即完成发送,接收通过SDP的协商获得编码方式进行解码,还原为模拟信号。
本设计中采用的音频压缩编码方式主要是G-711和speex。G.711是PCM 编码,对语音信号进行采集和量化,产生 64kbit/s的码流,此编码方式产生的语音质量较高,但要稀罕用很高的带宽。 Speex编解码器是专门针对VOlP而设计的开源音频编解码器,具有较强的带宽适应能力,可以在大部分的网络环境下正常工作,在低比特率时传输质量也很好
2.4软件设计
软件设计流程如图6所示。
注册过程具体程序包括几部分:
初始化eXosip2协议栈(eXosip_init()),监听(eXosip_lis_ten_addr()),鉴权(eXosip_addr_authenticaation_info()),建立注册请求(eXosip_register_build_ initial_register()),发送注册请求(eXosip_register_send_reg_ister()),等待服务器响应(eXosip_event_wait()),注册成功后 释放(eXosip_event_free())。
呼叫过程具体程序包括以下几个部分:
呼叫端的过程为:建立请求(eXosip_call_build_initial_invite ()),发送请求(eXosip_call_send_initial_invite()),等待响应 (eXosip_event_wait()),收到200响应之后建立应答(ex_ osip_call_build_ack()),发送应答(eXosip_call_send_ack()), 获取对方的sdp消息(eXosip_get_remote_sdp()),从sdp消 息中借此出媒体类型和端13号(sdp_message_to_str(), sdp_message m_port_get()),获取本地sdp消息及本地端13 号(eXosip_get_local_sdp(),sdp_message_m_port_get())等待呼叫确认后建立呼叫。接收方则对接收到的消息进行判断后 建立相应的应答消息并发送。
语音传输部分包括呼叫过程中添加语音类型、端口号、源lP 及目的lP等SDP消息,主要用到的函数由eXosip_mes_sage_set_supported(),eXosip_message_set_body(),eX_osip_message_seUype()等,还有一部分主要是调用oRTP协 议栈的API函数,实现语音文件的传输,主要用到的函数有:初 始化(ortp_init(),ortp—scheduler_init()),会议的建立(rtp_ses_sion_new(),rtp_session_set_schedul ing_mode(),rtp_ses_ sion_set_blocking_mode()),赋予本地地址并从SDP消息中获 得端口号(rtp_session_set_local_addr()),从输入参数中获取 目的地址及端El号(rtp_session_set_remote_addr()),发送传 输文件(rtp_session_send_with_ts())。
3、结束语
本文简单介绍了oSIP和eXosip协议栈,根据SIP电话的设计流程,介绍了基于eXosip协议栈的SIP电话的设计与实现过程,实现了用户注册管理及会话的控制,达到了预期的设计。该协议栈占用空间小,呼叫建立时间较短且呼叫成功率高,满足嵌入式设备对可靠性、实时性及存储性的要求,但是也存在着一些不足,相信在进一步的研究中会获得更大的进展。
40088 411661033743080@qq.com
中国广东省深圳市南山区西丽九祥岭工业区10栋3楼