Android GSM驱动模块(rild)详细分析(三)response流程_android rild csq:-程序员宅基地

技术标签: timer  android  sms  callback  socket  command  Android  

Android GSM驱动模块(rild)详细分析(三)response流程
熊猫哥哥 发表于IT168和Opendroid 转载请注明

前文对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的文章也到此结束。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wyl123/article/details/4100743

智能推荐

MACOM面向CWDM4推出L-PIC技术方案,助力云数据中心和5G光学连接发展_macom技术方案-程序员宅基地

文章浏览阅读316次。MACOM近期宣布推出 MAOT-025402 CWDM4发射器光学组件,这款组件是MACOM面向100Gbps CWDM4的L-PIC(集成有激光器的硅光子集成电路)解决方案的一部分,凭借获得专利的L-PIC,MAOT-025402可与MASC-37053A CDR配合使用,共同构成QSFP28 CWDM4解决方案的完整高速传输路径,从而实现助力和推动云数据中心及5G光学连接的发展。随着数据流..._macom技术方案

看解放军练车,想想自己的技术也该提高下了。-程序员宅基地

文章浏览阅读1.9k次。视频: : 驾校都弱暴了 看看解放军是怎么练车的 http://v.youku.com/v_show/id_XNTYxMzYxNTMy.html 同时找到一个很好听的歌曲: http://music.baidu.com/search?key=%E6%9C%80%E5%90%8E%E4%B8%80%E6%AC%A1%E9%80%89%E6%8B%A9%E6%AD%8C%E8%AF%8D想

Debezium系列之第100篇文章:阶段性详细总结对Debezium使用方式的优化,详细介绍对Debezium集群和Kafka集群做的一系列优化_debezium oracle kafka配置优化-程序员宅基地

文章浏览阅读681次。Debezium系列之第100篇文章:阶段性详细总结对Debezium使用方式的优化,同时优化Kafka集群和Debezium集群_debezium oracle kafka配置优化

旷视产品营销总监吕盟:构建AIoT时代的城市智慧|量子位沙龙回顾-程序员宅基地

文章浏览阅读465次。4月10日,量子位与中关村壹号联合主办的AI+线下沙龙—智慧城市的发展趋势与挑战在中关村壹号举办。旷视产品营销总监吕盟、明略科技COO兼数字城市发展部总经理唐日新、思必驰..._产品营销总监

Java并发编程 - 第三章 Java内存模型_数据依赖分为-程序员宅基地

文章浏览阅读1.3w次。前言:Java 线程之间的通信对程序员完全透明,内存可见性问题很容易困扰 Java 程序员,本章将揭开 Java 内存模型神秘的面纱。一、Java 内存模型的基础1.1 并发编程模型的两个关键问题在并发编程中,需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。在共享内存的并发模型里,线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信。在消息_数据依赖分为

sync___fast_iob-程序员宅基地

文章浏览阅读4.6k次。1. linux下sync命令在busybox-1.14.3中sync命令相关代码非常简单,int sync_main(int argc, char **argv UNUSED_PARAM){ /* coreutils-6.9 compat */ bb_warn_ignoring_args(argc - 1);___fast_iob

随便推点

Heroes in my heart_heros in my hearts-程序员宅基地

文章浏览阅读1.1k次。http://www.niwosou.com:8080/luceneweb/index.htmlThere are heroes who have influence in my life.I should write them down.(PS: This title has been chosen by a guy who wrote down scientists in his heart._heros in my hearts

7 centos 配置sudo权限_Linux(CentOS7)赋予普通用户执行root命令权限(sudo)-程序员宅基地

文章浏览阅读1.1k次。在Linux当中有一些命令只有root账户才能使用,怎么样才能使普通的用户可以执行root权限的命令呢,就是要使用一个名字叫做sudo的命令,下面是对sudo命令的一些介绍sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等。这样不仅减少了root用户的登录 和管理时间,同样也提高了安全性。sudo不是对shell..._centos sudo 才能执行

前端如何拥有自己的服务器-程序员宅基地

文章浏览阅读7.3k次,点赞9次,收藏25次。本文来自作者 郭方超 在 GitChat 上分享 「前端如何拥有自己的服务器」,「阅读原文」查看交流实录。「文末高能」编辑 | 哈比前言前端开发者需要一直关注浏览器的行为和表现。时间长了免不了要接触到后端的知识、服务器的知识。尤其是在前端技术爆发式发展的当下,前端慢慢的渗透到了更多的领域。比如,使用 express/koa 创建 http 服务,使用 React-Native 开发 Android_前端怎么把项目放到自己的服务器上

qt5.8+vs2015使用Qt5WebEngine搭建环境_qt qt5webengine.lib-程序员宅基地

文章浏览阅读4.1k次。1.项目属性,C/C++,所有选项,附加包含目录新增、$(QTDIR)\include\QtWebEngineWidgets2.项目属性,连接器,输入,新增Qt5WebEngine.libQt5WebEngineWidgets.libQt5WebChannel.lib_qt qt5webengine.lib

测度论与概率论笔记5:测度空间上的积分(下)_lebesgue-stieltjes积分-程序员宅基地

文章浏览阅读1.7k次。内容摘要:1. Lebesgue积分和Lebesgue-Stietjes积分 2. 随机变量期望的严格定义与计算_lebesgue-stieltjes积分

CodeForces入门-程序员宅基地

文章浏览阅读5.1k次,点赞2次,收藏17次。codeforces的正确打开方式https://www.cnblogs.com/muzu/p/7616746.html1.背景可能很多人都久闻codeforces网站的大名,却苦于各种各样的区域性问题或玄学问题,没能真正地体验到cf所带来的极致魅力而网络上关于这方面的博文太少了(至少我没找到过),于是就写了这样的一篇博文2.关于codeforces...

推荐文章

热门文章

相关标签