`
lenovo123
  • 浏览: 11373 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

转:Android电话系统之-rild

阅读更多

转自:http://blog.csdn.net/maxleng/archive/2010/05/10/5576637.aspx


Rild是Init进程启动的一个本地服务,这个本地服务并没有使用Binder之类的通讯手段,而是采用了socket通讯这种方式。RIL(Radio Interface Layer)

Android 给出了一个ril实现框架。由于Android开发者使用的Modem是不一样的,各种指令格式,初始化序列都可能不一样,GSM和CDMA就差别更大 了,所以为了消除这些差别,Android设计者将ril做了一个抽象,使用一个虚拟电话的概念。这个虚拟电话对象就是 GSMPhone(CDMAPhone),Phon对象所提供的功能协议,以及要求下层的支撑环境都有一个统一的描述,这个底层描述的实现就是靠RIL来 完成适配。

Andoid将RIL层分为两个代码空间:RILD管理 框架,AT相关的xxxril.so动态链接库。将RIL独立成一个动态链接库的好处就是Android系统适应不同的Modem,不同的Mode可以有 一个独立的Ril与之对应。从这个层面上看,Rild更多是一个管理框架。

image

    而ril是具体的AT指令合成者和应答解析者。从最基本的功能来讲,ril建立了一个侦听Socket,等待客户端的连接,然后从该连接上读取RIL- Java成传递来的命令并转化成AT指令发送到Modem。并等待Modem的回应,然后将结果通过套接口传回到Ril-Java层。下图是Ril-D的 基本框架:

image

下面的数据流传递描述图表描述了RIL-JAVA层发出一个电话指令的5 步曲。

image

 

在 AT通讯的过程中有两类响应:一种是请求后给出应答,一种是通知类,即为不请自来的,例如短信通知达到,我们称该类通知为URC。在Rild中URC和一 般的Response是分开处理的,概念上URC由handleUnsolicited@Atchannel.c处理,而Response由 handleFinalResponse来处理。

1 Event Loop

Rild 管理的真正精髓在ril.cpp,ril_event.cpp中,在研究的过程中,可以看到设计者在抽象上所下的功夫,设计得很优美。Event Loop的基本工作就是等待在事件端口(串口,Socket),一旦有数据到达就根据登记的Event回调函数进行处理。现在来看Ril设计者是如何建立 一套管理框架来完成这些工作的?

1.1 Event对象

Event对象构成:(fd,index,persist,func,param)

fd 事件相关设备句柄。例如对于串口数据事件,fd就是相关串口的设备句柄
index  
persist 如果是保持的,则不从watch_list中删除。
func 回调事件处理函数
param 回调时参数

    为了统一管理事件,Android使用了三个队列:watch_list,timer_list,pending_list,并使用了一个设备句柄池readFDS。

readFDS:是Linux的fd_set,readFDS保存了Rild中所有的设备文件句柄,以便利用select函数统一的完成事件的侦听。

watch_list:监测时间队列。需要检测的事件都放入到该队列中。

timer_list:timer队列

pending_list:待处理事件队列,事件已经触发,需要所回调处理的事件。

事件队列队列的操作:ril_event_add,ril_event_del, ril_timer_add

image

在添加操作中,有两个动作:

(1) 加入到watch_list

(2) 将句柄加入到readFDS事件句柄池。

1.2 ril_event_loop()

   我们知道对于Linux设备来讲,我们可以使用select函数等待在FDS上,只要FDS中记录的设备有数据到来,select就会设置相应的标志位并 返回。readFDS记录了所有的事件相关设备句柄。readFDS中句柄是在在AddEvent加入的。所有的事件侦听都是建立在linux的 select readFDS基础上。 image

ril_event_loop 利用select等待在readFDS(fd_set)上,当select设备有数据时,ril_event_loop会从select返回,在 watch_list中相应的Event放置到pend_list,如果Event是持久性的则不从watch_list中删除。然后 ril_event_loop遍历pengding_list处理Event事件,发起事件回调函数。

1.3 几个重要的Event

上面分析了ril-d的框架,在该框架上跑的事件有什么

(1)s_listen_event- (s_fdListen,listenCallback)

listenCallback处理函数,

接收客户端连接:s_fdCommand=accepte(..)

添加s_commands_event()

重新建立s_listen_event,等待下一次连接

(2) s_command_event(s_fdCommand,ProcessCommandsCallback)

从fdCommand  Socket连接中读取StreamRecord

使用ProcessCommandBufer处理数据

s_listen_event在大的功能上处理客户端连接(Ril-JAVA层发起的connect),并建立s_commands_event去处理Socket连接发来的Ril命令。ProcessCommandBufer实际上包含了Ril指令的下行过程。

1.4 下行命令翻译及其组织@ProcessCommandBuffer

RIL_JAVA传递的命令格式:Parcel , 由命令号,令牌,内容组成。RIL_JAVA到达RIL_C时转为构建本地RequestInfo,并将被翻译成具体的AT指令。由于每条AT命令的参数 是不同的,所以对不同的AT指令,有不同的转换函数,在此Android设计在这里做了一个抽象,做了一个分发框架,通过命令号,利用sCommand数 组,获得该命令的处理函数。

sComand[]={

<...>

}

sComand 存在于Ril_command.h中。

&sComand[]=

<

  {RIL_REQUEST_GET_IMEI, dispatchVoid, responseString},

  {RIL_REQUEST_DIAL, dispatchDial, responseVoid},

{….}

>

dispatchXxx函数一般都放在在Reference-ril.c中,Reference-ril.c这个就是我们需要根据不同的Modem来修改的文件。

1.5 send_at_command框架

send_at_command是同步的,命令发送后,send_at_command将等待在s_commandcond,直到有sp_response->finalResponse。

2 read loop@Atchannel.c

Read loop是解决的问题是:解析从Modem发过来的回应。如果遇到URC则通过handleUnsolicited上报的RIL_JAVA。如果是命令的应答,则通过handleFinalResponse通知send_at_command有应答结果。  

 

image

对于URC,Rild同样使用一个抽象数组@Ril.CPP.

static UnsolResponseInfo s_unsolResponses[] = {

#include "ril_unsol_commands.h"

};

并利用RIL_onUnsolicitedResponse将URC向上层发送。

3 Ril-d的整体数据流及其控制流示意图

image


分享到:
评论

相关推荐

    Android核心分析(17) ------电话系统之rilD.doc

    Android电话系统中的RIL(Radio Interface Layer)是连接操作系统和无线调制解调器(Modem)的关键组件,它负责处理与无线通信相关的各种任务,如拨打电话、发送短信、管理网络连接等。Rild是RIL的守护进程(daemon...

    Android核心分析-050417421

    6.电话系统:Android电话系统概述篇、rilD、RIL-Java、GSMCallTacker。 7.应用程序框架:Android应用程序框架之无边界设计意图、Android应用框架之AndroidApplication、Android应用框架之Activity。 8.GDI机制:...

    [经典文档]Android核心分析

    核心分析之十七 ----- Android 电话系统-RILD 核心分析之十八 ----- Android 电话系统之RIL-JAVA 核心分析之十九 ----- 电话系统之GSMCall Tracker 核心分析之二十 ----- Android 应用程序框架之无边界设计意图 ...

    Android电话系统

    Android电话系统作为移动通信设备的核心功能之一,其设计和实现必须满足用户最基本的通信需求。在深入探讨Android电话系统的内部架构之前,我们首先需要理解电话系统的基本组成部分和工作原理。 1. **电话基本功能*...

    ANDROID rild详细介绍

    RIL 是 Android 系统中的一个关键组件,它作为应用程序层与底层硬件之间的桥梁,负责处理所有与移动网络相关的任务,如拨打电话、发送短信等。在 Android 系统中,RIL 是通过一系列接口来定义的,这些接口允许操作...

    Android系统-源码阅读-系统启动流程笔记

    在深入探讨Android系统的启动流程之前,我们先了解一下整个过程的核心组成部分。Android系统启动涉及多个关键进程,包括Init进程、Zygote、SystemServer等。这些进程的启动与交互构成了Android设备从按下电源键到...

    android电话系统数据流程分析

    ### Android电话系统数据流程分析 #### 一、电话系统基本功能与管理机制 在深入了解Android电话系统的内部工作原理之前,我们需要先明确一个电话系统的基本功能。根据提供的描述,电话系统的核心功能可以归纳为: ...

    android P_MTK RILD.docx

    ace Layer Daemon,简称RILD,是Android系统中的一个重要组件,主要负责在Java层的RILJ(Radio Interface Layer Java)和硬件层的基带处理器(Modem)之间进行通信。RILD位于Android的硬件抽象层(HAL),为上层应用...

    Android RIL框架详细介绍

    Android RIL框架是实现移动通信功能的核心组件之一。它不仅提供了从应用到基带处理器之间的通信路径,而且还确保了这一过程的高效性和稳定性。通过深入理解RIL的工作机制,开发者可以更好地优化应用程序性能,提升...

    Android主要机制深入分析

    - Android电话系统涉及rilD、RIL-Java等关键组件。 - 电话系统的设计和实现对于开发具有电话功能的应用尤为重要。 通过上述分析,可以看出Android系统不仅仅是一个简单的操作系统,它是一个集成了丰富的软硬件...

    Android核心分析

    六、Android电话系统分析 1. 电话系统概述:电话系统的基本组成和交互机制。 2. rilD和RIL-Java:无线通信模块的设计和Java接口的分析。 3. GSMCallTacker:GSM呼叫追踪器的分析。 通过以上知识点,我们可以看到...

    将Android平台的RIL层移植到基于LINUX的通用平台的研究与实现.pdf

    因此,移植Android RIL为Linux通用平台创建一个独立的RIL层,可以方便地支持各种电话应用的开发,提高系统的稳定性和兼容性。 2. Android系统中RIL层分析 RIL在Android系统中位于硬件抽象层,通过Socket与框架层...

    Android-RIL结构分析与移植.docx编程资料

    ### Android-RIL结构分析与移植...通过以上分析可以看出,Android RIL不仅是Android系统中的核心组件之一,也是实现移动设备通信功能的关键技术。理解和掌握RIL的工作原理及其实现细节对于移动设备开发者来说至关重要。

    Android核心分析(19)----电话系统之GSMCallTacker.doc

    在Android电话系统中,GSMCallTracker扮演着至关重要的角色,它是电话管理层的核心组件,主要负责管理和跟踪GSM网络下的通话连接。GSMCallTracker基于Handler机制,它维护了一个名为connections的列表,用来记录和...

    android 核心分析

    Android 核心分析(17) ------电话系统之 rilD............................................................ 69 Android 核心分析(18)-----Android 电话系统之 RIL-Java........................................ ...

    android系统原理及开发要点详解

     1.1.2 移动电话系统开发模式 2  1.1.3 未来移动电话的功能及Android的优势 4  1.2 Android的开发工作 6  1.2.1 Android移植开发 6  1.2.2 Android应用开发 8  1.2.3 Android系统开发 9  1.3 Android的SDK与...

    Android的电话部分

    #### 一、Android电话部分的综述 Android作为现代智能手机操作系统的重要组成部分,其电话部分的设计尤为关键。这部分不仅涉及到基本的通话功能,还包括短信(SMS)、数据连接(Data Connection)以及SIM卡管理等功能。...

    Android 提高篇 机制 分析

    #### 十八、Android电话系统之RIL-Java 分析了Java层中的RIL实现,包括其与C/C++层的交互。 #### 十九、电话系统之GSMCallTacker 详细研究了GSM呼叫跟踪器的工作原理及其与电话系统其他部分的交互。 #### 二十、...

    Android核心设计思想分析

    Android核心分析(18)-----Android电话系统之RIL-Java........................................76 Android核心分析(19)----电话系统之GSMCallTacker.............................................84 Android...

    Android RIL GSM底层驱动 实现打电话发短信功能详解

    4. 业务处理:当用户发起打电话或发送短信的操作时,Android系统的电话应用会通过RIL API请求RILD执行相应动作。RILD调用GSM驱动执行AT命令,完成业务功能。 四、打电话与发短信流程 打电话: 1. 用户触发拨号操作...

Global site tag (gtag.js) - Google Analytics