Bluetooth (Android) 之自定义 AT 指令

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 快速拨号