Telephony框架设计解析.docx

上传人:lao****ou 文档编号:873328 上传时间:2024-07-05 格式:DOCX 页数:17 大小:266.49KB
下载 相关 举报
Telephony框架设计解析.docx_第1页
第1页 / 共17页
Telephony框架设计解析.docx_第2页
第2页 / 共17页
Telephony框架设计解析.docx_第3页
第3页 / 共17页
Telephony框架设计解析.docx_第4页
第4页 / 共17页
Telephony框架设计解析.docx_第5页
第5页 / 共17页
亲,该文档总共17页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《Telephony框架设计解析.docx》由会员分享,可在线阅读,更多相关《Telephony框架设计解析.docx(17页珍藏版)》请在第一文库网上搜索。

1、目前Te1ephony框架设计解析version:author:*本篇文档将从如下六个方面讲述te1ephony框架设计:RI1.多卡及多运营商设计区分、不同运营商的extends继承实现、IDE1的设计、观察者模式设计、TeIephonyRegistry监听模式设计、ServiceStateTrackerDcTrackerCa11Tracker附上AndroidTe1ephony框架图JavuApp1icationsCa1111MMSSMS-Data-COnnCtCt1OnICSCttiCgIJavaFnimcuorksActivity11WitukwManagerMnrugerfoment

2、ProvidersVieWISyyCT1INotificationIManagerPikagcITckpbunyManagerManagvrKoourcMamBr1oartoii-ManaIerIGTaIkSerViCCUcr1ibmrioAndroidRuntimeSurfaceMuriagcr卜工113CIxc1ibninTOpcnG1FnCCTyPCIIWcKKIbaKKWCGiiMUCh1nCHA1(FiardwarcAbMraction1iycr)GPSWi-HRDIO(RI1)1inuxKerne1PS:AndrOid?TeIePhOny采用了分层结构,共跨越了4层:应用,包括了P

3、hone、MMS和STK等应用程序框架,提供TeIePhOnyManager,包含数据连接、通话、信息和S1M相关的AP13.无线通信接口层(RI1),主要位于USer?1ibrarieS层中的HA1层,提供AP(App1ication?Processor)和BP(?Baseband?Processor)之间的通信功能,位于BP,主要负责实际的无线通信能力处理一、RI1R11有RIU和RI1C,RIU是我们所熟悉的java侧代码,RI1C是hardware/ri1目录下C代码,此处我们简单介绍下R11C模块的初始化和运行机理。Android的RI1驱动模块,在hardware/ri1目录下,一

4、共分ri1d,以及三个部分,另有一radiooptions可供自动或手动调试使用。都依赖于inc1ude目录中头文件。目前CUPCake分支上带的是gsm的支持,另有一Cdma分支,这里分析的是gsm驱动。GSM模块,由于Modem的历史原因,AP一直是通过基于串口的AT命令与BB交互。包括到了目前的一些edge或3g模块,或像Om叩这类ap,bp集成的芯片,已经使用了USB或其他等高速总线通信,但大多仍然使用模拟串口机制来使用AT命令。这里的RI1(RadioInterfaCe1aye1j层,主要也就是基于AT命令的操作,如发命令,response解析等。首先介绍一下ri1d与以及的关系:1

5、 .ri1d:仅实现一main函数作为整个ri1层的入口点,负责完成初始化。2 .:与ri1d结合相当紧密,是其共享库,编译时就已经建立了这一关系。组成部分为,。驻留在ri1d这一守护进程中,主要完成同上层通信的工作,接受ri1请求并传递给,同时把来自的反馈回传给调用进程。3 .:ri1d通过手动的d1open方式加载,结合稍微松散,这也是因为主要负责跟Modem硬件通信的缘故。这样做更方便替换或修改以适配更多的Modem种类。它转换来自的请求为AT命令,同时监控Modem的反馈信息,并传递回。在初始化时,ri1d通过符号RI1Jnit获取一组函数指针并以此与之建立联系。4 .radioopt

6、ions:radiooptiongs通过获取启动参数,利用socket与ri1d通信,可供调试时配置Modem参数。接下来分析初始化流程:主入口是中的main函数,主要完成三个任务:1 .开启中的event机制,在RI1startEvent1oop中,是最核心的由多路1/0驱动的消息循环。2 .初始化,也就是跟硬件或模拟硬件modem通信的部分(后面统一称硬件),通过RI1Jnit函数完成。3 .通过RI1Jnit获取一组函数指针RI1RadioFunctions,并通过RI1_register完成注册,并打A接受上层命令的SOCket逋道。ri1d.c中的maiOri1_event_1OOP

7、(),ri1_event.cpp中建立应消息(event)K列机制ri1_event_1oop能通过一个多路豆用IQ的机制(se1ect)来等待这些fd如果任何一个F有数据写入,则进入分析流程PfocessTimeoutsO.ProeeSSReadReadieS(&rids,),IirePendingO.后面会详细分析这些流程H1evenicpp中包含的方法voidri1_event_inH();voidri1_event_set(structri1_event,ev,intd.);voidri1_even1aCM(StrUCtri1_event,ev);voidri1_timer_add(s

8、tructri1_event,ev.structtimeva1,tv):voidh1_Gvent_de1(structri1_event*v);void1eventJoop();至此第一个初始化任务分析完毕,这样便建立起了基于event队列的消息循环,稍后便可以接受上层发来的的请求了(上层请求的event对象建立,在第三个任务中).图一(RI1-StartEvent1oop消息循环初始化)图二(RI1Init硬件modem通信部分初始化)图三(RI1-RadioFunctions接受上层命令的socket通道初始化)二、Te1ephony中多卡及多运营商设计区分以双卡为例,上层是如何区分卡1和

9、卡2在te1ephony模块中运行,AP发送AT命令后?modem如何区分去执行卡1还是卡2的操作?中的多卡1)AP区分多卡要区分多卡,就必须要为每张卡都给其属于其自己的变量。是开机自启动进程,有关te1ephony的很多初始化都是在这个进程中完成的。下面我们来详细解析此进程:packagesservicesTe1ephonyOpp1icationandroid:name=PhoneAppInitia1izethete1ephonyframework,这里很重要,创建Phone类型,区分多Sim卡,接下来重点将此流程(this);CreatetheNotificationMgrsing1eto

