AT 指令常见于设备间的无线通讯,蓝牙作为无线通讯的一员,也集成了一些 AT 批令,算 GSM AT 指令中的一个子集。Android 系统蓝牙模块提供一些标准的 AT 指令,也为厂商提供自定义扩展的 AT 指令。
一、AT 指令介绍
AT指令是应用于终端设备与PC应用之间的连接与通信的指令。AT 即Attention。每个 AT 命令行中只能包含一条 AT 指令;对于 AT 指令的发送,除 AT 两个字符外,最多可以接收 1056 个字符的长度(包括最后的空字符)。
Android 从 3.0 开始,应用可以注册接收由 Headset 设备发送的预定义的 AT 指令系统广播。例如,应用可以接收表明连接设备电量低的广播并且通知用户,或其他需要的行为。可以创建一个广播接收器用 ACTION_VENDOR_SPECIFIC_HEADSET_EVENT 作为 intent 的 ACTION,处理 Headset 设备的自定义 AT 指令,为蓝牙耳机制造厂商提供特定的 AT 命令。
二、HFP 与 HSP 的区别
HFP(Hands-free Profile) 和 HSP(Headset Profile)都是为了实现蓝牙通话而制定,所实现的功能都和蓝牙通话相关。基本所有的蓝牙耳机、车载蓝牙都会支持这两个协议。
HSP 仅实现了最基本的通话操作:接听电话、挂断电话、调节音量、声音在手机/蓝牙耳机之间切换。
HFP 在功能上是对 HSP 的扩展,除了上述功能以外,还包括控制三方通话、来电拒接、耳机端来电显示等高级功能,不过实现的方式,如用于控制的 AT CMD 完全不一样。
在 Android 设计上并没有将上述两个协议分开显示,而是均表述为“手机音频”,在使用的时候优先连接 HFP,只有在对方仅支持 HSP 或 HFP 连接失败的时候才会尝试 HSP。
三、ACTION_VENDOR_SPECIFIC_HEADSET_EVENT 说明
Intent used to broadcast that the headset has posted a vendor-specific event.
This intent will have 4 extras and 1 category.
- BluetoothDevice#EXTRA_DEVICE - The remote Bluetooth Device
- EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_CMD - The vendor specific command
- EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_CMD_TYPE - The AT command type which can be one of AT_CMD_TYPE_READ, AT_CMD_TYPE_TEST, or AT_CMD_TYPE_SET, AT_CMD_TYPE_BASIC,AT_CMD_TYPE_ACTION.
- EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_ARGS - Command arguments.
The category is the Company ID of the vendor defining the vendor-specific command. BluetoothAssignedNumbers For example, for Plantronics specific events Category will be VENDOR_SPECIFIC_HEADSET_EVENT_COMPANY_ID_CATEGORY.55
For example, an AT+XEVENT=foo,3 will get translated into
- EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_CMD = +XEVENT
- EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_CMD_TYPE = AT_CMD_TYPE_SET
- EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_ARGS = foo, 3
Requires Manifest.permission.BLUETOOTH permission to receive.
Constant Value: "android.bluetooth.headset.action.VENDOR_SPECIFIC_HEADSET_EVENT"
四、实例
4.1 声明
String ACTION_VENDOR_AT = "android.bluetooth.headset.action.VENDOR_SPECIFIC_HEADSET_EVENT";
4.2 注册广播
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ACTION_VENDOR_AT);
registerReceiver(mFondDevieReceiver, intentFilter);
部份情况可能收不到广播,所以也可以用如下方式:
btIntentFilter = new IntentFilter();
btIntentFilter.addCategory(BluetoothHeadset.VENDOR_SPECIFIC_HEADSET_EVENT_COMPANY_ID_CATEGORY + "." + BluetoothAssignedNumbers.PLANTRONICS);
btIntentFilter.addAction(ACTION_VENDOR_AT);
registerReceiver(btReceiver, btIntentFilter);
4.3 广播解析
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(ACTION_VENDOR_AT)) {
Bundle extras = intent.getExtras();
String str = (String) extras.get(BluetoothHeadset.EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_CMD);
Object[] str3 = (Object[]) extras.get(BluetoothHeadset.EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_ARGS);
mResult.setText("AT" + str + " = " + (Integer)str3[0]);
}
}
str 表示的是 AT 的指令,可以自定义
Object[] str3 取到的是 “=” 号后面的几个以数,如:AT+XEVENT=foo,3
那么 str3 数据如下:
str3[0]:foo
str3[0]:3
str:+XEVENT
五、标准蓝牙 AT 指令
蓝牙交互中涉及到的标准 AT 指令有:
AT 指令 | 功能说明 |
---|---|
AT + BLDN | 重拨 |
AT+BVRA (AT+BVRA=0或AT+BVRA=1) | 调用系统或第三方的语音识别引擎 |
ATA | 接听来电 |
ATH | 挂机命令 |
AT+CHUP | 拒接来电 |
ATD%s | 拨号 |
AT+CHLD | 通话保持,多方处理 |
ATD>n | 快速拨号 |
《Bluetooth (Android) 之自定义 AT 指令》有2个想法
评论已关闭。