`

Android GSM驱动模块(rild)详细分析(三)response流程

 
阅读更多
前文对request的分析, 终止在了at_send_command_full_nolock里的writeline操作,因为这里完成命令写出到硬件设备的操作,接下来就是等待硬件响应,也就是response的过程了。我们的分析也是从这里开始。
response信息的获取,是在第一篇初始化分析中,提到的readerLoop中。由readline函数以‘行’为单位接收上来。
AT的response有两种,一是主动上报的,比如网络状态,短信,来电等都不需要经过请求,有一unsolicited词语专门描述。另一种才是真正意义上的response,也就是命令的响应。
这里我们可以看到,所有的行,首先经过sms的自动上报筛选,因为短信的AT处理通常比较麻烦,无论收发都单独列出。这里是因为要即时处理这条短信消息(两行,标志+pdu),而不能拆开处理。处理函数为onUnsolicited(由s_unsolHandler指向),我们等下介绍。
除开sms的特例,所有的line都要经过processLine,我们来看看这个流程:
processLine
|----no cmd--->handleUnsolicited //主动上报
|----isFinalResponseSuccess--->handleFinalResponse //成功,标准响应
|----isFinalResponseError--->handleFinalResponse //失败,标准响应
|----get '>'--->send sms pdu //收到>符号,发送sms数据再继续等待响应
|----switch s_type--->具体响应  //命令有具体的响应信息需要对应分析

我们这里主要关注handleUnsolicited自动上报(会调用到前面smsUnsolicite也调用的onUnsolicite),以及switch s_type具体响应信息,另外具体响应需要handleFinalResponse这样的标准响应来最终完成。
1. onUnsolicite(主动上报响应)
static void onUnsolicited (const char *s, const char *sms_pdu);
短信的AT设计真是麻烦的主,以致这个函数的第二个参数完全就是为它准备的。
response的主要的解析过程,由at_tok.c中的函数完成,其实就是字符串按块解析,具体的解析方式由每条命令或上报信息自行决定。这里不再详述,onUnsolicited只解析出头部(一般是+XXXX的形式),然后按类型决定下一步操作,操作为RIL_onUnsolicitedResponse和RIL_requestTimedCallback两种。
a)RIL_onUnsolicitedResponse:
将unsolicited的信息直接返回给上层。通过Parcel传递,将RESPONSE_UNSOLICITED,unsolResponse(request号)写入Parcel先,然后通过s_unsolResponses数组,查找到对应的responseFunction完成进一步的的解析,存入Parcel中。最终通过sendResponse将其传递回原进程。流程:
sendResponse-->sendResponseRaw-->blockingWrite-->write to s_fdCommand(前面建立起来的和上层框架的socket连接)
这些步骤之后有一些唤醒系统等其他操作。不再详述。
b)RIL_requestTimedCallback:
通过event机制(参考文章二)实现的timer机制,回调对应的内部处理函数。通过internalRequestTimedCallback将回调添加到event循环,最终完成callback上挂的函数的回调。比如pollSIMState,onPDPContextListChanged等回调, 不用返回上层, 内部处理就可以。

2. switch s_type(命令的具体响应)及handleFinalResponse(标准响应)
命令的类型(s_type)在send command的时候设置(参考文章二),有NO_RESULT,NUMERIC,SINGLELINE,MULTILINE几种,供不同的AT使用。比如AT+CSQ是singleline, 返回at+csq=xx,xx,再加一行OK,比如一些设置命令,就是no_result, 只有一行OK或ERROR。
这几个类型的解析都很相仿,通过一定的判断(比较AT头标记等),如果是对应的响应,就通过addIntermediate挂到一个临时结果sp_response->p_intermediates队列里。如果不是对应响应,那它其实应该是穿插其中的自动上报,用onUnsolicite来处理。
具体响应,只起一个获取响应信息到临时结果,等待具体分析的作用。无论有无具体响应,最终都得以标准响应handleFinalResponse来完成,也就是接受到OK,ERROR等标准response来结束,这是大多数AT命令的规范。
handleFinalResponse会设置s_commandcond这一object,也就是at_send_command_full_nolock等待的对象。到这里,响应的完整信息已经完全获得,send command可以进一步处理返回的信息了(临时结果,以及标准返回的成功或失败,都在sp_response中)。
pp_outResponse参数将sp_response返回给调用at_send_command_full_nolock的函数。
继续我们在文章二的分析的话,这个函数其实是requestDial,不过requestDial忽略了响应,所以我们另外看个例子,如requestSignalStrength,命令其实就是前面提到的at+csq:
可以看到确实是通过at_send_command_singleline来进行的操作,response在p_response中。
p_response如果返回失败(也就是标准响应的ERROR等造成),则通过RIL_onRequestComplete发送返回数据给上层,结束命令。
如果成功,则进一步分析p_response->p_intermediates, 同样是通过at_tok.c里的函数进行分析。并同样将结果通过RIL_onRequestComplete返回。
RIL_onRequestComplete:
RIL_onRequestComplete和RIL_onUnsolicitedResponse很相仿,功能也一致。
通过Parcel来传递回上层,同样是先写入RESPONSE_SOLICITED(区别于RESPONSE_UNSOLICITED),pRI->token(上层传下的request号),错误码(send command的错误,不是AT响应)。如果有AT响应,通过访问pRI->pCI->responseFunction来完成具体response的解析,并写入Parcel。
然后通过同样的途径:
sendResponse-->sendResponseRaw-->blockingWrite-->write to s_fdCommand
完成最终的响应传递。

到这里,我们分析了自动上报与命令响应,其实response部分,也就告一段落了。
三篇分析RIL的文章也到此结束。
分享到:
评论

相关推荐

    Android_GSM驱动模块(rild)详细分析(全)

    ### Android GSM驱动模块(rild)详细分析 #### 1. 基本架构及初始化 Android的RIL(Radio Interface Layer)驱动模块是Android系统中非常重要的组成部分之一,主要用于处理移动设备与网络之间的通信功能。它位于...

    ANDROID rild详细介绍

    通过对文档摘要和描述的分析,我们可以了解到构建 RIL 库所需的基本步骤,以及如何在 Android 系统中正确使用这些库。这对于开发者来说是非常宝贵的资源,尤其是在开发针对特定硬件平台的应用程序时。

    Android的RIL驱动模块启动流程.txt

    本文将深入探讨Android RIL驱动模块的启动流程,通过分析其内部结构与工作原理,帮助读者更好地理解这一核心机制。 #### 二、RIL概述 RIL是Android系统中的一个关键组件,用于管理手机的无线电通信功能。它位于...

    Android的RIL驱动模块

    Android 的 RIL 驱动模块是 Android 系统中负责与 Modem 通信的关键组件,它位于 hardware/ril 目录下,主要由三部分组成:rild、libril.so 和 librefrence_ril.so。其中,rild 是 RIL 层的入口点,负责完成初始化和...

    RILD的启动流程图简介

    #### 三、详细流程分析 ##### 1. `init.rc`中的配置 - **启动命令**:在`init.rc`中,通过如下命令启动`rild`守护进程: ```bash service rild /system/bin/rild ``` 这条命令指定了RILD的路径及执行文件,...

    android O rild详解

    随着移动设备市场的迅速扩张和技术的不断进步,Google 在 Android O 版本中引入了一项重大的软件架构改进——Treble(三重奏)。这一举措旨在降低原始设计制造商 (ODM) 和原始设备制造商 (OEM) 更新设备系统的难度,...

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

    1. 初始化:Android系统启动时,RIL服务会加载GSM驱动,通过配置文件(如rild.rc)指定驱动路径。RILD会与GSM驱动建立连接,进行基本的握手和身份验证。 2. AT命令传输:RILD通过串行端口或Socket与GSM驱动通信,...

    Android的RIL驱动模块启动流程

    本文将深入探讨Android RIL驱动模块的启动流程及其内部结构,重点分析RIL启动过程中的关键步骤与机制。 #### RIL模块概述 RIL模块位于Android硬件抽象层(HAL)中,主要用于实现应用程序与底层硬件之间的接口。在...

    android P_MTK RILD.docx

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

    Android中获取GSM、CDMA、Wifi信号强度

    "Android中获取GSM、CDMA、Wifi信号强度" Android 中获取 GSM、CDMA、Wifi 信号强度是一个非常重要的功能,特别是在实现某些特定的应用场景时。例如,在某些地区,GSM 信号强度可能会很弱,而 CDMA 信号强度可能会...

    Android APN开发流程分析.doc

    Android APN 开发流程分析 ...Android APN 开发流程分析是 Android 操作系统中数据连接的实现过程,涉及到数据连接的建立、维护和管理,RILD 是 Android 操作系统中的一个守护进程,负责处理从上层来的命令请求。

    [Hasen图示系列]android中rild机制

    Rild:Radio Interface Layout Daemon , 用于智能手机的通信管理和控 制的后台进程,所有和手机通信相关的功 能,例如打电话、手法短信、 GPRS等都 需要Rild的参与。

    [经典文档]Android核心分析

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

    Android framework详细分析 PDF

    电话系统是Android中的另一个重要组件,它涉及到rilD(无线接口层驱动)、RIL-Java和GSM Call Tracker等多个部分。rilD是与硬件设备通信的底层驱动,负责处理呼叫、短信和数据通信等任务。RIL-Java作为Java层的接口...

    深入详解AndroidGSM驱动模块.pdf

    在深入详解Android GSM驱动模块的过程中,我们聚焦于GSM驱动的核心机制——事件处理和请求的传递。事件处理机制是驱动程序中一个至关重要的部分,它确保了系统能够及时响应网络和用户界面的各种交互。 首先,事件是...

    android核心分析pdf

    **Android核心分析(08):** 对Android系统的启动流程进行了详细的剖析,包括从Zygote进程的初始化到第一个应用的启动全过程。 #### 七、Zygote Service **Android核心分析(09):** Zygote Service是Android系统...

    Android中RIL层详细分析.pdf

    Android 的 RIL 模块位于 Android/hardware/ril 文件夹,包含三个子模块:rild、libril 和 reference-ril。其中,rild 是 RIL 的后台服务程序,libril 是 RIL 的库文件,而 reference-ril 是 RIL 的参考实现。 RIL ...

Global site tag (gtag.js) - Google Analytics