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
进行处理。
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
进行处理。
相关文章推荐
- Android 中添加 AT 命令流程
- Android 中添加 AT 命令流程
- UBOOT添加命令的执行流程
- android中添加AT命令流程(转载)
- UBOOT添加命令的执行流程
- UBOOT添加命令的执行流程 分类: arm-linux-Ubuntu HI3531 2013-12-24 09:24 514人阅读 评论(0) 收藏
- Mtk Android 编译命令自定义--添加版本号
- UBOOT添加命令的执行流程
- Android-4.0.4 添加触摸屏按键处理及java中使用重定位命令
- android Bluetooth常用AT 命令手册
- UBOOT添加命令的执行流程
- UBOOT添加命令的执行流程
- android 添加菜单 开发流程 短信发送与拨打电话
- Android平台添加外设的架构流程(kernel->HAL->JNI->API->APP)之学习提高篇
- 新手看招 了解UBOOT添加命令的执行流程
- UBOOT添加命令的执行流程
- android中添加AT命令流程
- Uboot 添加命令的执行流程
- android adb 命令添加root权限
- 【Android】在build/envsetup.sh中添加自己的命令(函数)