快捷搜索:

Android核心分析(18)-----Android电话系统之RIL-Jav

Android RIL-Java

RIL-Java在本色上便是一个RIL代理,起到一个转发的感化,是Android Java观点空间中的电话系统的动身点。在RIL-D的阐发中,我们知道RILD建立了一个侦听套接口,等待RIL-Java的连接。一旦连接成功,RIL-JAVA就可提议一个哀求,并等待应答,并将布局发送到目标处置惩罚工具。在RIL-Java中,这个哀求称为RILRequest。为了直不雅起见,我照样不厌其烦的给出RIL-Java的框架图。

RIL-Java的大年夜框架包孕了四个方面:

Receiver,Sender,CommandInterface,异步看护机制

(1) Command Interface

在ril.java源代码中,我们可以看到RIL-JAVA工具供给了如下的Command Interface:

getlccCardStatus

getCurrrentCalls

dial

acceptCall

rejectCall

sendDTMF

sendSMS

setupDataCall

setRadioPower

为什么要定义这些接口呢?这函数接口不是凭空伪造出来的,这些都是电话的基础功能的描述,是对Modem AT指令的提炼抽象。大年夜多半Modem都是根据通讯协议供给接口,我们假如不认识通讯协议,请参阅3GPP的相关文档,以及自己应用的Modem的SPEC阐明。

V.25ter AT Commands

3GPP 07.07 AT Comamnds-General commands

3GPP 07.07 AT Comamnds-Call Control commans

3GPP 07.07 AT Comamnds-Network Service related commands

3GPP 07.07 AT Comamnds-MT control and status command

3GPP 07.07 AT Comamnds-GPRS Commands

3GPP 07.07 Mobile Termination Errors

3GPP 07.05 SMS AT Commands

(2)Receiver

Receiver连接到RILD的办事套接口,接管读取RILD通报过来的Response Parcel。Response分为两种类型,一种是URC,一种是敕令应答。对付URC将会直接分发到看护注册表中的Handler。而敕令应答则经由过程Receiver的异步看护机制通报到敕令的发送者进行响应处置惩罚。

(3)Sender

Sender应该分为两部分架构,

上层函数调用Command Interface将哀求消息发送到Sender的架构。

Sender接管到EVENT_SEND消息后,将哀求发送到RILD的架构。

(4)异步应答框架

对付异步应答来讲,敕令的提议者发送后,并不等待应答就返回,应答的回应是异步的,处置惩罚结果经由过程消息的要领返回。站在设计者的角度思虑若何设计相宜的框架来完成异步通讯的功能呢?对付异步系统我们首先应该斟酌的是若何标识敕令和结果,让敕令和结果有一个对应关系,还有敕令没有相应了,若何治理敕令超时?让我们来看看Android设计者若何完成这些事情。

Android设计者使用了Result Message 和RILRequest工具来完成Request和Result的对应对付关系。在上层做调用的时刻天生Result Message工具通报到ril_java,并在Modem有应答后,经由过程Result Message工具带回结果。若何包管该应答是该RILRequest的呢?Android设计者还供给了一个Token(令牌)的观点。在源代码中RILRequest的mSerail就用作了Token。Token用来独一标识每次发送的哀求,并且Token将被通报到RILD,RILD在组装应答是将Token写入,并传回到ril-java,ril-java根据该Token找到响应的Request工具。

(4.1)RIL敕令的发送模式

协议的真正实现是在rild中,RIL-JAVA更多的是一个抽象和代理,我们在钻研源代码的历程中就会体会到到RIL-JAVA中的敕令函数都有一个合营的框架。

SendXxxCmd(传入参数Data,传出参数result){

组合RILRequest(哀求号,result,mSerail)

Data->RR

send(RILRequest): Message

}

1)RILRequest

哀求号:

request将通报到RILD用以标识敕令,request代表某个功能。例如拨叫的request号为:RIL_REQUEST_DIAL。在libs/telephony/ril_commands.h有定义。RILRequest.obtain@RILRequest根据敕令哀求号,传入参数Result Message,mSerail构造了一个RILRequest。Result Message将带回应答信息回到敕令的提议者。

mSerail:

Android应用了一个RILRequest工具池来治理Andoird RILRequest。mSerail是一个递增的变量,用来独一标识一个RILRequest。在发送时恰是用了该变量为Token,在rild层看到的token便是该mSerail。

EVENT_END:

EVENT_END@handleMessage@RILSender@RIL.java

2)发送步骤:

第一步:

天生RILRequest,此时将天生m_Serial(哀求的Token)并将哀求号,数据,及其Result Message 工具填入到RILRequest中

第二步:

应用send将RILRequest打包到EVENT_SEND消息中发送到到RIL Sender Handler,

第三步:

RilSender 接管到EVENT_SEND消息,将RILRequest经由过程套接口发送到RILD,同时将RILRequest保存在mRequest中以便应答消息的返回。

(4.2) 接管模式

第一步:阐发接管到的Parcel,根据类型不合进行处置惩罚。

第二步:根据数据中的Token(mSerail),反查mRequest,找到对应的哀求信息。

第三步:将是数据转换成结果数据。

第四步:将结果放在RequestMessage中发还到哀求的提议者。

4.3)具体的GSMCallTracker,RIL-Java函数对比

您可能还会对下面的文章感兴趣: