前文对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的文章也到此结束。
分享到:
相关推荐
**前端开源库-cfn-response详解** 在现代云计算环境中,AWS CloudFormation是一种强大的基础设施即代码(IaC)服务,允许开发者和系统管理员通过JSON或YAML模板定义、部署和管理跨多个AWS服务的资源。在某些场景下...
`android-async-http-1.4.9` 是一个专为Android设计的异步HTTP库,它简化了网络请求的处理流程,使开发者能够更高效地进行网络通信。这个库由Leonard Brünings创建,并且在早期的Android开发中广泛使用。 ### 异步...
2015年AP微积分BCfree-response-questions[归纳].pdf
总结,lws-mock-response 是一个强大的前端开发工具,它简化了本地开发和测试流程,特别是在没有后端服务或者后端服务未完成的情况下。通过模拟HTTP响应,开发者可以专注于前端逻辑的实现和验证,提升开发效率。了解...
wso2dynamic-response-1.5.mar
android-quick-response-code Android QR Code解码器和编码器 介绍 这是ZXing(2.1版)项目的端口,但尺寸和范围减小了。 可以将其用作任何Android项目中的直接调用,而无需使用ZXing Intents机制。 该项目旨在使...
这就是`Koa-Mock-Response`这个开源库的作用,它允许前端开发者模拟响应,模拟RESTful API,甚至整个后端服务,从而加速开发流程并提高效率。 `Koa-Mock-Response`是基于Koa框架构建的,Koa是Node.js社区广泛使用的...
`laravel-xml-response`就是针对这种情况提供的一种解决方案,它扩展了Laravel的响应(Response)类,增加了方便的XML响应处理功能。本文将深入探讨这个主题,讲解如何在Laravel中创建和处理XML响应。 ### Laravel...
标题中的"PyPI 官网下载 | alb-response-0.1.2.tar.gz"表明这是一个在Python Package Index(PyPI)上发布的软件包,名为`alb-response`,其版本号为0.1.2,格式是tar.gz压缩文件。PyPI是Python开发者发布和分享自己...
SafetyNet Samples These samples demonstrate the end-to-end use of the SafetyNet API. SafetyNet provides ...server/java: Two samples, showing how to verify a SafetyNet API response on a server in Java
**PyPI 官网下载 | django-excel-response3-1.44.tar.gz** 这个压缩包文件`django-excel-response3-1.44.tar.gz`是Python开发中用于Django框架的一个扩展库,名为`django-excel-response3`。在Python的生态系统中,...
这意味着你可以针对每个项目的需求调整处理流程。 6. **API友好**:prepare-response库通常具有简洁易用的API接口,使得开发者可以快速上手并集成到现有的项目中。 7. **社区支持**:作为开源项目,prepare-...
总的来说,"lararavel-middleware-response-cache"是Laravel开发者提升网站性能的一个有力工具,通过合理利用它可以优化用户体验,降低服务器资源消耗。不过,使用时需根据实际情况权衡缓存带来的好处和可能的数据...
3. **计算NT-response**:将挑战值与NTLM Hash结合,通过另一哈希函数(如MD5)计算出NT-response。 4. **发送响应(Response)**:客户端将计算出的NT-response发送回服务器。 5. **服务器验证**:服务器使用相同的...
**Python库:Django-Excel-Response3** Django-Excel-Response3 是一个Python库,专门用于在Django框架中生成和返回Excel文件。这个库的版本是1.42,可以从Python Package Index(PyPI)官方网站下载,文件名为`...
在Laravel框架中,响应缓存(laravel-response-cache)是一个强大的工具,它能显著提升应用的性能。这个包主要用于缓存HTTP响应,减少服务器处理请求的时间,从而提高网站的加载速度。以下是对"laravel-response-...
Optional built-in response parsing into JSON (JsonHttpResponseHandler) Optional persistent cookie store, saves cookies into your app's SharedPreferences Examples For inspiration and testing on device...
**Python库 django-turbo-response-0.0.47** `django-turbo-response` 是一个基于Python的Web开发框架Django的扩展库,它致力于提升应用的响应速度和用户体验。这个库的版本为0.0.47,表明它可能处于早期开发阶段,...
在Android开发中,kSOAP2-android是开发者常用的工具,用于与服务器端的Web服务进行交互。标题中的"ksoap2-android-assembly-2.4-jar-with-dependencies"是一个包含所有依赖的jar包,它使得开发者无需额外处理依赖...
【PyPI 官网下载 | django-any-response-redirect-middleware-1.0.tar.gz】是一个在Python编程语言中使用的开源库,它可以从Python Package Index(PyPI)官方网站获取。PyPI是Python开发者发布自己编写的模块和软件...