0
点赞
收藏
分享

微信扫一扫

Android 蓝牙 HFP通话、三方通话、Sco、rfcomm连接、SLC服务水平连接介绍 - 史上最全分析

木樨点点 2022-04-15 阅读 254

android-蓝牙A2dp-avrcp-hfp-opp-配对流程-ble-rfcomm源码流程

Android 蓝牙hfp初始化、rfcomm连接、slc连接、sco连接源代码分析大全-点击下载

一、编写目的

此篇文档主要介绍一些通话的基本概念与流程,包括SLC与音频连接的建立,来电、去电、挂断以及三方通话中某些场景的流程。

1.2参考资料

《HFP_v1.8》

《Core_v5.2》

《3GPP TS 07.10》

1.3名词介绍

AG

Audio-GateWay,音频设备输入输出网关,手机就是典型的AG设备。

HF

Hands-Free unit,免提设备,作为音频网关的远程音频输入/输出机制,并可提供若干遥控功能,典型的HF设备有手表、手环、耳机或车载设备等。

SLC

HFP的服务级连接,主要包括特性交换、codec协商以及Indicators更新使能。

SCO

synchronous connection,主要用于传输像音频数据这类的实时数据。

CLCC

AT指令,可用于获取当前通话的信息,包括号码,通话状态等。

CHUP

AT指令,HF可通过发送AT+CHUP挂断电话。

CHLD

AT指令,主要用在三方通话。

CMER

AT指令,SLC建立时用于使能AG的Indicators的更新。

CIEV

AT指令,AG通话状态使能更新后,通过CIEV指令更新通话状态到HF。

二、基本功能与使用场景介绍

手表、手环、耳机、车载设备等如果没有SIM卡的话是直接无法接入电话网络进行通话的,需要与手机等具备通话能力的设备建立HFP连接,手表等设备才能实现来电显示、接听、挂断、拨号等功能。手表、手表这类的设备就是HF设备,而手机则作为AG设备。当然,手表、手环的设备如果具有SIM卡,也可以作为AG,此时耳机可以作为HF连接到手表。

2.1基本场景

1)连接状态显示

当手机显示“已连接用于通话的音频”字样时表明HFP已经连上

2)接听、挂断、拒接、去电

手表、手环、蓝牙耳机或车载设备如果支持通话功能,通过HFP可以使这些蓝牙产品实现接听、挂断、拒接、发起去电的功能,如下图所示为来电时手表显示的界面,可以选择接听或拒接。

3)语音通道切换

在通话中时,可以选择通话声音从手机发出,也可以选择声音从手表或耳机发出,如图所示,点击蓝牙图标就可以选择想要出声的设备,可以选择手机听筒、手机外放或者蓝牙设备。

4)快速拨号:

手机中有快速拨号的功能,利用HFP,手表或手环也能够实现这个功能

 

可以在手机设置中将拨号按键与特定的号码关联,手表或手环只需要使用按键对应的值,而不必知道号码,即可实现拨号。

5)呼叫等待通知

当处于通话中时,此时如果打进一通电话X,X会处于呼叫等待的状态,手机会通过HFP通知到手表,表示有第三方来电。

6)三方通话

三方来电可以通过手机来接听,也可以通过手表或手环来接听,当接听第三方来电后,之前处于通话中的电话会被置为保持状态,如果想要恢复第一通电话,可以点击交换,这样会把当前处于通话中的通话置为保持状态,这些操作都可以使用手表或手环来实现,如图所示。

2.2基本功能

以下是HFP协议规定HF和AG所需要支持的一些特性,其中M表示必须支持,O表示可选。

Feature

Support in HF

Support in AG

1

Connection management

连接管理,包括服务级连接SLC的建立与释放

M

M

2

Phone status information

电话状态信息,包括信号强度、漫游状态、电量显示、运营商以及call、callsetup和callheld的状态

M

M

3

Audio Connection handling

音频连接处理,包括音频连接建立、音频连接释放以及codec连接建立,HF与AG音频连接建立后,AG可以将通话的音频数据发送给HF,这样HF对音频数据进行处理后便可以通过speaker发声

M

M

4

Accept an incoming voice call

接听来电,可通过AG接听,也可通过HF接听,HF通过ATA命令接听来电

M

M

5

Reject an incoming voice call

拒接来电,可通过AG拒接(如果AG支持此特性),也可通过HF拒接,HF使用AT+CHUP命令拒接

M

O

6

Terminate a call

挂断电话 可通过AG挂断,也可通过HF挂断,HF通过AT+CHUP命令实现挂断

M

M

7

Audio Connection transfer during an ongoing call

通话过程中的音频连接转移,音频连接可以从AG转移到HF,这意味着需要在AG与HF之间建立音频连接;也可以从HF转移到AG,此时需要将AG与HF之间音频连接释放,具体应用的场景为通话时出声通道的切换,比如想要使得通话声音从手机侧出,可以将音频连接从HF切换到AG,反之将音频连接从AG切换到HF

