《4 AT指令介绍》由会员分享,可在线阅读,更多相关《4 AT指令介绍(37页珍藏版)》请在金锄头文库上搜索。
1、AT指令介绍,谢万财 2011-08-10,AT命令(AT Commands)概述RIL概述Android的系统架构Android RIL与AT概述实例操作拓展练习,缩略词,AT: ATtention; this two-character abbreviation is always used to start a command line to be sent from TE to TAME: Mobile EquipmentMT: Mobile TerminationTA: Terminal Adaptor, e.g. a GSM data card (equal to DCE; Dat
2、a Circuit terminating Equipment)TE: Terminal Equipment, e.g. a computer (equal to DTE; Data Terminal Equipment)DTE: Data Terminal EquipmentDCE: Data Circuit Terminal EquipmentMS : Mobile Station,AT命令(AT Commands)概述,由Hayes公司发明,现在已成为事实上的标准并被所有调制解调器制造商采用的一个调制解调器命令语言。每条命令以字母AT开头,因而得名。AT 即Attention,AT指令集
3、是从终端设备(TE)或数据终端设备(DTE)向终端适配器(TA)或数据电路终端设备(DCE)发送的。通过TA,TE发送AT指令来控制移动台(MS)的功能,与GSM 网络业务进行交互。用户可以通过AT指令进行呼叫、短信、电话本、数据业务、传真等方面的控制。,AT命令(AT Commands)概述,因为 AT 命令是作为一个接口标准,所以它的命令和返回的值和格式都是固定的,总体上说 AT 命令有四种形式:1. 无参数命令。它是一种单纯的命令,格式是 AT|&,如开机、显示当前设置列表等:AT+ON、AT&V 2. 查询命令。它用来查询该命令当前设置的值,格式是 AT|&?,如:AT+CSCA?3.
4、 帮助(测试)命令。它是用来列出该命令的可能参数,格式是 AT|&=?,如: AT+CMGL=?4. 带 参 数 命 令 。 它 是 应 用 最 广 的一种格式, 它为命令提供了强大的灵活性, 格式是AT |&=,AT命令(AT Commands)概述,目前的智能机在硬件上多采用双cpu的架构,一个是基带处理器,主要处理数字信号、语音信号的编码解码以及GSM通信协议,另一个是应用处理器,运行操作系统和各种应用程序。基带处理器、射频和其它外围芯片作为一个模块,成为GSM/GPRS modem,提供AT命令接口。 网络的应用已经是一个需求的热点,而目前的GSM模块大多都能支持GPRS功能。应用处理
5、器通过AT命令集与带GPRS功能的无线通讯模块通信,为实现网络的应用提供了一个最底层的支持。,AT命令(AT Commands)概述,TE、TA间接口的操作可以通过使用物理存在的串口线、红外连接,或其他具有相似功能的连接方式。,RIL概述,RIL,Radio Interface Layer。 本层为一个协议转换层,手机框架需要适应多类型的 Modem接入到系统中,而对于不同的 Modem 有不同的特性,AT 指令的格式或者回应有所不同,但是这种特性在设计应用时不可能完全考虑和兼容。所以设计者在设计电话系统时,建立了一个虚拟电话系统,为该虚拟电话系统规定了标准的功能,上层的电话管理都是建立在这些
6、标准的功能基础之上。而 RIL 则是将虚拟电话系统的标准功能转换成实际的所使用的 Modem的 AT 指令。,Android的系统架构,BroadCom修改的系统架构,相对而言,BroadCom平台增加了HAL层,并有URIL和KRIL的说法,但不影响我们对RIL层整体架构的理解。,Android RIL与AT概述,Android 设计者将电话系统设计成了三部分,Android 给出了一个 ril实现框架。由于 Android 开发者使用的 Modem 是不一样的,各种指令格式,初始化序列都可能不一样,GSM 和 CDMA 就差别更大了,所以为了消除这些差别,Android 设计者将 ril
7、做了一个抽象,使用一个虚拟电话的概念。这个虚拟电话对象就是GSMPhone(CDMAPhone),Phone对象所提供的功能协议,以及要求下层的支撑环境都有一个统一的描述,这个底层描述的实现就是靠 RIL 来完成适配,Android RIL与AT概述,ril 是具体的 AT 指令合成者和应答解析者。从最基本的功能来讲,ril 建立了一个侦听Socket,等待客户端的连接,然后从该连接上读取 RIL-Java 成传递来的命令并转化成 AT指令发送到 Modem。并等待 Modem 的回应,然后将结果通过套接口传回到 Ril-Java 层。,Android RIL与AT概述,为什么要定义这些接口呢
8、?这函数接口不是凭空捏造出来的, 这些都是电话的基本功能的描述,是对 Modem AT 指令的提炼抽象。大多数 Modem 都是根据通讯协议提供接口,在 ril.java 源代码中,我们可以看到 RIL-JAVA 对象提供了如述的 Command Interface,Android RIL与AT概述,Rild是 Init进程启动的一个本地服务,这个本地服务并没有使用 Binder之类的通讯手段,而是采用了 socket 通讯这种方式。,Android RIL与AT概述,android 电话系统整体框架图,从这个图看来,应该是Phone对象中有个RIL类型的成员变量,通过RIL中的Reciver
9、/Sender向下层发送数据,Android RIL与AT概述,下面的数据流传递描述图表描述了 RIL-JAVA 层发出一个电话指令的 5 步曲,RIL_JAVA 传递的命令格式:Parcel ,由命令号,令牌,内容组成。RIL_JAVA 到达 RIL_C时转为构建本地 RequestInfo,并将被翻译成具体的 AT 指令。由于每条 AT 命令的参数是不同的,所以对不同的 AT指令,有不同的转换函数.,但是我感觉Java和C中都有Parcel和RequestInfo,只不过一个是进行封装,一个是进行解析,这个图画的略微有点模糊主要是讲了两个应用的具体流程:请求和主动上报黄线是函数调用,绿线是
10、解释。(不过这图画的真烂),实例,TwelveKeyDialer.java,public class TwelveKeyDialer extends Activity implements View.OnClickListener,View.OnLongClickListener, View.OnKeyListener, AdapterView.OnItemClickListener, TextWatcher . public void afterTextChanged(Editable input) if (SpecialCharSequenceMgr.handleChars(this, i
11、nput.toString(), mDigits) / A special sequence was entered, clear the digits mDigits.getText().clear(); .,拨号键显示、监听、处理,这个例子是查询IMEI号,所以稍微有些特殊,实例,SpecialCharSequenceMgr.java,static boolean handleChars(Context context, String input, EditText textField) return handleChars(context, input, false, textField
12、);,static boolean handleChars(Context context, String input, boolean useSystemWindow,EditText textField) /get rid of the separators so that the string gets parsed correctly String dialString = PhoneNumberUtils.stripSeparators(input); if (handleIMEIDisplay(context, dialString, useSystemWindow) | hand
13、lePinEntry(context, dialString) | handleAdnEntry(context, dialString, textField) | handleSecretCode(context, dialString) /2010-12-15And by ying.pang for quick lanuch application | handleApplicationQuickLaunch(context,dialString) return true; return false;,static boolean handleIMEIDisplay(Context con
14、text, String input, boolean useSystemWindow) if (input.equals(MMI_IMEI_DISPLAY) int phoneType = (TelephonyManager)context.getSystemService( Context.TELEPHONY_SERVICE).getPhoneType(); if (phoneType = TelephonyManager.PHONE_TYPE_GSM) showIMEIPanel(context, useSystemWindow); return true; else if (phone
15、Type =TelephonyManager.PHONE_TYPE_CDMA) . return false;,static void showIMEIPanel(Context context, boolean useSystemWindow) String imeiStr = (TelephonyManager)context.getSystemService( Context.TELEPHONY_SERVICE).getDeviceId(); .,判断你是否在查询IMEI号,发现还真是的,实例,TelephonyManager.java,public String getDeviceId() try return getSubscriberInfo().getDeviceId(); catch (RemoteException ex) return null; catch (NullPointerException ex) return null; ,