《SIPDroid.docx》由会员分享,可在线阅读,更多相关《SIPDroid.docx(17页珍藏版)》请在优知文库上搜索。
1、AndroidSIPdroidProjectSharingMay232011Warning:Ifyouhaveanyquestions,adviceorsomethinge1.se,p1.ease1.etteamknow.FightTeamContents怎么学习androidSiPdrOid开源代码3SiPdroid流程详细分析3SiPdrOid会话遨请流程(一)4Sipdroid会话遨请流程(二)5SiPdrOid中像效劳器注用是如何实现的(一)7Sipdroid注册(二)-Sipdroid注册S1.P消息分析9SiPdroid注册(三)-注册返回结果的监听11SiPdroid数据发送流程
2、13Sipdroid中的视频通话是如何实现的16SiPdroid中:步及到的吉媚?,挛1/18Sipdroid涉及到的冰议之RFC3261忽么学习androidSiPdroid开源代码?SiPdrOid目前有24个包,,140多个java文件.首先学习SipdrOid,至少辨明白SiPdroid是怎么玩的,实现的主要功能是什么,具体的流程操作是怎么执行的.先整理下下面的问题:一.Sipdroid的数据流程怎么发送的?参考文档:二.Sipdroid中果用的是什么协议?这点#常的重要,因为SiPdroid栗用的是RFC3261快议,大家看了RFC3261砂砍后,你就会明白.Sipdroid中对于M
3、eSSage的料袋是如何完成,那么MeSSage的豺笠和生成这块所涉及到得设计模式和代码,你根本就可以弄明白参考文档:三,分块来弄Sipdroii1.首先Sipdroid的架构真是设计的是乖常的人性化以及牛X,为什么呢.功能块是完金独立前分开的,高内聚低耦合.SiPdrOid本身来说妩像一座非常施以攻克的堡全,但是咱们只要一块一块的攻.不久就发现整做城堡就被搞定了.一报来说,应该这么做:1.研究注册流程参考文档:2 .畀究会话遨请流程3 .视嵬通话通话流程4 .整理SiPdroid的架叫5 .畿取右用信息,比方视嫉和声音的描弊四库.协议的封装和设计模式等1.SipDroid模块简单分析U1.层
4、,负责界面显示模块和界面时间传递Engine软件核心处理层.启动各种效劳,初始化软件卷数。处理各种U1.时间.港椅配置文件信息,保存全局居性变量.其中包括USerAgenProfi1.e(用户配置文件属性),USerAgent(用户事件处理).SiPdmidEngine(核心於理.所有的U1.的事件,参数设计.效劳的启动都由比文件调度.RCgiS1.CrAgent(注册效劳於理)SipS:提供所有Sip消息模型,所有SiP消息的处理流程,包括发送,接收,封装,解码等等网络传输:提供音频,视须信息的处理,此模块会对音残视须选行即时编诏解码,同时发送数据。同时还提供JSTNNAT透传技术。2.Si
5、pDroid流程分析:段号:拨号请求由U1.通过ReCeiVer需送信息交蛤SiPDrOidEngine处理,在SiPDrOidEngine做一些验证,然后交蛤USerMine处理。其中CaII(Stringtarget_ur1.,boo1.eanSend_anonymous)为判断是否匿名拨号再此方法中.会鹤立一个EXICndedCaI1.对象.以提供应SiD协议校使用,然后调用EX1.CndCdCa1.I的CaII方法处理.之后由EXtendedCaI1.的ca1.1.,调用EXtendedInv1.teD1.ti1.og来发送invite请求.由InViteDiaIog执行具体的invi
6、te调用InviteTransactionC1.ient的request方法,最后由InviteTransactionC1.ient发送request请求,在InViI。TranSaenOnCIient中会通过SiPPrOvider.来发送消息.井18开对IS口监听.来收SiP消息.发送消息主要有(UDP传输I1.dpTransportTCP传输TcpTransport)未电:在启动程序的时候会通itSipDroidEngine会根jg配置,创立-个PrOVider,这里用到UdP传输,创立一个UdPProVider.UdPProVer是一个Thread.创立的时候就会启动歧程.开始裳听收到的
7、信息.当受到信息后.通过OnSerViCeTfnniniIted方法.把对象传出到UdPTranSPOrt,由UdPTranSPort处理,再通过onTransportTerminated方法传出到SipProvider定象.最后将在SipProvider的ProcessReceived.Message方法中处理收到的消息.最后从IiStenerS(InaP)中取出相应的IiStener.最后逋i相应的IiStener中的OnRecciYcYcssagcO来父理具体Sip请求SiPdroid会话邀请流程(一)uA9f*jvodr.fquM.u*to.u*11.uf1.cuct.uMon.dMC
8、f9r.ktM1台IMMIm9MMXMtejIB片比较直观,但是衰建却不够详细,下面咱们详细分析下流程:会话送请所涉及到得突:SipdroidEngine(ca1.1)-UserAgcnt(ca1.1.)-ExtendedCa1.1(ca1.1)-InvitcDia1.og(invite)左边的代表涉及到的类,右段代表涉及到的核心方法.从左到右进行观察,左边的#UMr一个右边类费的,数作为自己的成员函数,就是SiPdrOidEngine有一个成员函数Ua.这不Ua是USerAgCnt类型的。*InviteDia1.og中的invite函数所做的事情也是非常的葡单,生成会话遵清的message然
9、.后通过SipProvider发送出去就行了,那么发送完毕后,怎么实现对发送结果的IS听呢?其实官己猜想一下也猜想到效劳器返回数据会什么类型的?1.等待对方应答中2 .对方已经应容,进入双边通话模式中,同时手机这边开始声音和视须的采集.(声音和视领的票果,这个是核心中的核心啜,马上就要弄到这块了,兴奋田)3 .超时,对方无应答.在二的分析中,咱们用倒推的方法来分析下客户期在接受到效劳期的返回后,传遑到了印里去进行会话递清的结果了.客户端是怎么实现的.Sipdroid会话邀请流程(二)这里咱们要弄明白的是,SiPdroid会话遨谓的结果是在哪里进行监听的,以及这种效果是怎么实现的?发送消息统一是
10、由Sipdroid的SendMCSSHge来进行发送的,然后返回的数据咱们可以在Sipdroid的OnReceiVeMessage中东进行获取。在SiPdroid注册结果的盅听:这篇文章中.咱们分析了下,首先会话的类51有很多种.注地会话,遨诂会话,遗话会话等等,因此在OnReCeiV。比,SSage中会对当前进行的会话进行判断,根据当前的会话1D,判惭出当前具体的会话类型,然后具体的会话类型通过谒用自己的成员函数(会话接口对象的接口方法)将数据会话接口对象.那么分析就简单了.便推下:1.型谓会话类是谁?2 .遨请会话美再会话接口是耶个.速请会话类会在获取到返回的数据后将获得到得数据传说给会话
11、接口的接口方法中3 .分析会语接口中的方法是怎么处理邀请回话类返回的数据的?只要咱们这样分析,咱们就可以倒推出最终数据是怎么处理的,处理数据的核心其实还是更新UI界面和进行要辑判断,所以故终的於理必须是距离U1.界面近的美.会话逮请类是:InvjtcTransactionC1.icntinvit?_tc-mrInvit?Trans-?icti1111CIient(sipprovider,invitereq.this):nvite.tc.request0;SipPcrvider在获取到数据后是怎么传给会话邀请美得?。个具体的会话类梆会继承一个抽象的女.这个牯象的会话类继承了SiPPrOVider
12、1.iStener,在SipProvider获得message后,在OnReceiverMessage中,会通过执行SipProvider1.istener的接口方法将数据传给是实现了此接口的美,在会话邀请类中也就会传递给具体的会话类InYiteTransaction.每一个具体类在初雄化的时候,是必须有SiPPrOVider作为参数的,然后在通过SipProvider的addSiPProVider1.iStener(id.SipProYier1.istneiO指定会话类型和会话接11,还有SipProvider是唯一和独立的.因此一个会话中,只可能存在一种会话类里.InviteTranSaC
13、tiOnCIien1.在OnReCeiVeNeSSaKe会将数据传递给transaction1istener,transactionIiStener其实就是InViteDia1.og,InviteDia1.og实匏了TransactionC1.ient1.istener,并在InViteTranSaCtionC1.inet的时候传递进去T,所以数据都是按照这样的烫辑往上传的,剩下的分析就非常简单了,大家自己分析吧.,所以最终的数据还是会回到UserAgent里面Ca1.1.1.istenerAdapter接口方法里面.这个方法还提巧的,谁发送的请求最后就由津最终耒处理这个巡回的结果.幡后%Si
14、pdroidEnginedt是这些核心类用来交互的一个地儿,然后咱们在启动的ACtHVity里面就只管理用SipdroidEngine提供的方法来控制指令就成了,牛X的樨柒,RegisterAgent敢先发送注册请求,最后的注册结果也得RegiSterAgent来处理.UserAgent最先发出会话邀请请求,最后的邀清结果也将USerAget来处理.Sipdroid中像效男总注号是如何实现的(一)关于Sipdroid是加何实现像效劳注册的?首先告诉大家代码块在哪里,注的的核心在RegiSterAgent类中的函弱register(inttime)中,注册的核心是:1. /Create11ess
15、agere(11nrfifi*dbynv11rfrnjg)2. Messagereq=ssaeFactory.creatReuiSterRequest(sip_provider.3. target,tnrget.nmVanrAddress(uxrpro).qva1.ue,icsi):4.5. req.$0IExpiresHendcr(newExpircs1.kdcr(String.v111.ucf(expireti11r);注册稍微简单一点,因为只是需要客户潴和效劳器进行第定就行了,注册在SIP协议中称f昼记效劳.再向效劳提供商进行注册的时候,效劳提供商你会给我们一个UR1.这个UR1.在SiDdroid中被封装在SiPUR1.中的,这个UR1.写的格式如下:sip:,用户名+主机名。登陆效劳过程中的具体流程如下:程序启动便自动进行初始化在初始化的过程中.每隔一段的时间.客户爱这辿就要发送RegiSIer信息冷效劳器.RCgiS1.Cr中的信息包含了效劳提供商分配绐