Android RIL-Java

123.jpg (2.09 KB, 下载次数: 1)

下载附件  保存到相册

2012-3-21 10:47 上传

 

  RIL-Java在本质上就是一个RIL代理,起到一个转发的作用,是Android Java概念空间中的电话系统的起点。在RIL-D的分析中,我们知道RILD建立了一个侦听套接口,等待RIL-Java的连接。一旦连接成功,RIL-JAVA就可发起一个请求,并等待应答,并将结构发送到目标处理对象。在RIL-Java中,这个请求称为RILRequest。为了直观起见,我还是不厌其烦的给出RIL-Java的框架图。

456.jpg (9.81 KB, 下载次数: 0)

下载附件  保存到相册

2012-3-21 10:48 上传

 

  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

789.jpg (12.57 KB, 下载次数: 0)

下载附件  保存到相册

2012-3-21 10:50 上传

 

aa.jpg (13.93 KB, 下载次数: 0)

下载附件  保存到相册

2012-3-21 10:50 上传

 

  Receiver连接到RILD的服务套接口,接收读取RILD传递过来的Response Parcel.Response分为两种类型,一种是URC,一种是命令应答。对于URC将会直接分发到通知注册表中的Handler。而命令应答则通过Receiver的异步通知机制传递到命令的发送者进行相应处理。
  (3)Sender
                    

147.jpg (29.17 KB, 下载次数: 0)

下载附件  保存到相册

2012-3-21 10:52 上传

 

  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对象。
                  

258jpg.gif (53.77 KB, 下载次数: 0)

下载附件  保存到相册

2012-3-21 10:53 上传

 

  (4.1)RIL命令的发送模式
  协议的真正实现是在rild中,RIL-JAVA更多的是一个抽象和代理,我们在研究源代码的过程中就会体会到到RIL-JAVA中的命令函数都有一个共同的框架。
  SendXxxCmd(传入参数Data,传出参数result){
  组合RILRequest(请求号,result,mSerail)
  Data->RR
  send(RILRequest): Message
  }
  1)RILRequest
                 

ff.jpg (1.58 KB, 下载次数: 0)

下载附件  保存到相册

2012-3-21 10:55 上传

 

  请求号:
  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:
  [url=mailto:EVENT_END@handleMessage@RILSender@RIL.java]
EVENT_END@handleMessage@RILSender@RIL.java[/url]
                            

321.jpg (1.78 KB, 下载次数: 0)

下载附件  保存到相册

2012-3-21 10:54 上传

 

vv.jpg (1.17 KB, 下载次数: 0)

下载附件  保存到相册

2012-3-21 10:58 上传

 

  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,根据类型不同进行处理。
                       

gg.jpg (5.04 KB, 下载次数: 0)

下载附件  保存到相册

2012-3-21 10:59 上传

 

  第二步:根据数据中的Token(mSerail),反查mRequest,找到对应的请求信息。
  第三步:将是数据转换成结果数据。
  第四步:将结果放在RequestMessage中发回到请求的发起者。
                         

rr.jpg (110.71 KB, 下载次数: 0)

下载附件  保存到相册

2012-3-21 11:00 上传

 

ee.jpg (33.55 KB, 下载次数: 0)

下载附件  保存到相册

2012-3-21 11:00 上传

 

