• 第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命令的执行。
  • 相关阅读:
    git之clone
    gulp之sass 监听文件,自动编译
    cat命令
    centos安装yum源
    centos下wget: command not found的解决方法
    centos安装
    为什么很多公司招聘前端开发要求有 Linux / Unix 下的开发经验?
    ASP.NET MVC HtmlHelper用法集锦
    Html.Listbox的用法(实例)
    JSON入门实例
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12327478.html
Copyright © 2020-2023  润新知