下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、SIP直接呼叫的分析与实现 要 在介绍SIP直接呼叫流程的基础上,分析了对SIP直接呼叫进行编程的需要。在文中实现了SIP消息、呼叫传输、SIP客户端等方面的呼叫相关功能,并给出SIP直接呼叫总体编程结构。最后简介了如何在SIP直接呼叫的基础上进一步实现代理呼叫、重定向呼叫。关键词 SIP直接呼叫;SIP消息;呼叫传输1引言SIP协议支持三种呼叫方式:由主叫UAC向被叫UAS直接呼叫、由主叫UAC在重定向服务器的辅助下进行重定向呼叫、由代理服务器代表主叫UAS向被叫UAS发起呼叫。在SIP直接呼叫中,直接的含义是指参与呼叫的实体只有主叫方和被叫方,而没有诸如代理服务器、重定向服务器、登记服务器
2、等高级实体。SIP直接呼叫是构成了另外两种更为复杂的SIP呼叫(代理呼叫、重定向呼叫等)的根本元素,因此在编程工作中如何实现SIP直接呼叫,并在其编程结构中留有添加较复杂SIP呼叫功能的空间,是实现整个SIP呼叫编程过程中非常重要的一步。2 SIP直接呼叫的呼叫流程首先,简单介绍一下SIP直接呼叫。SIP直接呼叫的呼叫流程如图1所示。图1 SIP直接呼叫的呼叫流程(1)首先,主叫向被叫发出INVITE请求。INVITE请求的作用是发起并建立呼叫,邀请被叫加入主叫建立的呼叫。(2)被叫收到请求后对主叫做出响应。接受请求方对请求的响应分为临时响应(状态码为1xx)和最终响应(状态码为2xx)。主叫
3、只对最终响应做出回应。图1中,被叫做出的临时响应有100 Trying(尝试连接)、180 Ringing(被叫振铃或进入收到请求状态)、182 Queued(被叫可能有多个呼叫要处理,所以主叫请求需要排队等待);被叫做出的最终响应是200 OK,表示被叫接受并开始处理呼叫请求。(3)为了向被叫证实主叫收到了最终响应,主叫收到响应后发送ACK请求。被叫收到主叫的ACK请求,标志呼叫建立阶段结束,(4)主叫或被叫在呼叫建立后发起后续请求。后续请求可由参加呼叫的任一方法起。可发起INVITE请求,进行交互操作并对当前呼叫进行修改;也可发起BYE请求终止当前呼叫。3 对SIP直接呼叫的实现要实现SI
4、P直接呼叫,首先需要实现两大方面的机制,即SIP消息和呼叫传输。随后,需要将这两大机制融入SIP客户端中,实现SIP客户端对SIP消息和功能的调用。下面将逐一介绍这三方面的内容,并总结给出SIP直接呼叫的整体编程结构。3.1 SIP消息各类间的关系SIP消息分为请求消息和响应消息两种,这两大类消息都由三部分构成:起始行(StartLine)、头域(Header)、消息体(MessageBody)。其中,现有的请求消息有ACK、Bye、Cancel、Invite、Option、Register、Subscribe、Message、Notify等9种类型。此外,为了使编程结构完整,还使用Unsup
5、ported类处理可能出现的错误请求信息。SIP消息(包括请求消息和响应消息)的通用结构为起始行、头域、消息体,其中的消息体部分在某些消息中可以不包含。响应消息的起始行也叫状态行,它包含的响应状态码表示了当前SIP呼叫的状态。编程中各SIP消息类的继承关系如图2所示。图2 SIP消息各类的继承关系由图2可以看出, SipMessage类为所有消息类的父类,描述了单个Sip消息的构造方式。SipMessage类的作用是创建Sip消息,以及解析单独的Sip消息。本类还包含了重传计时器功能,在发送消息的时候将使用到该计时器。本类为抽象类(abstract),没有描述Sip消息起始行、头域、消息体的具
6、体构成。SipMessage类派生出两大类SIP消息,即SipRequestMessage类和SipResponesMessage类。在SipMessage的各子类中(SipRequestMessage的各子类请求消息、SipResponseMessage),详细定义了具体消息的结构。由于SIP响应消息的构建和解析比较简单,不随响应消息对应的请求类型的变化而变化,所以不需要对各类响应单独编程。相反,SIP请求消息的结构较为复杂,请求类型不同,请求消息的起始行、应有头域、消息体的内容都可能不同。下面具体介绍各类请求消息的构成。3.2 SIP消息的构建和解析在呼叫进行中,需要构建并发送请求消息或响
7、应消息;也需要对收到的请求消息或响应消息进行解析,以提炼出消息中的信息,以便继续呼叫过程,下面将对这两个过程的编程思路做一个简单的介绍。3.2.1 SIP消息的构建在构建SIP消息的过程中,首先调用前面介绍过的SipMessage父类,确定所构造消息的类型,并对一些所有消息共有的参数进行初始化;随后,由图2中SipMessage父类的各子类构建具体类型的消息。其具体方法描述如下:1)判断消息类型:public static SipMessage createMessage( String inputMessage ) 根据用户输入的消息内容inputMessage创建新消息。如果用户输入消息的
8、开头是SIP,就认为这是一个响应消息,转用SipResponseMessage子类创建新的响应消息new SipResponseMessage( inputMessage )。如果用户输入消息的开头不是SIP,认为这是请求消息,转用SipRequestMessage子类创建新的请求消息SipRequestMessage.createRequestMessage( inputMessage.trim() )2)请求消息的构建请求消息的构建有两种方法:根据输入的消息字符串创建和根据给定消息类型的整数值创建Sip请求消息。public static SipRequestMessage createR
9、equestMessage( String inputMessage )这是根据输入的消息字符串创建Sip请求消息的方法。从inputMessage中获取请求的类型(请求类型信息为inputMessage字符串从开始到第一个空格的内容),创建该类型请求消息,如果不支持该类型的请求消息,则直接返回该消息内容。将创建的消息参数设为默认值(message.setDefaultVars()),并对该消息进行解析验证(message.parseMessage(inputMessage)),若解析出错,系统显示 SRM: Couldnt parse message: ,返回空字符串。若解析成功,则返回创建
10、的请求消息。public static SipRequestMessage createRequestMessage( int mtype ) 这是根据给定消息类型mtype的整数值创建Sip请求消息的方法。其中mtype的值可以为INVITE、OPTIONS、REGISTER、CANCEL、BYE、ACK、SUBSCRIBE、NOTIFY 、MESSAGE等。方法根据上述mtype的值,分别调用对应的请求消息子类(如图2所示),创建新的请求消息。在判断出请求消息类型,并由对应的请求消息子类创建请求消息对象后,请求消息的起始行、头域、消息体等部分的创建也将由该子类完成。请求消息的起始行创建取决
11、于请求消息类型。根据所获得的请求类型,由对应的请求消息子类中的protected String startLine()方法创建消息起始行,其具体结构为:Method: +HeaderData+rn。所创建的头域种类除了前文所述的各类请求消息必须的头域之外,还可以根据具体呼叫要求添加。在分析并创建了上述的起始行和头域部分之后,如果输入的消息字符串还有剩下的内容,都将被放入请求消息的消息体部分。3)响应消息的构建响应消息的构建也有两种方法:构建默认的响应消息和根据输入的消息字符串创建响应消息。public SipResponseMessage() 本方法用于构建默认的响应消息。它直接调用其父类的消
12、息构造方法(super()),并将相应消息的参数设为默认值(setDefaultVars())。public SipResponseMessage( String inputMessage ) 本方法直接调用其父类的消息构造方法(super()),将相应消息的参数设为默认值(setDefaultVars()),并解析输入的消息字符串(parseMessage( inputMessage )),根据输入的字符串内容创建响应消息。protected String startLine()本方法实现了父类中的abstract方法,构建响应消息的起始行。响应消息与请求消息类型无关,使用同一种起始行格式:
13、ProtocolVersion+ +StatusCode+ +StatusReasonPhrase+ rn。响应消息的内容由做出响应端的情况决定,可以是对本地媒体情况的描述,可以是其它文本内容,也可以为空。4)SDP消息体的构建程序中定义了SdpMessage类,它描述了构成和解析SDP消息的方法,并且定义了媒体清单这一对象,以便实现呼叫中确定所使用的媒体、在呼叫过程中改变或添加媒体等动作。public String message() 该方法构建并返回给定内容的SDP消息。新建的SDP消息结构如下:第一行为版本信息,v=0rn;第二行为会话Id,o= + username + + idVer
14、 + idVer + IN IP4 + SipUtil.getLocalFqdn() + rn ),其中的idVer为由当前时间产生的字符串String.valueOf( date.getTime() ) + ;第三行为会话名,s= + sessionname + rn;第四行为连接信息,c=IN IP4 + ipaddress + rn;第五行为会话活跃时间,如果startTime参数不为空,则t= + Long.toString( srttime ) + +Long.toString( stptime ) + rn ),如果startTime参数为空,则t=0 0rn(即不限制会话活跃时间
15、);如果呼叫中存在媒体清单信息,即audioML、videoML、applicationML、dataML、controlML中的一个或多个存在,则在SDP消息中按上述顺序添加该媒体清单的内容。如果呼叫中的媒体清单存在媒体属性信息,即audioML、videoML、applicationML、dataML、controlML中的一个或多个存在媒体属性信息,则在SDP消息中按上述顺序添加该媒体清单中的媒体属性参数。3.2.2 SIP消息的解析SIP消息的构建和解析是两个互逆的过程。构建消息是将各设定的参数值放入消息中,而解析消息则是将消息中的参数值赋值给各实体中的参数,以改变实体状态,推动呼叫过
16、程的进行。由于SIP消息的构成有严格的格式规定,所以可按照消息中的标识符将消息分段,解析出各参数的值,以便将这些参数的值应用到当前呼叫。因此本文不具体介绍SIP消息的解析过程,将其描述为在构建该消息的子类中,按照该类型消息构建的顺序和过程对其进行解析。在解析过程中,取得消息中的参数值,并将其传递到相应的实体。3.3 呼叫传输机制SIP呼叫传输机制负责实现SIP呼叫中的事件处理、消息传输、状态更新、消息超时等功能。在编程过程中,SIP呼叫传输机制主要包含以下几个实体部分:请求排队(MessageQueue)、SIP呼叫(SIPCall)、呼叫成员(CallMember)和传输对象(Transac
17、tion)。其中,MessageQueue 、SIPCall和CallMember都是实现方法的实体,但这些实体不调用方法。方法调用的工作由Transaction来完成。也就是说,前三类实体在呼叫中提供完成呼叫所必需的功能,而Transaction则是统一控制和处理呼叫进程的关键所在。下面将简要介绍这几个实体的结构,并从总体上说明呼叫传输机制的编程实现结构。3.3.1 请求排队MessageQueue由于SIP呼叫中的消息接收方可能需要处理多个呼叫,所以到达的消息需要进行排队等待。接收到的消息将在MessageQueue类中被排队。SipTransaction根据该消息中的Call_ID确定M
18、essageQueue中的消息属于哪一个呼叫,并根据消息的Cseq信息进一步确定该消息属于该呼叫中的哪一个命令范畴(一个命令范畴包括一个命令和对该命令的所有响应)。在需要传输某一呼叫的某一命令范畴内的消息时,由SipTransaction将该消息从MessageQueue中挑选出来,并传递给相应的用户。3.3.2 SIP呼叫SIPCall 单个SIP呼叫对应的实例。每个SIPCall对象中包含了呼叫过程中的消息接收和发送等功能。这些功能将在呼叫进行过程中由其它对象调用(如SipTransaction、SIPClient),完成呼叫动作。3.3.3 呼叫成员CallMember由于单个SIP用户
19、可能同时处理多个SIPCall,所以在编程中对应每个处理中的呼叫,创建一个CallMember实例,并将该呼叫添加到CallMember清单(Members)中。CallMember对象的是与一个Sip呼叫及该呼叫发起方的Uri一一对应的,即Members清单中的每一个CallMember对象都是一个来自不同Uri的呼叫。CallMember中描述了该呼叫的多种信息,包括该呼叫的远端Uri和本地Uri、该呼叫的状态、当前呼叫的SDP描述等。CallMember还提供了修改当前呼叫状态的API,如果调用CallMember中的发送消息或接收消息方法可以改变当前呼叫状态。具体地说,CallMemb
20、er中定义了Invite请求的发送(requestInvite)、接收(acceptInvite)和拒绝(declineInvite),Cancel请求的发送(requestCancel)和接收(acceptBye),Message请求的发送(requestMessage),Options请求的发送(requestOptions),Info请求的发送(requestInfo)和接收(acceptInfo),Subscribe请求的发送(requestSubscribe),Notify请求的发送(requestNotify),以及呼叫转移动作(requestTransfer)和断开呼叫动作(re
21、questDisconnect)。上述API都通过当前呼叫与具体消息类型相关,一旦被调用,就将改变当前呼叫的状态参数。上述方法及API仍然需要由SipTransaction对象调用才能影响呼叫进程,所以CallMember中提供了为当前呼叫创建Transaction对象的方法,即void incomingTransaction(SipTransaction newtrans),以便为Members清单中的每一个呼叫建立传输机制核心:Transaction。3.3.4 传输对象Transaction 在对前面几个实体的介绍中已经提到Transaction的作用和重要性。Transaction主要
22、作用是,通过调用其它类的传输方法,处理当前呼叫中的一个对象(单个SIP消息)的构建、解析、接收或发送。下面介绍Transaction和其它实体的相互作用,并对SIP呼叫传输机制的整体编程作简要说明。SIP直接呼叫传输机制的整体编程实现结构如图3所示。图3 SIP直接呼叫编程实现结构图3所示呼叫的呼叫双方是地址为Uri_0的SipClient_0和地址为Uri_1的SipClient_1。呼叫过程中,两个客户端之间消息传输的过程可以描述如下:当SipClient_0需要向SipClient_1发送消息时,SipClient_0首先激活CallMember对象中的当前呼叫对象SipCall_1,同
23、时挂起对其它呼叫的处理动作。在SipClient_0一方,首先SipCall_1对应的Transaction对象调用SipMessage及其子类中的方法,构建SipClient_0需要发送的消息;然后该Transaction对象将通过CallMember中的API调用SIPCall对象中的消息接收和发送方法,执行发送消息的动作,同时更改呼叫状态;最后,在SipClient_1确认收到SipClient_0发出的消息后,Transaction将更SipClient_0一方中关于SipClient_1的状态描述。在SipClient_1一方,接收到SipClient_0发来的消息后,首先将该消息送
24、至消息队列MessageQueue中;然后在SipClient_1中Transaction对象的控制下,将消息送至SipCall_1在SipClient_1中所对应的CallMember对象,进行后续的消息处理工作。从上面的描述可以看出,Transaction对象主要负责执行传输动作。它调用消息对象的消息构建方法、发送消息及处理收到的消息、进行消息重传、改变呼叫双方的状态。此外Transaction对象还负责对当前传输的对象进行监听,并判断当前传输的消息是否超时。如果超时则由Transaction执行重传动作;如果超过重传次数,则由Transaction取消当前消息的传输。消息重传计时器定义在SIP消息类中,在发送消息的时候将由Transaction启动该计时器,以便按照设定的时间间隔重传消息。4 结束语非直接呼叫主要是指在直接呼叫的基础上加入了代理服务器或重定向服务器,从而形成了代理呼叫和重定向呼叫这两种较为复杂的非直接呼叫方式。由于这两种呼叫都是在直接呼叫的基础上建立起来的,下面将以直接呼叫为基础,简要介绍在直接呼叫编程中扩展非直接呼叫的空间。(1)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 肢体经络疾病相关试题与答案
- 2026年黑龙江省人教版初中英语八年级上册第7单元口语交际练习
- 2026年智能交通系统实操测试卷
- 2026年生活常识竞赛测试题库
- 2026年金融资产定价模型模拟试题
- 2026年护理健康教育实践技能考核题库
- 2026年高中英语教师招聘笔试阅读理解能力测试
- 群监网员资格考试试题及答案
- 2026年电子电路故障诊断与维修考核试卷
- 2026年志愿者知识考试卷志愿服务项目管理与监督测试
- 第三章 代数式(单元解读课件)数学人教版2024七年级上册
- 2025至2030中国汽车玻璃行业项目调研及市场前景预测评估报告
- 出国务工人员安全培训课件
- 2025年医疗器械经营质量管理规范培训试题及答案解析
- 西藏节庆管理办法
- 颈椎骨折脊髓损伤的护理
- 胃镜检查护理常规课件
- 2025至2030年中国果冻布丁产业竞争现状及投资策略研究报告
- DB4403-T 194-2021 物业服务要求 医院
- 2022版《英语课程标准》解读
- 大型钢结构厂房工程项目组织机构设置方案
评论
0/150
提交评论