背景
HFP作为经典蓝牙通话建立和断开的协商服务,通话数据则是通过eSCO链路进行传输,下面以手机和蓝牙耳机为例,结合HCI和空口分析从HFP连接建立,到AT命令协商会话,再到eSCO通话数据链路的建立 。
1:HFP连接建立
1:SDP发现HFP服务
从上面看到手机发起了HFP SDP查询,耳机支持HFP 1.8版本,server channel为1。
2:RFCOMM通道建立
从上图看到手机会去连接耳机的channel 1,然后建立起RFCOMM,HFP也是基于RFCOMM的连接,至此HFP连接建立成功。
2:HFP AT命令协商
首先要明确耳机作为HFP Client,手机则作为HFP AG(server),下面看一下手机和耳机通过AT命令都做了哪些协商
可以看到上图手机和耳机交换了很多AT命令,下面拿主要的AT命令解释一下:
AT命令 | 值 | 解释 |
---|---|---|
AT+BRSF | EC and/or NR function: Supported 、Call waiting or 3-way calling: Supported,CLI presentation capability: Supported,Voice recognition activation: Supported,Remote volume control: Supported,Enhanced call status: Supported,Enhanced call control: Supported,Codec negotiation: Supported ,HF Indicators: Supported,eSCO S4: Supported | 就是协商HFP Client和HFP AG支持通话哪些feature,比如是否支持噪音和回显,是否支持三方通话,codec协商,音量控制等等 |
AT+BAC | Supported Codec: CVSD mSBC | 耳机告知手机目前支持的codec,1为cvsd,2为mSBC,也就是所谓的窄带和宽带两种codec,分别对应8khz和16khz采样率,hfp1.9支持了超宽带codec LC3,支持32khz采样率 |
+CIND | Mobile Termination Indicators (“call”,(0,1)),(“callsetup”,(0-3)),(“service”,(0-1)),(“signal”,(0-5)),(“roam”,(0,1)),(“battchg”,(0-5)),(“callheld”,(0-2)) | HFP AG告知HFP Client支持的指示器和范围,以及当前的状态,比如后面看到的+CIEV:1,1就是表示(“call”,1) |
AT+CMER | 3,0,0,1简单的说就是使能和去能AG的indicator通知HF的能力,3,0,0,1是 | activates“indicator events reporting”,激活HFP AG主动通知HFP Client电话状态变化信息,表示手机可以通过+CIEV:xx:xx告知耳机,通话接通或断开等。如果是3,0,0,0则表示关闭AG通过indicator 通知HF的能力 |
AT+CHLD | 这个有两种形式的命令: 1:AT+CHLD=? 表示HFP Client主动向HFP AG查询三方通话的一些特性;2:+CHLD 表示HFP AG上报HFP Client,当前三方通话的特性和状态。 | |
AT+BIND | BIND是Bluetooth HF Indicators Feature的缩写,该命令用于HFP Client 向HFP AG告知自己支持哪些HF Indicators Feature,以及哪些被使能了。该指令只有在HFP Client和HFP AG在AT+BRSF时HF Indicators:supported才可以使用。 | |
+BIND | +BIND:1,1 +BIND:2,1 | Bluetooth HF Indicators Feature -->Indicator: enhanced Safety State: Enhanced Safety is Enabled; Indicator: Battery Level State: Remaining level of Battery 1 |
AT+NREC | 关闭回音消除和噪音减少功能 Disable “Echo Canceling\Noise Reduction function” | |
AT+VGS | 15 | 设置耳机speaker音量 |
AT+CCWA | 1 | Enable call waiting notification,打开通话等待通知功能 |
AT+BIA | indicator激活 |
经过上面的耳机和手机通过AT命令进行了基本情况协商之后,当手机开始拨号后,我们会看到如下AT命令:
- +BCS:2 表示手机选择mSBC codec作为数据的编码方式
- +CIEV 2,2 表示手机开始拨对方的号码
- +CIEV 2,3 表示对方已经响铃
- +CIEV 1,1 表示电话已经接通
- +CIEV 2,0 表示电话接通后,没有电话再拨进来
eSCO的建立:
eSCO的建立时间是当手机开始拨对方电话的时候就开始了:
从上图空口可以看到在CIEV:2,2,也是就手机拨对方电话的时候就通过LMP eSCO Link Request去和手机建立eSCO连接,如绿色框框。下面再看看这个命令有啥参数:
如上图,这里面主要有四个参数:
参数 | 值 | 解释 |
---|---|---|
TeSCO | 12 slots = 7.500 ms | 就是双向传输一个包的时间周期 |
WeSCO | 4 slots = 2.500 ms | 重传的窗口时间 |
eSCO Packet Type C->P | 2-EV3 | 采用2M Ehanced voice 3数据格式传输 |
Packet Length C->P | 60 bytes | 单个包的字节数 |
再看一下电话接通后(+CIEV 1,1),eSCO在空中传输的数据:
从上图可以看到单向的两个数据包之间的时间间隔都是7.5ms,而且发生了一次重传:
从上图可以看到手机发送给耳机的2-EV3数据包进行了重传,重传窗口是2.5ms。