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连接建立的流程。
- 为SDP建立一条L2CAP链路,用于SDP连接与服务查询;
- 服务发现完成后,如果双方都支持HFP,就会建立HFP的RFCOMM连接,用于后续AT指令的交互;
- 建立SLC连接,进行特性交换、codec协商以及使能通话状态的更新;
- 建立音频连接,用于传输音频数据,这个过程可以在没有通话时发生,也可以在通话时发生。
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 三方来电拒接
四、总结
本文仅介绍了通话的一些基本流程,都是些入门的东西,想要更深入地了解蓝牙通话还需要多看协议以及实践应用。