王玉巧
(黄河科技学院,郑州 450063)
会话启动协议SIP(Session Initiation Protocol)是 由 IETF(Internet Engineering Task Force)组织于1999年提出的多媒体通信框架的应用层信令协议,是在诸如SMTP(简单邮件传送协议)和HTTP(超文本传送协议)基础之上建立起来的,尤其适用于Internet中的实时通信应用,其设计理念和协议结构完全符合NGN的特性和要求,成为未来多媒体通信系统的主流发展方向。SIP用来生成,修改和终结一个或多个参与者之间的会话。这些会话包括因特网多媒体会议,因特网(或任何IP网络)电话呼叫和多媒体发布。会话中的成员能够通过多播或单播联系的网络来通信。
Sip呼叫是voip重要部件,它服从整个通信行业的产业政策。国家发改委、科技部等主管部门按“十一五”规划及国务院8号文件精神,对voip、NGN等通信高新技术及其产业化的支持力度不断加强,支持重点明确,立项审批加快。
sip呼叫本质上代表着人们通信方式的变革,语音传输的IP化、内容的多媒体化、用户通信智能化、互联网业务向电信网的迁移的趋势发展。科技部多项关于sip呼叫的研发项目已立项。在上海、南京、杭州等珠三角地市,已经开始了基于sip呼叫的三网合一交换机的应用,郑州也开始了对于基于sip呼叫的voip的大力支持。
行业sip呼叫的普遍技术水平是:(1)能够实现sip的呼叫,由于需要重新编译才能执行,不能随时更新,对sip的新技术、新功能不能立即实现;(2)平台单一,不能在各个平台通用。如在windows上的不能通用于Linux上。(3)架构复杂,用户使用困难。
在编写基于sip呼叫的通用软件处理平台时,用到oSip以及eXosip开源协议栈。
oSip是遵循IETF标准,使用ANSI C编写,源代码开放的SIP协议栈。oSip主要有下列优点:结构小巧简单,只有400K左右,适合在嵌入式系统上应用;可移植性好,已被成功的应用于Solaris、HP Unix、VxWorks、Windows和GNU/Linux等系统中;工作稳定、兼容性强。oSip主要由解析模块、工具模块和状态机模块构成,其核心是状态机模块。解析模块完成对SIP请求和响应进行封装与解析处理。解析模块又可分为SIP解析、SDP解析与URL解析。工具模块主要提供一些处理工具用于对话管理和SDP协商。状态机模块负责对某个事务(如注册过程、呼叫过程等)状态的维持及处理,并在特定的状态下触发响应的事件或回调函数。根据RFC描述中关于SIP协议事务层的定义,oSip 协议栈有4种状态机:客户端邀请事务(ICT),客户端非邀请事务(NICT),服务器端要求事务(IST),服务器端非邀请事务(NIST)。前两种状态机是由客户端发起的,后两种状态机是由服务器发起的,这4种状态机涵盖了SIP的各种事务类型。其中ICT是SIP客户端中最常见的事务。oSip专注于SIP底层解析,这使得它具有很高的效率。但另一方面,由于没有提供高层的SIP会话控制API,使得上层应用在调用协议栈时很破碎,降低了易用性。为此oSip的开发者们又在oSip的基础上开发了eXosip。eXosip是oSip的扩展,它部分封装了oSip协议栈,使得它更容易被使用。eXosip实现了作为单个SIP终端的大部分功能
因为SIP是一个文本编码协议,所以SIP信令实际上是以UDP数据报的形式在有线网(例如以太网)上传送的。
SIP用户在启动是,向服务器注册。注册该用户的IP地址,端口号,用户名,用户密码。对于用户密码可以加密发送。
在收到被叫用户电话号码后,经过服务器号码和密码的认证后,向被叫用户发起呼叫。下图为一个简单的SIP呼叫应用。
图一 一个简单的SIP会话建立例子
(1)主叫Tesla向被叫发送INVITE,
(2)被叫Marconi空闲时,向主叫方Tesla发送180,表示被叫振铃。
(3)被叫摘记,向主叫方发送200OK消息。
(4)主叫方发送ACK消息。双方通话
(5)被叫挂机,向主叫方发送BYE消息。
(6)主叫方发送200OK,表示通话结束。
本产品在windows平台,Linux平台,iPhone平台,winCE平台,ucOS平台,嵌入式Linux平台以及其他手持终端,学习机等上使用。
用户图形界面包括电话号码输入,摘记和挂机按钮,sip服务器设置
在Linux(或windows)下编写make文件,编译代码运行。
在调试时用到Asterisk软件。Asterisk在CenOS编译运行。主要配置电话用户和号码翻译文本文件。Asterisk为源码开放的voip呼叫处理软件。下载Asterisk,在CenOS上解压,编译,安装。如果安装成功,就有安装成功的提示。安装成功后,要修改配置文件。然后运行。用进程命令察看,可以发现有Asterisk和Safe_Asterisk两个运行进程。
Sip呼叫处理模块采用互为服务器模式。即交换机终端既是客户端,同时也是服务器。在交换机终端以http格式,向Asterisk服务器发送上行命令。此时端口一般为5060,udp协议端口。
Asterisk服务器收到交换机终端的上行请求命令,以udp协议,重新向客户端发起socket消息。
客户端服务器收到Asterisk服务器以客户端的形式发送的udp消息后再进一步处理。
客户端采用定时器方式,即定时的对客户端状态检测。oSip主要有客户端邀请事务(ICT),客户端非邀请事务(NICT),服务器端要求事务(IST),服务器端非邀请事务(NIST)等几个状态。客户端定时对以上几个状态处理,完成状态检测和状态迁移。
其运行流程如下:
(1)SIP 呼叫注册(REGISTER)。
交换机在开机后,定时检测SIP处理模块的状态,如果存在,就向服务器注册。同时,对于已经注册的SIP模块,如果不存在,就向服务器取消注册。
在注册时,把本端IP地址(192.168.1.1),本端端口后(5060),用户名(Telsa),用户密码(1234),本端用户电话号码(9001),Asterisk服务器的 IP 地址(192.168.1.2),端口号(5060)发送到Asterisk服务器。
在收到200OK消息后,表示注册成功。
此时,用户Telsa状态为注册状态。
(2)用户摘记拨号的处理流程。
Telsa用户9001,拨打Marchi用户9002。
用 户 摘 记,听 拨 号 音,拨 号 码“9002”;经Asterisk 服务器,发送“INVITE”消息到 “9002”用户Marchi。
此时,用户Telsa状态由注册状态迁移到拨号状态。
(3)用 户Marchi此 时 空 闲,振 铃,发 送180Ringing到Telsa用户。
此时,用户Telsa状态由拨号状态迁移到振铃状态
(4)用户通话的处理流程。
被叫Marchi摘记,向主叫Telsa,发送200OK,主叫发送“ACK”消息到Marchi用户。
此时,用户Telsa状态由振铃状态迁移到通话状态
(5)被叫Marchi挂机,向主叫Telsa发送“BYE”消息,主叫向被叫发送“200OK”消息
此时,用户Telsa状态由通话状态迁移到注册状态。即原始空闲状态。
所有的状态在超时后,都回到原始空闲状态。即注册状态。
如果检测不到用户Telsa,则向Asterisk发送消息,取消用户Telsa注册状态。
PSTN呼叫处理模块采用状态机的方法处理号码接受和发送呼叫,同时处理SIP的呼叫状态迁移。