第12章 Reference-RIL运行框架
Reference-RIL完成两部分处理逻辑:
- 与LibRIL交互完成RIL消息的处理。
- 与Modem通信模块交互完成AT命令的执行。
Reference-RIL的运行机制
主要涉及以下几个方面:
- Reference-RIL的初始化函数RIL_Init。
- onRequest函数接收LibRIL的请求调用。
- 接收Modem发出的UnSolicited Response消息的处理逻辑。
RIL_init函数初始化Reference-RIL
RIL_init函数完成的Reference-RIL初始化工作,包括三个操作:
- 记录libRIL提供的RIL_Env指针,通过它可以调用LibRIL提供的相应函数。
- 启动基于mainLoop函数的子线程,mainLoop线程主要负责监听和接收Modem主动上报的UnSolicited消息。
- 返回Reference-RIL提供的指针RIL_RadioFunctions的结构体的针对s_call_backs。
s_callbacks是静态变量,在首次访问reference-ril.cpp时,就会完成其初始化操作。其中包含五个指向函数的指针。
通过函数指针,可以在LibRIL中调用Reference-RIL中定义的函数。
例如:在LibRIL中处理,RILJ中发来的命令形成的ril_event时,会调用s_callbacks.onRequest方法实现与Modem的交互。
onRequest接收LibRIL的请求调用
LibRIL接收到RILJ发来的请求后,
通过s_callbacks.onRequest调用Reference-RIL中的函数,
通过与Modem的交互,处理RIL请求。主要执行两项处理:
- 将RIL请求转化成对应的AT命令,并向Modem发出AT命令。
- 调用LibRIL的RIL_onRequestComplete函数,完成RIL请求处理结果的返回。
在Reference-RIL的onRequest函数中,会根据RIL请求类型调用requestGetCurrentCalls、requestDial、requestHangup等不同函数,完成相应的处理逻辑。
这些函数都完成两件事:
- 向Modem发起执行AT命令的请求。
- 调用RIL_onRequestComplete函数,完成RIL请求的返回。
onRequest函数调用的requestXXX函数共有12个,这些函数中的处理逻辑与大概都是以下的步骤:
- 将请求转化为相关信息组合成的AT命令。
- 调用at_send_command函数,通过AT命令通道向Modem发送AT命令。
- 调用LibRIL提供的函数OnRequestComplete完成RIL请求返回处理结果的回调操作。
UnSolicited消息的处理逻辑
mainLoop函数
在RIL_Init函数中启动了以mainLoop函数为入口函数的子线程。
函数中完成两个关键动作:
- 与Modem建立基于串口的通信连接,同时获取连接的文件的描述符fd;
- 调用at_open函数开启AT命令通道。
at_open函数
at_open函数位于atchannel.c文件中,主要处理逻辑有两点:
- 保存与Modem建立连接的文件描述符fd,接收到Modem发出的AT命令后调用onUnsolicited函数。
- 启动以readerLoop函数为入口的子线程,readerLoop函数循环监听并接收Modem发出的AT命令。
readerLoop函数的处理逻辑可分为两大部分:
- 读取Modem发出的AT命令
- 根据AT命令进行处理。
AT命令的处理分为两个大的分支:
- 短信相关的AT命令的处理
- 普通AT命令的处理
onUnsolicited函数
调用LibRIL提供的RIL_onUnsolicitedResponse函数发出不同类型的UnSolicited Response消息通知。
RIL_onUnsolicitedResponse函数
关键点如下:
- 根据Unsolicited Response消息类型获取s_unsolResponsed数组中对应的UnsolResponseInfo结构体对象,其中包括此消息电源唤醒策略和Parcel数据处理函数。
- 应用UnsolResponseInfo中的电源管理唤醒策略,进行电源唤醒操作。
- 调用UnsolResponseInfo中的Parcel数据处理函数,完成Parcel数据的组织和设置。
- 调用sendRespons 大专栏 第12章 Reference-RIL运行框架e函数,通过Socket连接发送Parcel数据给RILJ。
AT命令
涉及到了如何扩展新 AT 命令,暂时忽略这部分。
Android RIL层运行框架和机制总结
关于RILJ、LibRIL和Reference-RIL的总结:
- RILJ以RIL.java为核心,负责接收Telephony Frameworks发起的Telephony相关查询或控制请求,转换成RIL请求发送给LibRIL进行处理,
同时,负责接收LibRIL发出的Solicited Response和UnSolicited Response消息,并将消息分发给Telephony Frameworks。 - LibRIL以ril.cpp, ril_event.cpp代码为核心,提供RILC整体运行环境。
负责接收RILJ发起的RIL请求,将RIL请求转换成对Reference-RIL的onRequest函数的调用,并将RIL请求结果反馈给RILJ。
同时,还负责接收Reference-RIL发起的Unsolicited相关消息的处理,最终将消息发送给RILJ。 - Reference-RIL以reference-ril.cpp为中心,主要负责与Modem进行AT命令交互;接收LibRIL通过onRequest函数调用,发送来的RIL请求。
根据请求类型,组合成相应的AT命令交给Modem执行。
Modem状态有变化时,也会发出AT命令,Reference-RIL会接收并做处理,将主动上报的AT命令转换成Unsolicted消息,发送给LibRIL。
RILJ、LibRIL、Reference-RIL、Modem之间交互的通道:
- RILJ <-> LibRIL : 名为rild的Socket连接
- LibRIL <-> Reference-RIL : 直接函数调用
- Reference-RIL <-> Modem : 串口
总结Solicited消息的处理流程
Solicited消息分为:Solicited Request和Solicited Response,成对出现。
相关要点有:
- RILJ接收到Telephony Framworks发出的请求后,会创建RILRequest对象并保存到mRequestList列表中,
然后通过Socket向LibRIL发起拨号、挂断电话、交换通话等Telephony控制或查询相关的RIL请求。 - LibRIL通过监听Socket端口并接收RILJ发出的RIL请求,
经过processCommandsCallback -> processCommandBuffer -> dispatchFunction函数调用,
最后调用Reference-RIL提供的onRequest函数。 - Reference-RIL中的onRequest函数根据RIL请求类型及相关参数,
组装AT命令,通过AT命令通道向Modem发起AT命令;
Modem解析并执行AT命令,在发起AT命令返回结果给Reference-RIL。 - Reference-RIL接收Modem返回的AT命令;
调用LibRIL提供的onRequestComplete函数,
将Modem返回的AT命令执行结果返回给LibRIL。 - LibRIL接收到Reference-RIL返回的AT命令执行结果后,通过Socket向RILJ反馈Solicited Response消息,即RIL请求的返回结果。
- RILJ由processSolicited方法处理接收到Solicited Response消息,
通过RIL请求编号,在mRequestsLlist列表中找到发出RIL请求时对应的RILRequest对象,
通过它的Message对象发出Handler消息发起回调,Telephony Frameworks全会接收到发起RIL请求的处理结果。
总结Unsolicited消息的处理流程
Unsolicited消息,仅有Response,没有Request。
处理流程中的关键点有:
- Android RIL在手机启动过程中,会启动和加载RIL的运行环境,Reference-RIL会启动子线程调用mainLoop函数监听与Modem间的AT命令通道。
- Modem接收到任何网络通信状态的变化,都会通过AT命令通道发送AT命令给Reference-RIL。
- Reference-RIL接收到Modem发送AT命令后,由onUnsolicited函数将AT命令转换成对应的UnSolicited response消息,
并调用LibRIL提供的onUnsolicitedResponse方法,向LibRIL发送UnSolicitedResponse消息。 - LibRIL在收到onUnsolicitedResponse函数调用后,通过Socket连接发送Unsolicited Response消息给RILJ。
- RILJ通过RILReceiver监听与LibRIL建立的rild端口的Socket连接,readRilMessage方法读取消息长度。
根据消息长度读取Socket数据,最后由processResponse方法根据RIL消息类型调用processUnsolicited方法,处理Unsolicited消息。
本章小结
- Reference-RIL的运行机制。
- Reference-RIL与LibRIL进行函数直接调用,完成Solicited和Unsolicited消息的处理。
- Reference-RIL与Modem基于串口的通信完成AT命令的执行。
第12章 Reference-RIL运行框架的更多相关文章
- JS读书心得:《JavaScript框架设计》——第12章 异步处理
一.何为异步 执行任务的过程可以被分为发起和执行两个部分. 同步执行模式:任务发起后必须等待直到任务执行完成并返回结果后,才会执行下一个任务. 异步执行模式:任务发起后不等待任务执行完成,而是马上 ...
- 【STM32H7教程】第12章 STM32H7的HAL库框架设计学习
完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第12章 STM32H7的HAL库框架设计学 ...
- 《Entity Framework 6 Recipes》翻译系列 (1) -----第一章 开始使用实体框架之历史和框架简述
微软的Entity Framework 受到越来越多人的关注和使用,Entity Framework7.0版本也即将发行.虽然已经开源,可遗憾的是,国内没有关于它的书籍,更不用说好书了,可能是因为EF ...
- Linux就这个范儿 第12章 一个网络一个世界
Linux就这个范儿 第12章 一个网络一个世界 与Linux有缘相识还得从一项开发任务说起.十八年前,我在Nucleus OS上开发无线网桥AP,需要加入STP生成树协议(SpanningTree ...
- Hadoop专业解决方案-第12章 为Hadoop应用构建企业级的安全解决方案
一.前言: 非常感谢Hadoop专业解决方案群:313702010,兄弟们的大力支持,在此说一声辛苦了,春节期间,项目进度有所延迟,不过元宵节以后大家已经步入正轨, 目前第12章 为Hadoop应用构 ...
- CSS3秘笈第三版涵盖HTML5学习笔记9~12章
第9章,装饰网站导航 限制访问,处于隐私方面考虑,浏览器已经开始限制可以对伪类:visited应用哪些CSS属性了.其中包括对已访问过的链接定义color.background-color.borde ...
- Android开发艺术探索》读书笔记 (12) 第12章 Bitmap的加载和Cache
第12章 Bitmap的加载和Cache 12.1 Bitmap的高速加载 (1)Bitmap是如何加载的?BitmapFactory类提供了四类方法:decodeFile.decodeResourc ...
- 第12章 代理模式(Proxy Pattern)
原文 第12章 代理模式(Proxy Pattern) 代理模式 概述: 在软件系统中,有些对象有时候由于跨越网络或者其他的障碍,而不能够或者不想直接访问另一个对象,如果直接访问会给系统带来不必要 ...
- 【RL-TCPnet网络教程】第12章 TCP传输控制协议基础知识
第12章 TCP传输控制协议基础知识 本章节为大家讲解TCP(Transmission Control Protocol,传输控制协议),通过本章节的学习,需要大家对TCP有个基本的认识,方 ...
随机推荐
- 一个简单WebApp的全程
开始前,我先给出上一篇选项卡的demo链接http://xqhuadou.com/demo1/index.html.相信看着应该很带感,不过这个是之前经过修改的. 制作过程我就不多说了,可以直接看源码 ...
- 洛谷 P1258 小车问题
题目传送门 解题思路: 首先,每个人都要做一次车,而且两个人要同时到达,这样才能使总时间最短. 那么,我们设起点为A,终点为B,小车先带甲开到C点后甲下车走到B点,同时小车掉头与已经走到D点的乙相向而 ...
- typescript-学习使用ts-3
函数 函数参数 参数及返回值类型 function add(x: number, y: number): number { return x + y } 可选参数 function add(x: nu ...
- 静态、动态cell区别
静态cell:cell数目固定不变,图片/文字固定不变(如qq设置列表可使用静态cell加载) 动态cell:cell数目较多,且图片/文字可能会发生变化(如应网络请求,淘宝列表中某个物品名称或者图片 ...
- [WC2015]未来程序(提交答案)
sub1:ans=a*b%c,龟速乘即可. #include <stdio.h> #include <stdlib.h> unsigned long long a, b, c, ...
- 用bosybox制作文件系统
在orangepi_sdk/source/busybox-1.25.0目录里有源码. ). 先清除编译出来的文件及配置文件 make distclean ). 配置busybox make menuc ...
- springboot 整合thymeleaf 书笔记
pom.xml依赖添加 <!--引入thymeleaf--> <dependency> <groupId>org.springframework.boot</ ...
- MRP自动运算设置
1.执行计划-删除老的调度计划: 2.运算日志-清除冲突: 3.MRP计划运算向导,清除预留: 4.创建MRP凌晨调度任务,名称自己修改: 5.创建完成: 6.设置消息通知:
- 吴裕雄--天生自然python机器学习:机器学习简介
除却一些无关紧要的情况,人们很难直接从原始数据本身获得所需信息.例如 ,对于垃圾邮 件的检测,侦测一个单词是否存在并没有太大的作用,然而当某几个特定单词同时出现时,再辅 以考察邮件长度及其他因素,人们 ...
- 主效应|处理误差 |组间误差|处理效应|随机误差|组内误差|误差|效应分析|方差齐性检验|SSE|SSA|SST|MSE|MSA|F检验|关系系数|完全随机化设计|区组设计|析因分析
8 什么是只考虑主效应的方差分析? 就是不考虑交互效应的方差分析,即认为因素之间是不相互影响的,就是无重复的方差分析. 什么是处理误差 (treatment error).组间误差(between ...