手机开发培训 10_Android的电话部分

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Android的电话部分Android的电话部分第一部分Android电话部分的综述第二部分Modem驱动第三部分Android电话的的本地RIL层第四部分电话部分JAVA框架及应用第一部分Android电话部分的结构Android作为一个智能手机平台,电话(Telephony)部分的功能自然是重点。电话部分的主要功能是呼叫(Call)、短信(Sms)、数据连接(DataConnection)以及SIM卡、电话本等功能。本章将介绍绝大多数功能的实现框架。Android电话部分主要分为:Modem驱动、RIL(RadioInterfaceLayer)、电话服务框架、应用4层结构。第一部分Android电话部分的结构libril.soRILdriver(UART,SDIO,USB)KernelSpacelibreference-ril.sorilddeamonandroid.telephony.*dlopeninterfaceRIL_InitJAVAFrameworkJAVAAplicationCalling,SMS……RIL_startEventLoop()RIL_register()RIL_onRequestComplete()RIL_onUnsolicitedResponse()RIL_requestTimedCallback()NativeFrameworkRIL_RadioFunctionscom.android.internal.telephony.*Socket“Rild”RILPart第二部分Modem驱动实现电话功能的主要硬件是通信模块(Modem),Modem通过与通信网络进行沟通传输语音及数据,完成呼叫、短信等相关电话功能。对于大部分目前的独立通信模块而言,无论是2G还是3G都已经非常成熟,模块化相当完善,硬件接口非常简单,也有着相对统一的软件接口。一般的Modem模块装上SIM卡,直接上电即可工作,自动完成初始的找网、网络注册等工作,完成之后即可打电话、发短信等。但独立模块因为体积问题,在手机设计中较少使用,而是使用chip-on-board的方式。另外也有不少Modem基带与应用处理器共存。第三部分Android电话的的本地RIL层3.1简介3.2RILD守护进程3.3libril库3.4RIL的实现库ReferenceRIL3.5Request(请求)流程3.6Response(响应)流程3.7RIL的移植工作第一部分Android电话部分的结构RadioInterfaceLayer(RIL)提供了电话服务和的radio硬件之间的抽象层。RIL负责数据的可靠传输、AT命令的发送以及response的解析。应用处理器通过AT命令集与带GPRS功能的无线通讯模块通信。ATcommand由Hayes公司发明,是一个调制解调器制造商采用的一个调制解调器命令语言,每条命令以字母AT开头。第三部分Android电话的的本地RIL层本地代码:RIL支持的本地代码包括ril库和守护进程:hardware/ril/includehardware/ril/librilhardware/ril/rildhardware/ril/reference-ril编译结果是/system/bin/rild:守护进程/system/lib/libril.so:RIL的库/system/lib/libreference-ril.so:RIL参考库3.1简介hardware/ril/include目录中的ril.h头文件是Android的RIL框架的结构和接口,包括各种数据结构,枚举值,定义各种以RIL_开头的命令整数值。宏RIL_SHLIB用于区分这个头文件在不同地方的定义。#ifdefRIL_SHLIBstructRIL_Env{void(*OnRequestComplete)(RIL_Tokent,RIL_Errnoe,void*response,size_tresponselen);void(*OnUnsolicitedResponse)(intunsolResponse,constvoid*data,size_tdatalen);void(*RequestTimedCallback)(RIL_TimedCallbackcallback,void*param,conststructtimeval*relativeTime);};constRIL_RadioFunctions*RIL_Init(conststructRIL_Env*env,intargc,char**argv);#else/*RIL_SHLIB*/voidRIL_register(constRIL_RadioFunctions*callbacks);voidRIL_onRequestComplete(RIL_Tokent,RIL_Errnoe,void*response,size_tresponselen);voidRIL_onUnsolicitedResponse(intunsolResponse,constvoid*data,size_tdatalen);voidRIL_requestTimedCallback(RIL_TimedCallbackcallback,void*param,conststructtimeval*relativeTime);#endif/*RIL_SHLIB*/3.2RILD守护进程在android的RIL结构中,libril.so是一个辅助功能的库,它为libreference-ril.so和rild使用。rild是一个守护进程,它动态打开(dlopen),RIL的功能库,进入事件循环。libreference-ril.so是实现RIL功能的库,其主要的功能是AT命令的解析,当使用不同的硬节接口或者不同功能的硬件的时候,主要需要重写本库。3.2RILD守护进程rild是一个守护进程,在这里宏RIL_SHLIB被定义。执行的过程为获取参数-打开功能库-建立事件循环(线程)-执行RIL_Init-RIL_register。intmain(intargc,char**argv){/*获取参数并解析*/dlHandle=dlopen(rilLibPath,RTLD_NOW);/*启动线程,进入事件循环*/RIL_startEventLoop();rilInit=(constRIL_RadioFunctions*(*)(conststructRIL_Env*,int,char**))dlsym(dlHandle,RIL_Init);/*处理参数*/funcs=rilInit(&s_rilEnv,argc,rilArgv);RIL_register(funcs);done:while(1){sleep(0x00ffffff);}}serviceril-daemon/system/bin/rildsocketrildstream660rootradiosocketrild-debugstream660radiosystemuserrootgroupradiocacheinetmiscinit.rc中,启动本守护进程,如果使用-l可以指定所使用的功能库。3.3libril库libril.so主要提供了用于注册的RIL_register()以及RIL_onRequestComplete(),RIL_onUnsolicitedResponse(),RIL_requestTimedCallback()三个函数在RIL处理过程中需要处理的函数,它们作用相当于回调函数。另外定义了下面的几个用于字符串转换的函数,供RIL的功能库中使用。externCconstchar*requestToString(intrequest);externCconstchar*failCauseToString(RIL_Errno);externCconstchar*callStateToString(RIL_CallState);externCconstchar*radioStateToString(RIL_RadioState);3.4RIL的实现库ReferenceRILlibreference-ril.so是RIL的功能库,在这里宏RIL_SHLIB被定义。其中,实现RIL_Init()函数,将RIL_Env传入环境的三个函数指针保留,在需要处理的场合调用,返回一个RIL_RadioFunctions类型的函数指针,用于注册。staticconstRIL_RadioFunctionss_callbacks={RIL_VERSION,onRequest,currentState,onSupports,onCancel,getVersion};staticconststructRIL_Env*s_rilenv;pthread_ts_tid_mainloop;constRIL_RadioFunctions*RIL_Init(conststructRIL_Env*env,intargc,char**argv){/*......*/pthread_attr_tattr;s_rilenv=env;/*参数处理*/pthread_attr_init(&attr);pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);ret=pthread_create(&s_tid_mainloop,&attr,mainLoop,NULL);return&s_callbacks;}3.5Request(请求)流程对于请求流程,首先从Java层通过Socket将命令发送到RIL层的RILD守护进程,RILD守护进程中,负责监听的ril_event_loop消息循环中的Select发现RILDSocket有了请求链接信号,会建立起一个record_stream,打通与上层的数据通道并开始接收请求数据。数据通道的回调函数processCommandsCallback()会保证收到一个完整的Request后(Request包的完整性由record_stream的机制保证),将其送达processCommandBuffer()函数。这是命令的下发流程。对Request流程来说,它是由Java中的RIL.java发起的。3.6Response(响应)流程Response(响应)有两类:unsolicited表示主动上报的消息,如来电、来短信等;而solicited是AT命令的响应。判断是否是solicited的依据有两点:一是当前有AT命令正在等待响应;二是读取到的响应符合该AT命令的响应格式。对Response流程来讲,流程是从Modem设备发回响应数据开始的。RILD通过readerLoop()函数,利用readline逐行读取响应数据,随后通过processLine进行分析(与短信相关的响应比较独特,要特殊处理)。主动上报一般以+XXXX的形式出现,而AT命令的响应格式则有一行或多行之分,最终一定以OK或ERROR结尾。3.6Response(响应)流程ProcessLine有以下几种情形:(a)没有AT命令正在等待响应或不符合AT响应格式,一般是主动上报行,由handleUnsolicited处理,handleUnsolicited()→onUnsolicited()→RIL_onUnsolicitedResponse()。(b)isFinalResponseSuccess/isFinalResponseError是最终响应行,转到handleFinalResponse处理,handleFinalResponse会发送线程同步信号,激活等待的发送线程。如前文提到的requestDial,将从at_send_command返回,调用RIL_onRequestComplete处理响应。(c)符合当前AT命令响应格式行

1 / 30
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功