gsm模块 java 录音_深入详解Android GSM驱动模块
明白了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驱动模块相关推荐
- gsm模块 java 录音_转]GSM模块信号强度CSQ与RSSI的对应关系
使用GSM或者3G模块时,都会接触到信号强度CSQ.通过指令AT+CSQ,模块返回当前的信号质量,例如: AT+CSQ +CSQ: 28,0 其中28就是信号强度CSQ,但它不是真实的CSQ,他应该叫 ...
- gsm模块 java 录音_Android GSM驱动模块详细分析
Android的RIL驱动模块, 在hardware/ril目录下,一共分rild,libril.so以及librefrence_ril.so三个部分,另有一 radiooptions可供自动或手动调 ...
- 蒙哥马利java算法_算法详解 - 蒙哥马利算法的概念与原理
算法的详解 扯了一大顿,终于引出了今天文章的主角,前面讲到的两个算法,第一个就是蒙哥马利乘模,第二个就是蒙哥马利约减.下面我们来讲这两个算法的详解. 正如前面提到的蒙哥马利算法的三个特性之一是,不是基 ...
- gsm模块 java 录音_Arduino从Quectel M95 GSM模块读取AT命令
Objective :通过SoftwareSerial / Arduino将命令提交给Quectel M95(GSM2单击http://www.mikroe.com/click/gsm2/)并解析响应 ...
- java编译使用androidsdk,详解Android源码的编译
本文将为大家介绍的是如何设置Android源码的编译环境,包括Linux下的配置.主要基于Android 1.0环境,希望对大家了解Android开发有所帮助. 本次编译过程主要参考官方文档(http ...
- 【java】JDK安全模块JCE核心Cipher使用详解
1.概述 转载:JDK安全模块JCE核心Cipher使用详解 2.前提 javax.crypto.Cipher,翻译为密码,其实叫做密码器更加合适.Cipher是JCA(Java Cryptograp ...
- python six模块详解_对python中的six.moves模块的下载函数urlretrieve详解
实验环境:windows 7,anaconda 3(python 3.5),tensorflow(gpu/cpu) 函数介绍:所用函数为six.moves下的urllib中的函数,调用如下urllib ...
- java语音播报源代码_详解Android 语音播报实现方案(无SDK)
本文介绍了详解Android 语音播报实现方案(无SDK),分享给大家,具体如下: 功能描述 类似支付宝收款时候的语音播报功能:当别人扫描你的收款码,你收到钱之后,就会听到"支付宝到账12. ...
- java定时任务框架elasticjob详解
这篇文章主要介绍了java定时任务框架elasticjob详解,Elastic-Job是ddframe中dd-job的作业模块中分离出来的分布式弹性作业框架.该项目基于成熟的开源产品Quartz和Zo ...
- Java 内存模型 JMM 详解
转载自 Java 内存模型 JMM 详解 JMM简介 Java Memory Model简称JMM, 是一系列的Java虚拟机平台对开发者提供的多线程环境下的内存可见性.是否可以重排序等问题的无关具体 ...
最新文章
- 第二讲 词向量表示 word2vec
- RecyclerView ItemTouchHelper
- ArcGIS Pro 制作与发布高程服务Elevation Layer
- c#写字板实现加粗功能_Windows 7中写字板和绘画中的新功能
- apache camel_Apache Camel Intellij IDEA插件的工作已开始
- 固态硬盘对于linux提升,对提升Linux下固态硬盘使用率的探讨
- io python 读取pdf_python自动化办公之 Python 解析 PDF
- 基于JAVA+SpringMVC+Mybatis+MYSQL的驾照在线考试系统
- uva225 回溯剪枝
- 备库批量查询失败的原因分析
- 一朵落地中国的“智能云”是如何飘到你身边的!
- 【编程好习惯】引入中间变量使程序更易读
- Python tan函数图像绘制,不带有极值的线条
- Logistic(逻辑)回归分析
- 迅雷下gho文件变成php,GHO格式文件转换成WIM格式文件
- cmd删除Windows凭据管理器
- 中国顶级黑客,你所不知的内幕
- Python + ElasticSearch:有了这个超级武器,你也可以报名参加诗词大会了! | 博文精选...
- 32 | KafkaAdminClient:Kafka的运维利器
- Picsee for mac(最好的图片管理查看器)
热门文章
- 4、组件注册-自定义TypeFilter指定过滤规则
- Mybatis学习随笔
- mybatis 学习五 二级缓存不推荐使用
- 基础 - jQuery
- [未读]CLR via C#(第4版)
- ExtJs4 笔记(12) Ext.toolbar.Toolbar 工具栏、Ext.toolbar.Paging 分页栏、Ext.ux.statusbar.StatusBar 状态栏...
- Python写视图界面--pyqt的使用
- cp 时间长 linux,为了节省cp命令时间,结果换来了重装linux系统的差事
- MySQL表中插入中文数据时出错
- 使用 RIP、OSPF 发布默认路由