最近做android上面的IP通话,所有对sipdroid做了一个简单分析,希望对各位做voip的朋友有点帮助,同时在这里抛砖引玉,希望高手加以指点。我主要是修改Sip那块,将sipdroid的Sip换成自己的私有Sip,同时做一个自己的sip和标准Sip的状态映射,所以对UI这块还不太明白
Sipdroid是一款相对成熟的Voip软件,本身提供了视频语音通话功能,支 持各种网络接入模式(蓝牙,wifi,3G等),多种语音视频编码处理,同时Sip完全用java上层编写,模块比较清晰,相对比较好修改。
1、SipDroid模块简单分析
UI层,负责界面显示模块和界面时间传递
Engine层:软件核心处理层,启动各种服务,初始化软件参数。处理各种UI时间,维持配置文件信息,保存全局属性变量。其中包括UserAgenProfile(用户配置文件属性),UserAgent(用户事件处理),SipdroidEngine(核心处理,所有的UI的事件,参数设计,服务的启动都由此文件调度),RegisterAgent(注册服务处理)
Sip层:提供所有sip消息模型,所有sip消息的处理流程,包括发送,接收,封装,解码等等
网络传输:提供音频,视频信息的处理,此模块会对音频视频进行即时编码解码,同时发送数据。同时还提供JSTN NAT透传技术。
2、SipDroid流程分析:
拨号:拨号请求由UI通过Receiver广播信息交给SipDroidEngine处理,在SipDroidEngine做一些验证,然后交给UserAgine处理。其中call(String target_url, boolean send_anonymous)为判断是否匿名拨号再此方法中,会创建一个ExtendedCall对象,以提供给sip协议栈使用,然后调用ExtendedCall的call方法处理,之后由ExtendedCall的call,调用ExtendedInviteDialog来发送invite请求。由InviteDialog执行具体的invite调用InviteTransactionClient的request方法,最后由InviteTransactionClient发送request请求,在InviteTransactionClient中会通过SipProvider,来发送消息,并打开对端口监听,来收sip消息。发送消息主要有(UDP传输 UdpTransport TCP传输TcpTransport)
来电:在启动程序的时候会通过SipDroidEngine会根据配置,创建一个Provider,这里用到udp传输,创建一个Udpprovider,udpprover是一个Thread,创建的时候就会启动线程,开始监听收到的信息,当受到信息后,通过onServiceTerminated方法,把对象传出到UdpTransport,由UdpTransport处理,再通过onTransportTerminated方法传出到SipProvider对象,最后将在SipProvider的processReceivedMessage方法中处理收到的消息,最后从listeners(map)中取出相应的listener,最后通过相应的listener中的OnReceiveMessage()来处理具体Sip请求