10、n,whichisusedtodisp1aynotificationMgr=(this);registerforMM1/USSD(mHand1er,MM1COMP1ETE,nu11);.等等O;intretryCount=0;for(;)boo1eanHasException=fa1se;retryCount+;try始化Defau1tPhoneNotifier,第五章就是会用到此Defau1tPhoneNotifier的个例子SPhoneNotifier=newDefau1tPhoneNotifierO;intCdmaSubscription=(context);(1OG,TAG,CdmaS

11、ubscriptionsetto+CdmaSubscription);*Incaseofmu1tiS1MmodetwoinstancesofPhoneProxy,RI1arecreated,whereasinsing1eSIMmodeon1yinstance.IsMu1tiSimEnab1edOfunctioncheckswhetheritissing1eSIMormu1tiSIMmode*/intnumPhones=().getPhoneCount();intnetworkModes=newintnumPhones;SProxyPhones=newPhoneProxynumPhones;SC

12、ommandsInterfaces=newRI1numPhones;循环是开机时给卡槽获取设置网络模式(例如是GSMON1Y还是1TE.),te1ephony中有关网络模式此处不做详细讲述,后面再单独讲解for(inti=O;inumPhones;i+)networkModesi=;Stringva1ue=(i,nu11);if(va1ue!=nu11&!()try(networkModesi=(va1ue);catch(NumberFormatExceptionex)(1OG_TAG,NumberFormatExceptioninparsingnetworkMode);)(1OG_TAG,N

13、etworkModesetto+(networkModesi);SCommandsInterfaces很重要,会一直关联到RI1SCommandsInterfacesi=newRI1(context,networkModesi,CdmaSubscription,i);(1OG-TAG,CreatingSubscriptionContro11er);始化SubscriptionControner,一般我们获取数据库中SiminfO表里的有关Sim卡信息都会用此类去获取(context,SCommandsInterfaces);始化UiccContro11er,framework中对sim卡的处理

14、,读写等等操作mUiccContro11er=(context,SCommandsInterfaces);个for循环就是区分Sim卡的重点,位每个卡槽的Sim创建一个PhOne类型,在整个te1ephony运行过程中,和卡槽始终对应ItSProxyPhone=SProXyPhOneS();SCommandsInterface=sCommandsInterfaces0;RequestingtheappwithComponentNameComponentName=(context,true*UpdateIfNeeded*);StringpackageName=NONE;if(ComponentN

15、ame!=nu11)packageName=();(1OG-TAG,defau1tSmsApp1ication:+packageName);始化一个默认信息应用(context);SMadeDefau1ts=true;(1OG_TAG,CreatingSubInfoRecordUpdater);SsubInfoRecordUpdater=newSubscription1nfoUpdatertcontext,SProxyPhones,SCommandsInterfaces);O-UpdatePhonesAvai1abi1ity(sProxyPhones);tartMonitoringImsService();)此时的phone类型就出来了,AP侧可以通过中的getPhone方法获取对应卡的phone0

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 应用文档 > 工作总结

copyright@ 2008-2022 001doc.com网站版权所有   

经营许可证编号:宁ICP备2022001085号

本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有,必要时第一文库网拥有上传用户文档的转载和下载权。第一文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知第一文库网,我们立即给予删除!



客服