Android电话系统rild-request analysis

从《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的状态。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值