RILD - 第七章 - RILProxy

本文详细介绍了RILProxy在MTK平台的作用,包括RilProxy层的处理流程,如何通过Rfx模块将请求分发到不同socket,以及socket_fds的初始化过程,揭示了RilProxy作为RILC与RILJ之间中介的角色及其灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

七、RilProxy

对于MTK平台,在RILC与RILJ之间,有一个RilProxy层。

之所以要使用proxy,一个好处是在上层,不仅仅是RILJ与RILC通过Socket连接,还有其他地方也可以与RILC连接,来向下才层Modem通信,比如如可以通过终端ATCI接口直接向Modem发送命令。

另一个好处是proxy层的下层,可以自由选择切换其所对接的RILC层,因为对于不同的项目,所需要适配的RILC层不同,比如可以从默认切换到C2K RIL。

当然,proxy层的作用不仅仅连接上层和下层的中介,而且也可以在其中进行一些消息的过滤操作,如当Radio unavailable 时,就可以过滤一些需要Radio工作的request。

关于RilProxy的结构,其实和RILC差不多,也是分为LibRIL层和MtkRIL层。可以说在LibRIL层,他们是完全相似的,只是RilProxy在这里直接监听了RILJ的Socket接口。那么关于RilProxy从Socket句柄监听,建立流套接字,处理流套接字的流程就不在此说明,详细流程可以参考第二章。

7.1 RilProxy层处理流程

与之前说的RILC不同的是,在RILProxy中,从LibRIL调用MtkRIL回调函数onRequest这一步开始,它的流程就开始了不同。因此,我们就从这个地方着手来分析其流程。
先来一张总体的流程图:
这里写图片描述

首先来回顾一下RILC的onRequest函数,它通过不同的request码来判断,最后使用不同函数来预处理请求,最终将请求解释成AT命令并发送到AT通道。

如下代码,来看RilProxy层的onRequest函数:
1. 首先在ril_callbacks中直接将request发到了Rfx中,Rfx是处理不同的request,并将其发送到不同socket的模块,其代码主要在/ril/rilproxy/mtk-rilproxy/framework/core/目录中。
2. Rfx中有一个是属于dispatch thread的dispatch queue。Rfx先将request封装成Message对象并放入dispatch queue中,在dispatch thread会有一个looper读取dispatch queue的Message,并将其分发到main thread,让main thread的Looper去处理。

//ril_callbacks.c
static void
onRequest (int request, void *data, size_t datalen, RIL_Token t){
    //Radio不可用,过滤request
    if (radioState == RADIO_STATE_UNAVAILABLE &&
        request != RIL_REQUEST_OEM_HOOK_RAW && //This is for ATCI
        ...){

    }
    //添加到请求队列
    rfx_enqueue_request_message(request, data, datalen, t, socket_id);
}

//Rfx.cpp
void rfx_enqueue_request_message(int request, void *data, size_t datalen, RIL_Token t,
        RIL_SOCKET_ID socket_id) {
    //添加到请求队列
    dispatchThread->enqueueRequestMessage(request, data, datalen, t, socket_id);
}

//RfxDispatchThread.cpp
void RfxDispatchThread::enqueueRequestMessage(int request, void *data, size_t datalen,
        RIL_Token t, RIL_SOCKET_ID socket_id) {
    RequestInfo *requestInfo = (RequestInfo *)t;

    ...
    //使用请求数据购进R分析Message对象
    sp<RfxMessage> msg = RfxMessage::obtainRequest(socket_id, dest, request, requestInfo->token,
            parcel, t);
    //构建MessageObj
    MessageObj *obj = createMessageObj(msg);
    //将消息添加到了dispatchRequestQueue中
    dispatchRequestQueue.enqueue(obj);
}
// RfxDispatchThread.cpp
extern "C"
void *rfx_process_request_messages_loop(void *arg) {
    while (1) {
        RfxDispatchThread *dispatchThread = (RfxDispatchThread *) arg;
        dispatchThread->processRequestMessageLooper();
    }
    return NULL;
}
//RfxDispatchThread.cpp
void RfxDispatch
参考资源链接:[Android RIL通信机制及短信电话实现学习文档](https://wenku.youkuaiyun.com/doc/47rsyfva8e?utm_source=wenku_answer2doc_content) 在Android系统中,RIL层是连接应用层和硬件通信模块的关键桥梁,它负责管理短信的发送和接收。要实现发送短信的基本流程,开发者首先需要理解RIL层的工作原理,特别是rild-daemon服务进程如何处理短信发送请求。 当应用层需要发送短信时,会调用Android提供的API,如SmsManager类,将短信内容和目的地地址发送给系统。这个请求随后被传递给RIL层,由rild-daemon进程接收。rild-daemon负责将应用层的请求转换为AT命令格式,这些AT命令是与移动网络模块通信的标准语言。 具体到AT命令的使用,rild-daemon会发送类似'AT+CMGS'这样的命令来启动短信发送流程,这个命令后跟手机号码、短信内容等参数。基带处理器接收到这些命令后,会执行相应的操作,将短信发送到目的地。一旦短信发送完毕,基带处理器会返回一个确认信号,例如通过'OK'或者'ERROR'等响应,告知rild-daemon操作结果。 rild-daemon接收到这些响应后,会将结果转换为Android系统可以理解的格式,并通过Binder通信机制通知给原始发起请求的应用程序。这样,应用程序就可以了解短信是否成功发送,并根据需要进行后续操作。 了解这一流程对于开发者来说至关重要,特别是当需要在定制ROM中修改RIL层的行为以支持特定的硬件时。在《Android RIL通信机制及短信电话实现学习文档》中,你可以找到更多关于RIL层架构、AT命令格式、以及如何使用rild-daemon交互的具体细节,帮助你更深入地理解并开发Android系统的通信功能。 参考资源链接:[Android RIL通信机制及短信电话实现学习文档](https://wenku.youkuaiyun.com/doc/47rsyfva8e?utm_source=wenku_answer2doc_content)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值