您的位置:首页 > 移动开发 > Android开发

Android 中添加 AT 命令流程

2014-09-19 22:59 211 查看
本文假设读者已经了解
RIL
的基本知识

从上层出发,在

frameworks/base/telephony/java/com/android/internal/telephony
/Phone.java


添加所要发
AT
命令的上层函数。

Phone
是个接口,因此,添加完后,得在实现
Phone
接口的
java
类里面实现这个方法,实现
Phone
的类即
GSMPhone.java
位于

frameworks/base/telephony/java/com/android/internal/telephony/gsm/
GSMPhone.java

在这里,调用
CommandInterface
里面的方法,

因此,

我们还得在
CommandInterface
里面
把我们要增加的方法添加进去

同样的,
CommandInterface
也是个接口,而实现这个接口的类有
2
个:

1. frameworks/base/telephony/java/com/android/internal/telephony/gsm/RIL.java
2. frameworks/base/telephony/java/com/android/internal/telephony/test/SimulatedCommands.java

其中第
2
个是在模拟器里面测试用的,

我们只需要在里面把方法添加进去,然后调用个
resultSuccess
或者
umimplement
都可以。

而第
1
个才是真正到达
GSM
驱动的类。

所以,我们得在
RIL.java
中,实现上层与下层的通信。


RIL.java
的方法里面,
只需要定义好你所需要发送
AT
命令的一个标识
MARK
(下面还会
提到)


再把
RilRequest
类里面的
Parcel
成员
mp
赋值,

然后发送出去即可。

赋给
mp
的值,即为我们需要发送到下层去处理的值,

例如传个数组下去,

一般都先把长
度写进去,

其次再把成员依次写入。

======================================================================
=========================
接下来,便是下层的添加过程。

1


hardware/ril/include/telephony/ril.h
在此文件中,
添加一个标识你所要处理的
AT
命令的宏,

即上面所说到的
MARK


注意不
要和别的宏发生冲突。

注意:

这里的
MARK
必须定义在最后面,

不然会带来不必要的麻烦,

理由如下:


ril.h
中定义了每个关键字对应的值,同时在
ril_command.h

张映射表

而且是按
ril.h
中的顺序映射的,大家可以看作是数组的下标。

这里要一一对应,如果从中间插入,将会导致后面的字段映射不对。

除非把
ril.h
中关键字对应的值修改,但这样会浪费比较多的时间。

2


hardware/ril/libril/
ril.cpp





const
char
*requestToString(int
request)














3


hardware/ril/libri
l/ril_commands.h
在该文件的最后添加函数映射表,

形如
{MARK, dispatch<type>, response<type>}
解释如下:

首先第
1
个参数即为我们之前所定义的标识,即
MARK



2
个参数是下
层的从数据流中解出数据的函数,
这里要和上层所传下来的类型对应,
例如
上层传下来的是
int
数组,这里也得是
dispathInts


否则数据会出错


3
个参数是该函数所要返回的值,

这里的
<type>
和第
2
个参数的一样。

4


hardware/ril/reference-ril/reference-ril.c
这里就是发
AT
命令的核心文件,

static void onRequest (int request, void *data, size_t datalen,
RIL_Token t)
里面添加我们所要处理的
AT
命令函数。

照着别人写的,

自己加以修改就可以了。这里对
2
个发送
AT
命令的函数进行说明下:

一般来说,

都是这样的,
对只返回成功与否的
AT
命令,我们用
at_send_command()



对于有返回值的命令,我们用
at_send_command_singleline()


======================================================================
================================
最后回到上层的
RIL.java
中,

processUnsolicited()
或者
processSolicited()
里面添加返回值即
可。

这里我们只选择其中一个来处理,在
processUnsolicited()
是处理主动上报类型的命令的,即
不需要你发送命令去查询的类型。


processSolicited()
则是需要通过发送命令才会返回结果
的类型。

大家只要看看那函数里面的值是如何返回的即可,

注意我们选用的返回函数,得和我们在
ril_command.h
里面所添加的函数映射表里的返回函数对应。

到了这里,
AT
命令的过程就添加结束,

命令的返回值就在调用
Phone
里面的函数所传入的
Message
中。

返回的是一个
AsyncResult


就是
Message

obj
成员



这里我们可以处理异常,一般可通过如下代码处理
(
假设传入的
Message

msg)


AsyncResult ar = (AsyncResult)msg.obj

if (ar.exception != null)
处理异常

处理结果,就对
ar.result
进行处理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: