一、概念
二、疑问
1. Android底层如何跟GSM模块通信?
2. RIL是一种怎样的设计想法?
3. RIL跟上层是怎样通信,跟底层是怎样通信?
4. 举例说明设置通话音量 的流程。
三、讨论
1. Android底层如何跟GSM模块通信?
对于大部分独立的通信模块而言,模块化都已经非常完善,接口灰常简单,也有统一的软件接口 。一般Modem装上SIM卡,上电即可工作。自动完成初始的找网,网络注册等工作,完成后可打电话,发短信等。
Modem硬件傻姑娘一般提供两个通信通道:一个用于AT指令,一个用于数据传输。
Modem驱动比较简单,复杂的AT相关处理一般不放在驱动层,而是通过其上的RIL层去处理 。在Linux下,Modern驱动就是建立在UART或USB上的几个tty通道,提供与Modem直接的数据交互。
2. RIL是一种怎样的设计想法?
3. RIL跟上层是怎样通信,跟底层是怎样通信?
4. 举例说明设置通话音量 的代码编写流程。
[继承关系]
--CDMAPhone.java
--PhoneBase.java--
Phone.java-- -- GSMPhone.java
--PhoneProxy.java
Phone.java 描述了对Phone的所有接口。PhoneBase实现了Phone接口 ,而又派生出CDMAPhone和GSMPhone分别对CDMA和GSM操作; PhoneProxy也实现了Phone接口,当不需要区分CDMA和GSM操作时使用。
(1)根据这样的类继承关系,所以在JAVA框架层中,设置音量放在PhoneBase和PhoneProxy类中实现,更确切说是RIL.java实现了设置音量的方法。在此说一个插曲---RIL.java, RIL类中有3个比较重要的对象,分别是RILR equest、RILSender和RILReceiver。
RILRequest是一个命令请求。
RILSender 负责AT指令发送。
RILReceiver 负责处理上报的信息。当有上报信息来到时,系统将通过RILReciver来得到信息,并进行处理。
当发送一个设置音量的请求时,获得一个类型为EVENT_SEND的RILRequest请求来发送该命令,通过跟踪代码发现最终将命令写入了socket 进行发送。
s.getOutputStream().write(dataLength);
(2)其实RIL.java的作用相当于代理,起到转发命令 的作用。它通过socket往约定的端口发送命令,而Native RIL正是监听同一个端口 。
ril.cpp:
s_fdListen = android_get_control_socket(SOCKET_NAME_RIL );
Native RIL的实现文件是 reference-ril.c .
5.扩展 -
[参考]
http://www.kandroid.org/android_pdk/telephony.html
http://blog.csdn.net/yinlijun2004/archive/2010/11/18/6019860.aspx