Android核心分析之十八Android电话系统之RIL-Java的更多相关文章

  1. Android核心分析之十六Android电话系统-概述篇

    Android电话系统之概述篇 首先抛开Android的一切概念来研究一下电话系统的最基本的描述.我们的手机首先用来打电话的,随后是需要一个电话本,随后是PIM,随后是网络应用,随后是云计算,随后是想 ...

  2. Android核心分析之十五Android输入系统之输入路径详解

       Android用户事件输入路径 1 输入路径的一般原理 按键,鼠标消息从收集到最终将发送到焦点窗口,要经历怎样的路径,是Android GWES设计方案中需要详细考虑的问题.按键,鼠标等用户消息 ...

  3. Android核心分析之十四Android GWES之输入系统

          Android输入系统 依照惯例,在研究Android输入系统之前给出输入系统的本质描述:从哲学的观点来看,输入系统就是解决从哪里来又将到哪里去问题.输入的本质上的工作就是收集用户输入信息 ...

  4. Android 核心分析之十二Android GEWS窗口管理之基本架构原理

    Android GWES之窗口管理之基本构架原理 Android的窗口管理是C/S模式的.Android中的Window是表示Top Level等顶级窗口的概念.DecorView是Window的To ...

  5. Android核心分析之二十一Android应用框架之AndroidApplication

    Android Application Android提供给开发程序员的概念空间中Application只是一个松散的表征概念,没有多少实质上的表征.在Android实际空间中看不到实际意义上的应用程 ...

  6. Android核心分析之十九电话系统之GSMCallTacker

    GSMCallTracker在本质上是一个Handler.<IGNORE_JS_OP> 1.jpg (1.52 KB, 下载次数: 1) 下载附件  保存到相册 2012-3-22 11: ...

  7. Android核心分析 之十Android GWES之基本原理篇

    Android GWES基本框架篇 我这里的GWES这个术语实际上从Microsoft 的Window上移植过来的,用GWES来表示Android的窗口事件系统不是那么准确,在Android中Wind ...

  8. Android核心分析之二十七Android GDI 之SurfaceFlinger之动态结构示

           SurfaceFlinger对象建立过程示意 1 SurfaceSession的建立 客户端请求建立Surface时,首先在要与SurfaceFlinger建立一个Session,然后再 ...

  9. Android基础笔记(十八)- Fragment

    博客的感悟终点-開始 什么是Fragment 加入fragment到Activity的两种方式 Fragment的生命周期 Fragment的向下兼容 Fragment之间的通信 博客的感悟,终点-開 ...

随机推荐

  1. [转]windows 软链接的建立及删除

    [转]windows 软链接的建立及删除 http://blog.chinaunix.net/uid-74941-id-3764093.html 1.建立举例 ##建立d:develop链接目录,指向 ...

  2. 基于PBOC电子钱包的消费过程详解

    智能卡金融行业应用电子钱包的消费交易流程,开发人员可参考 首先终端和卡片有一个共同的密钥叫做消费密钥:PurchKey (针对每种特定的交易,比如,圈存,消费,都有特定的密钥与之对应) 假设Purch ...

  3. liferay7中如何Hiding the default Success Message

    下面介绍如何把在Liferay 7中如何把action执行成功之后的信息不显示,因为宝宝有需要,就去查了相关源码和资料. 如果想要某个portlet不显示执行成功的信息,在doProcessActio ...

  4. 使用log4javascript记录日志

    1.定义log4js服务类,用于初始化log4javascript相关参数 log4jsService.js //启用javascript 日志功能 var logger = log4javascri ...

  5. 【BZOJ】【1878】【SDOI2009】HH的项链

    树状数组/前缀和 Orz lct1999 好神的做法... 先看下暴力的做法:对于区间[l,r],我们依次扫过去,如果这个数是第一次出现,那么我们种类数+1. 我们发现:区间中相同的几个数,只有最左边 ...

  6. HDU1056 HangOver

    HangOver Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   Descript ...

  7. DSP中的cmd文件

    一.CMD文件 链接命令文件(Link Command Files),以后缀.cmd结尾,简称CMD文件. CMD文件的两大功能是指示存储空间和分配段到存储空间. 在编写CMD文件时,主要采用MEMO ...

  8. 已有a,b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列

    1.我的思路先将b链表连接在a链表的后面,这个很容易实现,将a链表最后的结点中的p.next改为指向b链表的头结点即可. 再将这个新链表用选择排序即可. 代码如下: #include<stdio ...

  9. JS中的间歇(周期)调用setInterval()与超时(延迟)调用setTimeout()相关总结

    超时调用需要使用window.setTimeout(code,millisec)方法 它接受两个参数:要执行的代码和以毫秒表示的时间(即在执行代码前需要等待多少毫秒).其中第一个参数可以是一个包含JS ...

  10. 如何在帝国cms后台菜单栏中添加删除链接?

    下午测试一个网上下载经过二次开发的帝国cms系统,还原完数据进入后台ytkah发现菜单栏多出了几个链接,有点不习惯,就想着怎么把它去掉.由于自己用的win7系统,搜索时没有像xp那样可以搜索包含某字符 ...