### Android中添加AT命令流程详解
#### 一、概述
在Android系统中,AT命令(AT Commands)是一种用于控制调制解调器(Modem)的标准命令集,它被广泛应用于移动通信领域,如拨打电话、发送短信等。本文将详细介绍如何在Android系统中添加自定义的AT命令,并实现其功能。
#### 二、准备工作
为了更好地理解本文内容,读者需具备以下基础知识:
1. **RIL(Radio Interface Layer)**:RIL是Android系统中连接高层应用程序与底层硬件设备(如基带处理器)的关键组件。它负责处理来自应用层的命令请求,并将其传递给底层硬件,同时也负责接收硬件返回的结果或状态信息。
2. **Java编程基础**:大部分Android应用层代码都是用Java编写的,因此熟悉Java编程对于理解本文内容至关重要。
#### 三、上层实现步骤
1. **添加上层函数**:
- 在`frameworks/base/telephony/java/com/android/internal/telephony/Phone.java`文件中,添加一个发送自定义AT命令的函数。
- `Phone`是一个接口,因此需要在实现此接口的具体类中实现上述函数。具体来说,可以在`frameworks/base/telephony/java/com/android/internal/telephony/gsm/GSMPhone.java`文件中实现该方法。
2. **实现方法**:
- 在`GSMPhone.java`文件中,通过调用`CommandInterface`接口中的方法来实现自定义AT命令的功能。
- 需要在`CommandInterface`接口中添加相应的抽象方法声明,然后在实现该接口的类中实现这些方法。
- `frameworks/base/telephony/java/com/android/internal/telephony/gsm/RIL.java`:这是真正实现AT命令与硬件通信的地方。
- `frameworks/base/telephony/java/com/android/internal/telephony/test/SimulatedCommands.java`:仅用于模拟器环境下的测试,无需深入关注。
3. **实现上下层通信**:
- 在`RIL.java`中实现具体的AT命令逻辑。关键步骤包括:
- 定义一个唯一的标识符(MARK)来表示新添加的AT命令。
- 使用`RilRequest`类的成员变量`mp`来封装需要发送的数据,例如将整型数组打包成`Parcel`对象。
- 调用相应的方法发送封装好的数据到硬件层。
#### 四、下层实现步骤
1. **添加宏定义**:
- 在`hardware/ril/include/telephony/ril.h`文件中添加一个新的宏定义,用于标识自定义的AT命令。确保该宏定义与其他宏不冲突。
- 注意:为了保持映射关系正确,新的宏定义应该放在所有现有宏定义的末尾。
2. **消息映射字符串**:
- 在`hardware/ril/libril/ril.cpp`文件中的`const char* requestToString(int request)`函数里,添加对应的新命令的字符串映射。
3. **函数映射表**:
- 在`hardware/ril/libril/ril_commands.h`文件中添加一个新的条目到函数映射表中。格式为:`{MARK, dispatch<type>, response<type>}`。
- 第一个参数是之前定义的标识符(MARK)。
- 第二个参数是指定的解析数据的函数。
- 第三个参数是指定的响应数据的函数。
4. **核心实现**:
- 在`hardware/ril/reference-ril/reference-ril.c`文件中,根据新命令的需求编写具体的逻辑处理代码。这通常涉及编写或修改`static void onRequest(int request, void *data, size_t datalen, RIL_Token *token)`函数。
- 对于只返回成功与否的命令,可以使用`at_send_command()`函数。
- 对于有返回值的命令,应使用`at_send_command_singleline()`函数。
#### 五、处理返回值
- 在上层的`RIL.java`文件中,需要在`processUnsolicited()`或`processSolicited()`方法中处理硬件返回的数据。根据实际需求选择其中一个方法来处理。
#### 六、总结
通过以上步骤,我们可以成功地在Android系统中添加并实现自定义的AT命令。需要注意的是,整个过程中涉及到多个层次的代码实现,从上层的Java代码到底层的C/C++代码,每一个步骤都需要仔细考虑和实现。此外,为了保证系统的稳定性和兼容性,还需要对新增加的功能进行充分的测试。