由于工作需要,对SipDroid和协议Sip进行了研究。以下是前期的研究记录。
从Sipdroid开始,因为程序是从这开始的。
这是Sip进入的界面, 启动时程序实例话了一个Sip引擎并进行了注册等操作,用CallsCursor描述了对象,用CallsAdapter适配器显示了它,如果用户没有设置服务
端口与没有设置预设的电话则会弹出对话框进行设置,使用了Receiver在显示进度以及定位更新等信息,添加了关于、退出、设置等菜单调用。
进入Receiver广播的分析
该广播处理了(开启与关闭虚拟网、注册引擎、网络发生改变时的处理、虚拟网发生的处理、数据改变的处理、电话状态改变的处理、亮度传感器的处理、蓝牙SCO
音频连接状态已改变、有线耳机插入或拔出的处理、手机屏幕锁屏和解锁都是会发广播出来的、用户被唤醒触发、电源管理、wiif状态改变、扫描wifi热点),实现
了构造引擎SipdroidEngine、铃声以及震动的开启与停止、来电去电以及空闲挂断的判断处理、通知栏信息显示、定位位置更新处理等处理。
RegisterService
这是一个注册服务,注册监控了网络连接状态、任何数据变化、手机状态变化、插槽变化、屏幕锁屏以及解屏等。
Caller
这是一个广播类,电话呼叫广播拦截,有拦截去电、来电等操作,详细记录了时间判断是否超时,判断是否为sip用户。
SipdroidEngine
程序的主要功能代码引擎,该类通过用户代理、注册代理以及用户代理简介实现通话以及视频,开始引擎是进行了电源管理、wifi管理、用户…等实例化。
SipdroidListener
只是一个监听的接口。
OwnWifi
这是一个wifi状态改变的广播,用于记录wifi的状态。
CreateAccount
创建帐号对话框,帐号属性--邮箱、服务地址、帐号、随机生成密码、端口。
Call
主要提供手机通话状态的信息。记录状态信息 空闲、活动、通话中、拨号中、警报中、来电中、等待中、丢失中。
ButtonGridLayout
主要的作用是设置显示的格式,它继承于父类:ViewGroup。
CallCard
这个类一开始以为是与Card相关的类,其实它本质上就是一个提供UI element的类,它会在通话开始到结束的整个过程中显示不同的界面变化。
CallerInfo
这个类用于对于给定的电话号码,查找出拨号人的信息,因此这个类会与Contacts后台的数据库会发生交互。
CallerInfoAsyncQuery
拨打信息同步查询,执行sql语句查询。
CallStateException
自定义手机状态异常
Connection
这个类提供关于通话连接信息,同时会对每一次的通过连接进行历史记录。
ContactsAsyncHelper
图像的异步访问,内部定义了加载完成接口,操作图像的加载以及显示。
Phone
这是一个接口类,提供了一些手机状态信息。
PhoneUtils
手机单元类
SlidingCardManager
管理滑动InCallScreen“电话卡”。在新的“简化”滑动卡的用户界面,该卡是始终处于下列状态之一:屏幕顶部的卡、屏幕底部的卡。
InCallScreen
电话显示,实现了传感器接口,通话中的屏幕显示,
Bluetooth
蓝牙工具,管理蓝牙的一个类,具备开启、关闭、判断可用等功能。
RtpStreamReceiver
是一个线程,一个通用的流接收机。
Activity2
调用通话中的屏幕
AutoAnswer
自动回复显示界面
CallScreen
来电时的显示操作界面,以及发送数据在线包、视频包,接受视频包等等。
ChangeAccount
帐号改变显示对话框。
Checkin
登记手续
InstantAutoCompleteTextView
显示自动匹配文本控件
LoopAlarm
保持在线广播,发送在线包。
LoopLocation
发送拍摄地点的广播
OneShotAlarm
一杆报警的广播
OneShotLocation
拍摄地点广播
Settings
设置界面,针对程序属性的设置。
SipRingtonePreference
铃声操作,有铃声选择器、保存铃声、恢复铃声等功能。
SIPUri
服务地址,创建拨打的界面。
VideoCamera
视频摄像,视频的操作,获得远程视频,并进行录制等等。
VideoCameraNew
视频解锁
VideoCameraNew2
重新连接
VideoPreview
视频预览
UserAgent
简单的SIP用户代理(UA)。它包括音频/视频应用。它可以使用外部音频/视频媒体应用工具。
目前仅鼠(强大的音频工具)和VIC作为外部应用程序的支持。
……
其它的直接看源码。
界面的类有:
org.sipdroid.sipua.ui.Sipdroid 主界面
org.sipdroid.sipua.ui.PSTN 拨打按钮界面
org.sipdroid.sipua.ui.SIP sip界面 同PSTN一样
org.sipdroid.sipua.ui.AutoAnswer 自动回复
org.sipdroid.sipua.ui.ChangeAccount 帐号改变
org.sipdroid.sipua.ui.SIPUri 服务地址
org.sipdroid.sipua.ui.Activity2 调用通话中的屏幕 转向通过屏幕
org.sipdroid.sipua.ui.Settings 设置界面
org.sipdroid.sipua.ui.VideoCamera 视频摄像视图
org.sipdroid.sipua.ui.InCallScreen 电话显示
服务的类有:
org.sipdroid.sipua.ui.RegisterService 注册服务的
广播接受的类有:
org.sipdroid.sipua.ui.OneShotAlarm 一杆报警的广播
org.sipdroid.sipua.ui.OneShotAlarm2 一杆报警的广播 标识是否有网进行注册服务
org.sipdroid.sipua.ui.LoopAlarm 保持在线的广播
org.sipdroid.sipua.ui.OwnWifi wifi广播 记录状态
org.sipdroid.sipua.ui.LoopLocation 接受拍摄地点的广播
org.sipdroid.sipua.ui.OneShotLocation 拍摄地点的广播
org.sipdroid.sipua.ui.Caller 电话呼叫广播拦截
org.sipdroid.sipua.ui.Receiver 接受广播(系统完成启动广播、网络连接的变化广播、Vpn 连接变化广播、数据状态改变广播、电话状态改变广播、亮度传感器
广播、蓝牙SCO音频连接状态已改变广播、有线耳机插入或拔出广播、手机屏幕锁屏和解锁广播、用户被唤醒触发广播、wiif状态改变广播)
Sipdroid
-->Receiver.engine(context).isRegistered(); 进行了引擎的生成,以及开启RegisterService。
-->PreferenceManager.getDefaultSharedPreferences(this).getBoolean(Settings.PREF_NOPORT, Settings.DEFAULT_NOPORT)
进行了无端口的判断,当没有设置的时候,会弹出一个对话框进行设置。
-->Receiver.engine(this).call(target, true) 进行拨打判断 最后使用了UserAgent.call进行了拨打。
-->Receiver.engine(this).registerMore(); 引擎更多的注册 设置本地ip地址、进行了枚举注册代理,如果注册了就显示出来。
-->onOptionsItemSelected(MenuItem item) 响应菜单,退出时关闭定位、停止引擎、清空、停止服务。
RegisterService
由Sipdroid里面的on开启,此处把监控数据变化、手机状态变化、插拔变化、屏幕解锁、网络变化等广播开启。
Receiver
-->SipdroidEngine mSipdroidEngine; 静态成员电话引擎,拨打电话的主要成员。
-->engine(context).register(); 引擎注册,sdk只有大于8,才会启动蓝牙。
-->engine(context).registerMore(); 更多注册代理
-->boolean isFast(int i) 是否快速响应,减少一些重复操作,当存在连接信息,则操作vpn虚拟网。
-->boolean isFastGSM(int i) 当存在连接是,减少一些操作。
-->void stopRingtone() 停止铃声
-->void onState(int state, String caller) 状态的改变标识,起初时只是建立连接,当前状态改变时,进行了数据流以及相关的操作。
-->void onText(int type, String text, int mInCallResId, long base) 设置通知栏内容显示
-->void updateAutoAnswer() 更新自动回复
-->void registered() 注册位置更新定位,定位分两种,一种是网络监听,一种是gps监听。
-->void enable_wifi(boolean enable) 分情况操作是否开启关闭wifi
-->void url(final String opt) 是一个多线程,主要是负责报告数据是否有错。
-->void broadcastCallStateChanged(String state, String number) 改变播放状态广播
--> void progress() 显示进展情况。
-->boolean on_vpn() 是否连接VPN虚拟网络
-->Handler mHandler = new Handler() 处理自定义的消息,主要有wifi 要求接入点扫描、开启wifi。
-->void onReceive(Context context, Intent intent) 接受(系统完成启动广播、网络连接的变化广播、Vpn 连接变化广播、数据状态改变广播、电话状态改变广
播、亮度传感器广播、蓝牙SCO音频连接状态已改变广播、有线耳机插入或拔出广播、手机屏幕锁屏和解锁广播、用户被唤醒触发广播、wiif状态改变广播)
SipdroidEngine
主要部分引擎,实现了注册代理监听接口。
-->public UserAgent[] uas; User Agent 用户代理
-->public RegisterAgent[] ras Register Agent 注册代理
-->private KeepAliveSip[] kas 保持在线包
-->public SipProvider[] sip_providers; 实现SIP传输层,是发送和接收SIP消息层
-->PowerManager.WakeLock[] wl 电源管理
-->WifiManager.WifiLock[] wwl; wifi网络管理
-->UserAgentProfile getUserAgentProfile(String suffix) 生成一个用户代理简介
-->public boolean StartEngine() 开始引擎,实例化了电源管理、wifi管理、用户代理、注册代理、保持连接、协议等等。
-->String getContactURL(String username, SipProvider sip_provider) 得到联系的地址
-->void setOutboundProxy(SipProvider sip_provider, int i) 设置传输绑定代理
-->public void CheckEngine() 匹配传输代理,有则绑定。
-->public void expire() 清零操作
-->public void unregister(int i) 卸载一些操作
-->public void registerMore() 更多注册 主要是用户代理简介
-->public void register() 根据用户代理简介进行注册
-->public void registerUdp() 同上一样
-->public void halt() 停止操作
-->public boolean isRegistered() 判断注册里是否已经注册
-->public boolean isRegistered(int i) 指定项是否已经注册
-->public void onUaRegistrationSuccess(RegisterAgent reg_ra,NameAddress target, NameAddress contact, String result)
根据注册代理、用户地址、目标地址进行注册。
-->public void listen() 对用户代理的进行监听
-->public boolean call(String target_url, boolean force) 主要的呼叫
-->public void answercall() 回复电话即接听
-->public void rejectcall() 拒绝电话,挂断。
-->public void togglehold() 转接
-->public void transfer(String number) 呼叫转让
-->public void togglemute() 切换静音
-->public void togglebluetooth() 切换到蓝牙
-->public int speaker(int mode) 设置说话模式
-->public void keepAlive() 保持在线
……
其它的看源码了。