《2022年Android中添加AT命令流程[ .pdf》由会员分享,可在线阅读,更多相关《2022年Android中添加AT命令流程[ .pdf(3页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、android 中如何添加一个AT 命令简介:android 平台,自带的参考RIL 层是使用AT 命令来和modem 进行通信的,因为它假定AP 和 CP 可能来自不同的厂家,所以AP 和 CP 之间采用的是松耦合的机制。而高通平台,AP 和 CP 都由高通提供, 所以两颗CPU 之间的通信采用紧耦合机制,采用 ONCRPC 或 QMI来进行通信。AT 命令和 QMI 各有优缺点, AT 命令有国际统一的标准,实现简单, 但是实现的功能少,效率较低。而QMI 机制是高通制定的,其实现复杂,但是效率高。下面介绍使用AT 命令机制实现的RIL ,如何添加一个AT 命令。 我们假定要加一个读取CD
2、MA modem 的 IMSI 值的 AT 命令。一、在上层添加所要发的AT 命令的方法1. 在接口 phone 中添加所要发的AT 命令的方法。接口phone 所在的位置是:frameworks/base/telephony/java/com/android/internal/telephony/Phone.java 在 phone 的接口中添加方法:getcdmaIMSI(); Phone是个接口,因此,添加完方法后,得在实现Phone接口的 java 类里面实现这个方法,GSM 实现 Phone 的类是 GSMPhone.java,CDMA 实现 phone 的类是 CDMAPhone.
3、java GSMPhone.java 位于frameworks/base/telephony/java/com/android/internal/telephony/gsm/GSMPhone.java CDMAPhone.java 位于frameworks/base/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java public String getcdmaIMSI() return mSST.getImsi(); 2. Phone接口的实现方法调用CommandsInterface 接口里面的方法,所以我们还需
4、要在CommandsInterface 里面把我们要增加的方法添加进去。CommandsInterface 接口位于:rameworks/base/telephony/java/com/android/internal/telephony/commandsinterface.java 在 commandsinterface 接口中添加方法:void getIMSI(String aid, Message result); 同样的, CommandInterface 也是个接口, 我们需要在实现接口的类里实现这个方法。而实现这个接口的类有2 个:1. frameworks/base/teleph
5、ony/java/com/android/internal/telephony /RIL.java 2. frameworks/base/telephony/java/com/android/internal/telephony/test/SimulatedCommands.java 其中第 2 个是在模拟器里面测试用的,我们只需要在里面把方法添加进去,然后调用个resultSuccess或者 umimplement 都可以。而第 1 个才是真正实现功能的类。所以,我们得在RIL.java 中,实现具体的方法。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - -
6、 - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 3 页 - - - - - - - - - 在 RIL.java 的方法里面, 只需要定义好你所需要发送AT 命令的一个标识MARK (下面还会提到) , 再把 RilRequest 类里面的Parcel 成员 mp 赋值,然后发送出去即可。赋给 mp 的值,即为我们需要发送到下层去处理的值,例如传个数组下去,一般都先把长度写进去,其次再把成员依次写入。public void getIMSI(String aid, Message result) RILRequest rr = RILRequest.obt
7、ain( RIL_REQUEST_GET_IMSI, result); rr.mp.writeInt(1); rr.mp.writeString(aid); if (RILJ_LOGD) riljLog(rr.serialString() + getIMSI: + requestToString(rr.mRequest) + aid: + aid); send(rr); 二、在下层添加实现的函数1. 在 hardware/ril/include/telephony/ril.h h文件中添加AT 命令标识,即上文提到的MARK 。注意不要和别的宏发生冲突。int RIL_REQUEST_GET_
8、IMSI = 11;注意:这里的 MARK 必须定义在最后面,不然会带来不必要的麻烦,理由如下:在 ril.h 中定义了每个关键字对应的值,同时在 ril_command.h 有张映射表, 而且是按ril.h 中的顺序映射的, 大家可以看作是数组的下标。这里要一一对应,如果从中间插入,将会导致后面的字段映射不对。除非把 ril.h 中关键字对应的值修改,但这样会浪费比较多的时间。2. 在 hardware/ril/libril/ril.cpp中添加消息映射字符串。在该文件的const char *requestToString(int request) 函数里面。case RIL_REQUES
9、T_GET_IMSI: return GET_IMSI; 3. 在 hardware/ril/libril/ril_commands.h文件的最后添加函数映射表。形如 MARK, dispatch, response 解释如下:首先第 1 个参数即为我们之前所定义的标识,即MARK 。第 2 个参数是下层的从数据流中解出数据的函数,这里要和上层所传下来的类型对应,例如上层传下来的是int 数组,这里也得是dispathInts, 否则数据会出错第 3 个参数是该函数所要返回的值,这里的 和第 2 个参数的一样。RIL_REQUEST_GET_IMSI, dispatchStrings, res
10、ponseString, 4. 在 hardware/ril/reference-ril/reference-ril.c中添加处理AT 命令函数名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 3 页 - - - - - - - - - 此文件中,函数 static void onRequest (int request, void *data, size_t datalen, RIL_Token t)是 RIL发送请求的入口函数。在此函数里面添加我们所要处理的AT 命令函
11、数。一般对于只返回成功与否的AT 命令,我们用 at_send_command()。 而对于有返回值的命令,我们用 at_send_command_singleline()。case RIL_REQUEST_GET_IMSI: at_send_command_numeric(AT+CIMI, &p_response); 三、添加返回值命令发送成功后,modem 会返回命令的响应消息。因此我们还需要对响应消息进行处理。响应消息的处理是在RIL.java 文件中的processUnsolicited() 或者 processSolicited()函数中。processSolicited()处理的是
12、通过发送命令然后才会返回结果的消息。而 processUnsolicited() 处理的是主动上报类型的结果消息,即不需要你发送命令,modem侧会主动发的消息。比如:modem 主动上报来电消息。注意我们选用的返回函数,得和我们在ril_command.h 里面所添加的函数映射表里的返回函数对应。case RIL_REQUEST_GET_IMSI: ret = responseString(p); break; 到了这里, AT 命令的过程就添加结束,命令的返回值就在调用Phone里面的函数所传入的Message 中。 返回的是一个AsyncResult, 就是 Message的 obj 成员。这里我们可以处理异常,一般可通过如下代码处理(假设传入的Message为 msg):AsyncResult ar = (AsyncResult)msg.obj if (ar.exception != null) 处理异常处理结果,就对ar.result 进行处理。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 3 页 - - - - - - - - -