您好,欢迎访问三七文档
TOPsecretAndroidSIPdroidProjectSharingMay232011Warning:Ifyouhaveanyquestions,adviceorsomethingelse,pleaseletteamknow.FightTeamContents怎么学习androidSipdroid开源代码.............................................................................................................................3Sipdroid流程详细分析.........................................................................................................................................................4Sipdroid会话邀请流程(一)...............................................................................................................................................5Sipdroid会话邀请流程(二)................................................................................................................................................6Sipdroid中像服务器注册是如何实现的(一)...............................................................................................................8Sipdroid注册(二)-Sipdroid注册SIP消息分析.......................................................................................................10Sipdroid注册(三)-注册返回结果的监听.....................................................................................................................13Sipdroid数据发送流程.......................................................................................................................................................15Sipdroid中的视频通话是如何实现的..........................................................................................................................18Sipdroid中涉及到的音频编解码库...............................................................................................................................19Sipdroid涉及到的协议之RFC3261..............................................................................................................................20怎么学习androidSipdroid开源代码?Sipdroid目前有24个包,140多个java文件.首先学习Sipdroid,至少得明白Sipdroid是怎么玩的,实现的主要功能是什么,具体的流程操作是怎么执行的。先整理下下面的问题:一.Sipdroid的数据流程怎么发送的?参考文档:?这点非常的重要,因为Sipdroid采用的是RFC3261协议,大家看了RFC3261协议后,你就会明白,Sipdroid中对于Message的封装是如何完成,那么Message的封装和生成这块所涉及到得设计模式和代码,你基本就可以弄明白参考文档:,为什么呢,功能块是完全独立和分开的,高内聚低耦合,Sipdroid本身来说就像一座非常难以攻克的堡垒,但是咱们只要一块一块的攻,不久就发现整做城堡都被搞定了。一般来说,应该这么做:1.研究注册流程参考文档:,比如视频和声音的编解码库,协议的封装和设计模式等Sipdroid流程详细分析1.SipDroid模块简单分析UI层,负责界面显示模块和界面时间传递Engine层:软件核心处理层,启动各种服务,初始化软件参数。处理各种UI时间,维持配置文件信息,保存全局属性变量。其中包括UserAgenProfile(用户配置文件属性),UserAgent(用户事件处理),SipdroidEngine(核心处理,所有的UI的事件,参数设计,服务的启动都由此文件调度),RegisterAgent(注册服务处理)Sip层:提供所有sip消息模型,所有sip消息的处理流程,包括发送,接收,封装,解码等等网络传输:提供音频,视频信息的处理,此模块会对音频视频进行即时编码解码,同时发送数据。同时还提供JSTNNAT透传技术。2.SipDroid流程分析:拨号:拨号请求由UI通过Receiver广播信息交给SipDroidEngine处理,在SipDroidEngine做一些验证,然后交给UserAgine处理。其中call(Stringtarget_url,booleansend_anonymous)为判断是否匿名拨号再此方法中,会创建一个ExtendedCall对象,以提供给sip协议栈使用,然后调用ExtendedCall的call方法处理,之后由ExtendedCall的call,调用ExtendedInviteDialog来发送invite请求。由InviteDialog执行具体的invite调用InviteTransactionClient的request方法,最后由InviteTransactionClient发送request请求,在InviteTransactionClient中会通过SipProvider,来发送消息,并打开对端口监听,来收sip消息。发送消息主要有(UDP传输UdpTransportTCP传输TcpTransport)来电:在启动程序的时候会通过SipDroidEngine会根据配置,创建一个Provider,这里用到udp传输,创建一个Udpprovider,udpprover是一个Thread,创建的时候就会启动线程,开始监听收到的信息,当受到信息后,通过onServiceTerminated方法,把对象传出到UdpTransport,由UdpTransport处理,再通过onTransportTerminated方法传出到SipProvider对象,最后将在SipProvider的processReceivedMessage方法中处理收到的消息,最后从listeners(map)中取出相应的listener,最后通过相应的listener中的OnReceiveMessage()来处理具体Sip请求Sipdroid会话邀请流程(一)Sipdroid会话流程图:图片比较直观,但是表述却不够详细,下面咱们详细分析下流程:会话邀请所涉及到得类:SipdroidEngine(call)-UserAgent(call)-ExtendedCall(call)-InviteDialog(invite)左边的代表涉及到的类,右边代表涉及到的核心方法,从左到右进行观察,左边的类都有一个右边类型的参数作为自己的成员函数,就是SipdroidEngine有一个成员函数ua,这个ua是UserAgent类型的。。。。InviteDialog中的invite函数所做的事情也是非常的简单,生成会话邀请的message然后通过SipProvider发送出去就行了,那么发送完毕后,怎么实现对发送结果的监听呢?其实自己猜测一下也猜测到服务器返回数据会什么类型的?1、等待对方应答中2.对方已经应答,进入双边通话模式中,同时手机这边开始声音和视频的采集.(声音和视频的采集,这个是核心中的核心哦,马上就要弄到这块了,兴奋啊)3.超时,对方无应答.在二的分析中,咱们用倒推的方法来分析下客户端在接受到服务器的返回后,传递到了哪里去进行会话邀请的结果了,客户端是怎么实现的.Sipdroid会话邀请流程(二)这里咱们要弄明白的是,Sipdroid会话邀请的结果是在哪里进行监听的,以及这种效果是怎么实现的?发送消息统一是由Sipdroid的sendMessage来进行发送的,然后返回的数据咱们可以在Sipdroid的OnReceiveMessage中来进行获取。在Sipdroid注册结果的监听:,咱们分析了下,首先会话的类型有很多种,注册会话,邀请会话,通话会话等等,因此在OnReceiveMessage中会对当前进行的会话进行判断,根据当前的会话ID,判断出当前具体的会话类型,然后具体的会话类型通过调用自己的成员函数(会话接口对象的接口方法)将数据会话接口对象.那么分析就简单了,倒推下:1.邀请会话类是谁?2.邀请会话类得会话接口是哪个,邀请会话类会在获取到返回的数据后将获得到得数据传递给会话接口的接口方法中3.分析会话接口中的方法是怎么处理邀请回话类返回的数据的?只要咱们这样分析,咱们就可以倒推出最终数据是怎么处理的,处理数据的核心其实还是更新UI界面和进行逻辑判断,所以最终的处理必须是距离UI界面近的类。会话邀请类是:InviteTransactionClientinvite_tc=newInviteTransactionClient(sip_provider,invite_req,this);nvite_tc.request();SipPorvider在获取到数据后是怎么传给会话邀请类得?每个具体的会话类都会继承一个抽象的会话类,这个抽象的会话类继承了SipProviderListener,在SipProvider获得message后,在OnReceiverMessage中,会通过执行SipProviderListener的接口方法将数据传给是实现了此接口的类,在会话邀请类中也就会传递给具体的会话类InviteTransaction.每一个具体类在初始化的时候,是必须有SipProvider作为参数的,然后在通过S
本文标题:SIPDroid
链接地址:https://www.777doc.com/doc-25463 .html