明白了event队列的基本运行流程,我们可以来看看request是怎么传入和dispatch的了.

上层的部分,核心代码在 frameworks/base/telephony/java/com/android/internal/telephony/gsm/RIL.java, 这是android java框架处理radio(gsm)的核心组件.本文因为主要关注rild,也就是 驱动部分,所以这里只作简单介绍.

我们看一个具体的例子,RIL.java中的dial函数:

public void

dial (String address, int clirMode, Message result)

{

RILRequest rr = RILRequest.obtain(RIL_REQUEST_DIAL, result);

rr.mp.writeString(address);

rr.mp.writeInt(clirMode);

if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));

send(rr);

}

rr是以RIL_REQUEST_DIAL为request号而申请的一个RILRequest对象.这个request 号在java框架和rild库中共享(参考RILConstants.java中这些值的由来)。

RILRequest初始化的时候,会连接名为rild的socket(也就是rild中 s_listen_event绑定的socket),初始化数据传输的通道.

rr.mp是Parcel对象,Parcel是一套简单的序列化协议,用于将对象(或对象的成 员)序列化成字节流,以供传递参数之用.这里可以看到 String address和int clirMode都是将依次序列化的成员.在这之前,rr初始化的时候,request号跟 request的序列号(自动生成的递增数),已经成为头两个将被序列化的成员.这为 后面的request解析打下了基础。

接下来是send到handleMessage的流程,send将rr直接传递给另一个线程的 handleMessage,handleMessage执行data = rr.mp.marshall()执行序列化操作, 并 将data字节流写入到rild socket。

接下来回到我们的rild,select发现rild socket有了请求链接的信号,导致 s_listen_event被挂入pending_list,执行event->func,即

static void listenCallback (int fd, short flags, void *param);。

接下来,s_fdCommand = accept(s_fdListen, (sockaddr *) &peeraddr, &socklen),获取传入的socket描述符,也就是上层的java RIL传入的连接。

然后,通过record_stream_new建立起一个record_stream, 将其与s_fdCommand绑 定, 这里我们不关注record_stream 的具体流程, 我们来关注command event的回 调, processCommandsCallback函数, 从前面的event机制分析, 一旦s_fdCommand 上有数据, 此回调函数就会被调用. (略过onNewCommandConnect的分析)。

processCommandsCallback通过record_stream_get_next阻塞读取s_fdCommand上发 来的 数据, 直到收到一完整的request(request包的完整性由record_stream的机 制保证), 然后将其送达processCommandBuffer。

进入processCommandBuffer以后,我们就正式进入了命令的解析部分. 每个命令将 以RequestInfo的形式存在。

