这样ind value的不同组合就可以代表不同的电话场景流程。
CLCC命令的定义如下:
该指令需要HF侧主动通过"AT CLCC"指令告知AG侧将当前的电话信息通过" CLCC"发送过来。接收到" CLCC"指令,HF侧就可以知道当前的电话状态和号码等关键信息。
传送通话声音:蓝牙电话应用最根本的目的是传输双方的通话声音,既要将远端的输入语音经本端手机的电话模块接收到后再通过蓝牙模块AG侧传送到HF侧播放出来,也要将本端的输出语音通过HF侧传送到AG侧,再通过本端手机的电话模块发送出去。传输通话音频的通道主要是通话链路也就是大家平常说的SCO或eSCO链路。
SCO或eSCO的建立依赖于HFP协议的Service Level Connection连接成功(详情请参考《蓝牙电话之HFP-连接》),再通过HCI命令建立通话音频链路。
音频链路当前有两种编码方式,分别为CVSD和mSBC。采用哪种编码方式是有建立连接的双方协商决定的,AT命令" BRSF"中HF和AG双方会分别发送自己支持的features给对方,如果双方都支持编码协商即标志位Codec Negotiation,HF侧主动通过"AT BAC"的AT命令告知AG侧两种编码方式的编号分别为:1-CVSD,2-mSBC,并且在建立音频链路时多采用mSBC的编码方式,否则都是CVSD编码。
音频链路连接对应的HCI命令为:Setup Synchronous Connection Command,如果本端Controller支持Enhanced Setup Synchronous Connection指令(详情请查看Read Local Supported Commands Command的HCI命令),则创建连接的HCI命令为:Enhanced Setup Synchronous Connection Command
两种创建音频链路的HCI为:
音频链路SCO或eSCO建立成功后,通话语音就能在AG、HF两侧正常传输了。
以上就是蓝牙电话通话中需要了解的最重要的两点,HF侧的上层蓝牙电话应用只需监听BluetoothHeadsetClient中定义的如下两个广播就可以执行上层逻辑。
/**
* Intent sent whenever state of a call changes.
*
* <p>It includes:
* {@link #EXTRA_CALL},
* with value of {@link BluetoothHeadsetClientCall} instance,
* representing actual call state.</p>
*/
public static final String ACTION_CALL_CHANGED =
"android.bluetooth.headsetclient.profile.action.AG_CALL_CHANGED";
/**
* Intent sent whenever audio state changes.
*
* <p>It includes two mandatory extras:
* {@link BluetoothProfile#EXTRA_STATE},
* {@link BluetoothProfile#EXTRA_PREVIOUS_STATE},
* with possible values:
* {@link #STATE_AUDIO_CONNECTING},
* {@link #STATE_AUDIO_CONNECTED},
* {@link #STATE_AUDIO_DISCONNECTED}</p>
* <p>When <code>EXTRA_STATE</code> is set
* to </code>STATE_AUDIO_CONNECTED</code>,
* it also includes {@link #EXTRA_AUDIO_WBS}
* indicating wide band speech support.</p>
*/
public static final String ACTION_AUDIO_STATE_CHANGED =
"android.bluetooth.headsetclient.profile.action.AUDIO_STATE_CHANGED";
接下来再详细分析下这两个广播是如何一步步发送出去的,见如下时序图。