从《android电话系统rild-概述篇》可知,rild处理的数据流主要分为以下三类:
a、request:来自上层ril-java的请求,如dial,send message b、response:modem对request的响应; c、unsolicited response:modem主动发来的消息命令,如接收短信,接收电话
因此,rild的主要工作流程就是:
a、接收request命令,将其转化成AT命令,发给modem处理,并等待modem的response; b、读取modem对request的响应即response,解析之后,通过socket发给上层ril-java; c、读取modem发来的unsolicited response,解析之后,通过socket发给上层ril-java;
本文将详细分析rild接收和处理request命令的流程,顺序图如下所示:
一、开启ril_event_loop()循环,监听上层发来的request命令;
二、一旦有socket发来的消息,启动listenCallback()函数,准备读取ril-java发来的request
三、读完socket发来的数据后,调用processCommandBuffer()对命令进行解析和处理,最关键的调用:
status = p.readInt32(&request); static CommandInfo s_commands[]={ #include "ril_commands.h"}; pRI->pCI = &( commands[request]); pRI->pCI->dispatchFunction(p,pRI);
1、解析request命令,p是parcel数据结构,包含了从socket读来的一条request命令的所有数据,其中包含request command;
hardware\ril\include\ril.h 定义了所有的request command,一共123条,RIL_REQUEST_xxx,如下所示: #define RIL_REQUEST_DIAL 10
2、定义s_commands[]数组
hardware\ril\libril\ril_commands.h 按照request command的顺序,定义了所有request command对应的处理方法以及response的处理方法,如下图所示:
3、根据解析出来的request和定义好的s_commands[],找出request对应的function
如:{RIL_REQUEST_DIAL, dispatchDial, responseVoid},
4、调用其dispatch方法,对request进行处理,如:dispatchDial;
四、dispatchxx()方法调用reference-ril.c的onRequest()方法,
五、onRequest()根据request命令,调用其对应的requestxx()方法,将request命令转化成AT命令。
六、通过at_send_command()方法,将AT命令发送给modem;
七、调用pthread_cond_wait()方法,主线程进入等待response的状态。