typedef struct RequestInfo {

int32_t token;//this is not RIL_TokenCommandInfo*pCI;

struct RequestInfo*p_next;charcancelled;charlocal;//responses to local commands do not go back to command process} RequestInfo;

这里的pRI就是一个RequestInfo结构指针, 从socket过来的数据流, 前面提到是 Parcel处理过的序列化字节流, 这里会通过反序列化的方法提取出来. 最前面的是 request号, 以及token域(request的递增序列号). 我们更关注这个request号, 前 面提到, 上层和rild之间, 这个号是统一的. 它的定义是一个包含ril_commands.h 的枚举, 在ril.cpp中

staticCommandInfo s_commands[]={

#include"ril_commands.h"};

pRI直接访问这个数组, 来获取自己的pCI.

这是一个CommandInfo结构:

typedef struct {intrequestNumber;void(*dispatchFunction) (Parcel&p, struct RequestInfo*pRI);int(*responseFunction) (Parcel&p,void*response, size_t responselen);

} CommandInfo;

基本解析到这里就完成了, 接下来, pRI被挂入pending的request队列, 执行具体 的pCI->dispatchFunction, 进行详细解析.

gsm模块 java 录音_深入详解Android GSM驱动模块相关推荐

  1. gsm模块 java 录音_转]GSM模块信号强度CSQ与RSSI的对应关系

    使用GSM或者3G模块时,都会接触到信号强度CSQ.通过指令AT+CSQ,模块返回当前的信号质量,例如: AT+CSQ +CSQ: 28,0 其中28就是信号强度CSQ,但它不是真实的CSQ,他应该叫 ...

  2. gsm模块 java 录音_Android GSM驱动模块详细分析

    Android的RIL驱动模块, 在hardware/ril目录下,一共分rild,libril.so以及librefrence_ril.so三个部分,另有一 radiooptions可供自动或手动调 ...

  3. 蒙哥马利java算法_算法详解 - 蒙哥马利算法的概念与原理

    算法的详解 扯了一大顿,终于引出了今天文章的主角,前面讲到的两个算法,第一个就是蒙哥马利乘模,第二个就是蒙哥马利约减.下面我们来讲这两个算法的详解. 正如前面提到的蒙哥马利算法的三个特性之一是,不是基 ...

  4. gsm模块 java 录音_Arduino从Quectel M95 GSM模块读取AT命令

    Objective :通过SoftwareSerial / Arduino将命令提交给Quectel M95(GSM2单击http://www.mikroe.com/click/gsm2/)并解析响应 ...

  5. java编译使用androidsdk,详解Android源码的编译

    本文将为大家介绍的是如何设置Android源码的编译环境,包括Linux下的配置.主要基于Android 1.0环境,希望对大家了解Android开发有所帮助. 本次编译过程主要参考官方文档(http ...

  6. 【java】JDK安全模块JCE核心Cipher使用详解

    1.概述 转载:JDK安全模块JCE核心Cipher使用详解 2.前提 javax.crypto.Cipher,翻译为密码,其实叫做密码器更加合适.Cipher是JCA(Java Cryptograp ...

  7. python six模块详解_对python中的six.moves模块的下载函数urlretrieve详解

    实验环境:windows 7,anaconda 3(python 3.5),tensorflow(gpu/cpu) 函数介绍:所用函数为six.moves下的urllib中的函数,调用如下urllib ...

  8. java语音播报源代码_详解Android 语音播报实现方案(无SDK)

    本文介绍了详解Android 语音播报实现方案(无SDK),分享给大家,具体如下: 功能描述 类似支付宝收款时候的语音播报功能:当别人扫描你的收款码,你收到钱之后,就会听到"支付宝到账12. ...

  9. java定时任务框架elasticjob详解

    这篇文章主要介绍了java定时任务框架elasticjob详解,Elastic-Job是ddframe中dd-job的作业模块中分离出来的分布式弹性作业框架.该项目基于成熟的开源产品Quartz和Zo ...

  10. Java 内存模型 JMM 详解

    转载自 Java 内存模型 JMM 详解 JMM简介 Java Memory Model简称JMM, 是一系列的Java虚拟机平台对开发者提供的多线程环境下的内存可见性.是否可以重排序等问题的无关具体 ...

最新文章

  1. 第二讲 词向量表示 word2vec
  2. RecyclerView ItemTouchHelper
  3. ArcGIS Pro 制作与发布高程服务Elevation Layer
  4. c#写字板实现加粗功能_Windows 7中写字板和绘画中的新功能
  5. apache camel_Apache Camel Intellij IDEA插件的工作已开始
  6. 固态硬盘对于linux提升,对提升Linux下固态硬盘使用率的探讨
  7. io python 读取pdf_python自动化办公之 Python 解析 PDF
  8. 基于JAVA+SpringMVC+Mybatis+MYSQL的驾照在线考试系统
  9. uva225 回溯剪枝
  10. 备库批量查询失败的原因分析
  11. 一朵落地中国的“智能云”是如何飘到你身边的!
  12. 【编程好习惯】引入中间变量使程序更易读
  13. Python tan函数图像绘制,不带有极值的线条
  14. Logistic(逻辑)回归分析
  15. 迅雷下gho文件变成php,GHO格式文件转换成WIM格式文件
  16. cmd删除Windows凭据管理器
  17. 中国顶级黑客,你所不知的内幕
  18. Python + ElasticSearch:有了这个超级武器,你也可以报名参加诗词大会了! | 博文精选...
  19. 32 | KafkaAdminClient:Kafka的运维利器
  20. Picsee for mac(最好的图片管理查看器)

热门文章

  1. 4、组件注册-自定义TypeFilter指定过滤规则
  2. Mybatis学习随笔
  3. mybatis 学习五 二级缓存不推荐使用
  4. 基础 - jQuery
  5. [未读]CLR via C#(第4版)
  6. ExtJs4 笔记(12) Ext.toolbar.Toolbar 工具栏、Ext.toolbar.Paging 分页栏、Ext.ux.statusbar.StatusBar 状态栏...
  7. Python写视图界面--pyqt的使用
  8. cp 时间长 linux,为了节省cp命令时间,结果换来了重装linux系统的差事
  9. MySQL表中插入中文数据时出错
  10. 使用 RIP、OSPF 发布默认路由