M

M

8

Place a call with a phone number supplied by the HF  

HF通过电话号码拨打电话,HF可通过ATDdd…ddd命令给AG实现拨号,比如ATD10086可以拨打10086

O

M

9

Place a call using memory dialing

HF从内存拨号,HF通过此特性可以实现快速拨号,比如在手机上设置按键2与某个号码关联起来,长按2时可以快速拨号,HF可以通过发送ATD>2命令来完成此项功能

O

M

10

Place a call to the last number dialed

拨打上次拨打的号码,HF通过AT+BLDN命令拨打上一次呼叫的号码

O

M

11

Call waiting notification

呼叫等待通知,如果HF支持此特性,HF使用AT+CCWA使能此功能,当有三方来电时,AG会使用+ccwa通知HF,表示除了当前正在进行的通话外,有其他的电话在呼叫本机号码

O

M

12

Three-way calling

三方通话,如果HF和AG都支持此特性,HF可以接听、挂断、拒接三方来电以及拨打三方电话

O

O

13

Calling Line Identification (CLI)

主叫线路识别,如果主叫用户号码信息可从网络获得,当 HF 在来电中被提醒时,AG 将在每个 RING 指示后立即发出 +CLIP 主动结果代码,可以理解为来电提醒

O

M

14

Echo canceling (EC) and noise reduction

(NR) 回声消除 (EC) 和降噪 (NR),HF可以使用AT+NREC命令来使能AG的回声消除与降噪功能,如果AG支持此功能,会返回OK,否则返回ERROR

O

O

15

Voice recognition activation

语音识别激活,HF可通过AT+BVRA命令使能或关闭AG的语音识别功能,此特性可以实现语音拨号

O

O

16

Attach a Phone number to a voice tag

关联电话号码附和语音标签,此特性可以将特定的语音与号码关联到一起,当识别到语音标签后,可以获取到与其关联的号码并发起去电

O

O

17

Ability to transmit DTMF codes

传输DTMF码能力,DTMF可用于对电话按键的编码与解码,HF通过次特性可以实现一些特殊的功能,比如接通10086后通过按键选择查询话费或人工服务等

O

M

18

Remote audio volume control

音量遥控,此特性可以使得HF设置AG的speaker与microphone的音量,也可将HF speaker与microphone的音量同步到AG

O

O

19

Respond and Hold

响应与保持,包括查询响应与保持状态、从HF将来电挂起、从AG将来电挂起、从HF接听已挂起的来电、从AG接听已挂起的来电、从HF拒接已挂起的来电、从AG拒接已挂起的来电、已挂起的来电远端挂断(这些功能受限与PDC与CDMA)

O

O

20

Subscriber Number Information

订户号码信息(获取本机号码,但是不是所有号码都能获取,与运营商有关)

O

M

21a

Enhanced Call Status

增强型呼叫状态,HF可通过AT+CLCC命令查询AG当前的通话信息,AG通过+CLCC返回当前通话的信息,如果存在多路通话,AG会返回多个+CLCC

O

M

21b

Enhanced Call Controls

增强型呼叫控制,增强型呼叫控制机制只是当前 AT+CHLD 命令的扩展。 这些扩展被定义为 AT+CHLD 命令的附加参数。 此命令的新参数包括特定调用的索引,如 +CLCC 响应中所示

O

O

22

Individual Indicator Activation

私有指示器激活,HF通过AT+BIA命令来使能或停用AG的指示器

O

M

23

Wide Band Speech

宽带通话(建立的是esco,项目初期必须确认的,有的芯片支持,有的不支持)

O

O

24

Codec Negotiation

Codec协商,主要协商Codec的采样频率

O

O

25

HF Indicators

HF指示器,此特性允许HF将自身的某些指示器的值通知给AG,比如手表作为HF设备将电量告知手机,手机便可以显示手表的电量

O

O

 

三 、基本流程

3.1 HFP连接流程

HFP连接的建立需要ACL链路的建立,如果ACL链路不存在,需要先建立ACL链路。以下简要介绍下HFP连接建立的流程。

  1. 为SDP建立一条L2CAP链路,用于SDP连接与服务查询;
  2. 服务发现完成后,如果双方都支持HFP,就会建立HFP的RFCOMM连接,用于后续AT指令的交互;
  3. 建立SLC连接,进行特性交换、codec协商以及使能通话状态的更新;
  4. 建立音频连接,用于传输音频数据,这个过程可以在没有通话时发生,也可以在通话时发生。

3.2 SLC连接建立

SLC建立的过程主要是AG与HF就双方所支持的特性进行交换、codec协商以及通话指示器更新的使能。

如下为SLC连接建立的过程:

