模组基础介绍与android RIL 介绍

在公司内部做了一个与自己模块相关的主题讲解。

把讲稿放上来,但没时间整理, 所以相关的图片之类的细节以后再补上吧。

/

 

0. 铺垫。

俺不用ppt。

能让大家建立模组相关的一点感性认识,知道ril大概是个什么东西,我就心满意足了。

 

1. 什么是模组?

首先, 它是一块芯片,里面一般也跑了一个操作系统, 这套软硬件系统主要完成通信、sim卡管理相关的功能。 

我们一般通过串口与它进行交互,你可以通过串口发送一些指令到模组,让它完成相应的功能。 它收到移动网络发来的新消息时,也会发送一些指令来通知你。

 

举个从串口抓到的数据的例子, 介绍AT命令。

adb logcat -b radio查询当前正在收发的AT命令, 更进一步介绍AT命令。

 

2. 为什么有那么多模组? evdo, gsm模组是什么东西?

我们有的项目是基于gsm网络的,比如A1, 有的是基于cdma网络的,比如A1E。实现不同网络功能自然可以有不同的模组来实现。

对我们使用模组的人来说, 不同模组的区别主要体现在AT命令集和命令的格式略有不同。

 

现在知道了,evdo和gsm模组分别是实现这两种网络通信功能的模组。

 

另外,我们还经常听到mtk模组, 信可模组等等的名词, 这些表示模组的生产厂商。

 

3. AT命令的种类

AT命令的种类, 我总结了一下, 主要有以下这么几类:

1. 常见查询与设置命令。 比如查询模组的版本号, 查询sim卡的IMSI号,等等。

2. 呼叫相关。    比如打电话, 挂断电话,呼叫保持,呼叫等待,等等。

3. 短信相关。    比如短信发送报告,阅读报告的设置, 收发短信,等等。

4. 电话本相关。  主要就是从sim读写电话本。

5. sim卡相关。  

6. 网络相关      gprs上网啊,之类的。

7. 主动上报。    主动上报当前的网络信号强度, 收到新短信或者新来电后,

 

4. 已经大体了解了模组, 那它是如何融入我们android系统中的呢?

首先, 我们已经知道,与模组之间的通信都是通过串口进行的。

这里就有两个问题了: 

A. 模组发往串口的数据谁来接收、处理、上报?

B. 用户想执行一个打电话的操作, 怎么把请求转化为实际的AT命令,并通过串口发送给模组?

 

这些工作就是通过ril模块来做的。

刚才说的ril这个名词,是由几个单词的英文缩写, radio interface layer, 中文翻译就是无线接口适配层, 意思是手机通过这个适配层就能与整个移动网络进行联系了。

 

针对刚才提出来的两个问题,简单看一下,ril都做了什么:

第一个问题, 模组将数据放到串口中, ril接收到后开始解析数据, 同时把数据封装成上层需要的格式, 以消息的形式转发至上层进行处理。 

第二个问题, 而当用户有打电话或发短信之类的操作时, 上层会产生消息, ril收到消息后将其转化为相应的AT命令,通过串口发送至模组。

 

所以这么看来, ril基本上就可以理解为一个消息中转层,一个是负责把模组上报到串口的数据上报至上层, 还有一个是把上层产生的请求转发至模组。

 

//那为什么不直接把这个功能通过上层来做呢?为什么要多这么一套东西呢?我想,这就是一个比较微妙的设计问题了。我觉得主要是为了减少底层和上层之间的耦合吧。

 

接下来介绍一下 ril相关的架构。

(画图, 正式拿出消息的概念)

和刚才说的一样, 整个系统基于消息机制。 上层是telephony, 它通过套接字与ril互相收发消息, ril这一层在手机里实际是以一个叫做rild的进程存在的, 它向下通过串口与模组互相收发AT命令。

模组从网络端收到新消息后, 以AT命令形式发送至串口, ril收到后将其封装成消息通过套接字转发至上层。

用户有打电话操作时, 上层产生一个消息通过套接字转发至ril, ril收到后将其转化为AT命令发送至模组。

 

rild里面有一个很重要的概念是插件。 

我们知道rild向下要模组交互, A1用的是gsm模组, A1E用的是evdo模组。这两种模组的AT命令集合、命令格式是不同的,有相当的差异。 是不是每一个模组我都要重写一套ril呢? 在面向对象设计里面有一个很重要的思想就是隔离变化, 在这里变化的东西是什么? 主要就是模组之间有差异。那么好, ril的设计者,在rild中提供了一套插件接口,一个模组要想被使用,首先要实现这套插件接口。 每个插件要实现的最主要的一个接口函数的名称是onRequest, 通过调用这个回调函数,把消息ID(例如打电话对应的ID), 消息数据(例如要呼出的电话号码)作为形参传入, 每个插件内部将消息转化为适应于相应模组的AT命令, 发送给模组。 这样ril框架只需要调用插件提供的回调函数, 不需要知道其内部实现,很好的隔离了变化。 从而我们可以看到一套ril代码,可以适配不同的模组, 我们可以做gsm网络的A1, cdma网络的A1E, 3G网络的N802. 这就是插件的好处。

 

大概的实际介绍ril的内部运行机制。 

可能讲的与实际的代码有一定的出入, 但基本的思考模型是一样的。

首先rild启动时, 会先根据命令行参数获得插件信息, 我们这里的插件的具体形式就是动态库, 获得插件路径, 加载并初始化插件。然后启动事件循环。

它内部的实现基于事件机制,里面有若干个事件源,通过一个事件循环(event loop)不断轮询每个事件源是否有新事件请求, 然后逐一把每个事件进行分发处理。

其中主要的事件源:

1. 与上层的UNIX套接字。

2. 模组插件的主动上报请求。

 

虽然代码初看起来有点乱, 但思路还是很清楚的。

 

实际看一看代码结构。 供有研究兴趣的同学参考。

 

最后简单介绍一下做双卡双待时, ril层的一些改动, 其中的变化可以这么理解,以前ril只需要面对一个插件, 在分发消息时,直接往下分发就可以了。 现在呢, 就相当于有两个插件了, 在分发消息时需要一个ClientID。 。。

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值