首先HF发送AT+BRSF=<HF supported features>,将自身所支持的特性告知给AG,AG使用+BRSF: <AG supported features>回复自身支持的特性给HF。

如果HF支持codec协商,HF会发送AT+BAC=<HF Available Codecs >给AG。

特性交换与codec协商完成后,HF会发送测试命令AT+CIND=?查询AG的所支持的Indicators以及它们的顺序,获得AG支持的Indicators后,HF发送AT+CIND?查询当前AG的Indicators的状态。之后HF发送AT+CMER去使能AG的Indicators状态的更新,这样当AG的Indicators有更新时,AG会发送对应的指令告知HF。

详情参考《HFP_v1.8》3.2章节。

 

3.3 通话状态指示器

通话状态的Indicators有service、call、callsetup、callehld、signal、roam以及battery,一般来说我们比较关心call、callsetup和callheld三种Indicator。下表为三种Indicator对应的值的解释。

Indicator

Value

description

Call

0

No calls

1

Call is present

Callsetup

0

No call setup in progress

1

Incoming call setup in progress

2

Outgoing call setup in dialing state

3

Outgoing call setup in alerting state

Callheld

0

No calls held

1

Call is placed on hold or active/held calls swapped

2

Call on hold, no active call

 当CMER指令使能AG的Indicatos的更新后,如果AG的通话状态发生变化,AG会发送CIEV<index, value>指令告知HF。例如来电时AG会发送CIEV<2,1>,2表示callsetup的序号,1表示callsetup的值,一般来说手机(以下手机可指代AG, 手表指代HF)上call的序号为1,callsetup的序号为2,callheld的序号为7。

3.4 音频连接

HF除了能够获取AG的通话状态,还需要与AG进行音频数据的交互,因此需要在HF和AG之间建立一条用于进行音频传输的链路。HF和AG可以根据用户动作或者内部事件建立音频连接,HF和AG也许需要内部动作来路由,更改采样率,帧/或者音频通路采样对齐。

音频连接可以由HF或AG发起,连接建立的过程在通话中建立,也可以在无通话时建立。音频连接建立过程总是意味着同步连接(Synchronous Connection)建立,并且同步连接和已经建立的SLC是相关的。该过程的一个先决条件是,AG和HF之间需要存在SLC,如果不存在则将会先建立这个连接。

当AG侧发起音频连接时,它将初始化编解码器连接建立过程:

 对于两边都支持编解码器协商特性的场景,由HF发起的建立音频连接将会触发AG确立编解码器连接。这是必须的,因为只有AG知道编解码格式。

 

3.5 来电

来电时如果SLC已建立完成,AG会发送CIEV<callsetup = 1>到告知HF有来电信息, 如果来电时SLC未建立,需要建立SLC,在SLC建立的过程中CIND指令交互时AG会在+CIND中携带通话的状态信息,此时不会发送CIEV<callsetup = 1>的指令。

 

3.5.1手表接听来电

来电时手表通过向手机发送ATA指令接听来电,收回返回OK表示接听成功,之后更新call的状态为1,表示电话处于active状态,callsetup的状态为0,表示通话建立过程结束。

 

3.5.2 手机接听来电

手机接听来电后同样会更新call的状态与callsetup的状态。

 

3.5.3 手表拒接来电

来电时手表通过发送AT+CHUP指令告知手机挂断来电,手机返回OK,同时更新callsetup的状态。

 

3.5.4 手机拒接来电

手机拒接来电也会更新callsetup的状态告知手表。

 

3.6 去电

3.6.1 手表去电

手表使用ATD指令发起去电,手机会将call与callsetup的状态更新到手表,如果是正在拨号的状态,手机返回CIEV<2, 2>,对端已振铃时,手机返回CIEV<2, 3>,对端接听后手机返回CIEV<1, 1>与CIEV<2, 0>。

 

3.6.2手机去电

手机去电没有ATD指令的交互,后续过程同手表去电。

 

3.7 挂断

3.7.1 手表挂断

手表通过发送AT+CHUP指令挂断正在通话的电话,手机收到AT+CHUP指令后,返回OK,挂断当前电话,然后发送CIEV<1, 0>给手表。

 

3.7.2手机挂断

手机挂断电话后发送CIEV<1,0>给手表。

 

3.8 三方通话

3.8.1 三方来电

如果手机支持三方来电呼叫等待,在三方来电时,手机会先发送ccwa指令,再发送CIEV<2, 1>指令。

 3.8.2 三方来电手表接听

 3.8.3 三方来电手机接听

 手机接听后,对于CIEV<7, 2>指令,协议中没有作出规定要不要发,在实际测试过程中,有的手机会发送CIEV<7, 2>, 有的则不会。

3.8.4 三方来电拒接

 

四、总结

本文仅介绍了通话的一些基本流程,都是些入门的东西,想要更深入地了解蓝牙通话还需要多看协议以及实践应用。

举报

相关推荐

0 条评论