1. 精讲蓝牙协议栈(Bluetooth Stack):SPP/A2DP/AVRCP/HFP/PBAP/IAP2/HID/MAP/OPP/PAN/GATTC/GATTS/HOGP等协议理论
2. 欢迎大家关注和订阅,【蓝牙协议栈】和【Android Bluetooth Stack】专栏会持续更新中.....敬请期待!
目录
1. 协议架构
1.1 Profile Dependencies
1.2 HFP Protocol Stack
2. HFP功能支持情况
3. AT 指令集
3.1 GSM 07.07 & 3GPP 27.077 重用的 AT 功能
3.2 蓝牙定义的 AT 功能
3.3 AT+CIND 相关 indicators及范围
3.4 AT+CLCC
1. 协议架构
1.1 Profile Dependencies
在蓝牙电话的数据传输中使用的是SCO协议(同步定向链接)。支持对时延敏感的信息如语音。
使用保留带宽进行同步通信,即两台设备在LMP层利用保留时隙在物理信道上周期传送数据包,这种类型的链接主要用于传送SCO包(语音数据)。SCO不包括CRC码,且不进行重传,主要支持传输有时间限制的信息,例如声音。
仅仅在ACL链接已经建立之后,才可以建立SCO链接;
-
AT CMD:AT指令是应用于终端设备和PC应用之间的连接与通信的指令;
-
SPP:蓝牙串口协议,在蓝牙设备之间建立虚拟的串口进行数据通信,简单的说就是两个蓝牙设备对端发送自定义数据;iPhone不支持SPP协议;
-
GAP:通用访问配置文件,该Profile保证不同的Bluetooth产品可以互相发现对方并建立连接;GAP定义了蓝牙设备如何发现和建立与其他设备的安全/不安全连接,它处理一些一般模式的业务(询问、命名和搜索)和一些安全性问题;GAP一般有4个作用:
- Profile Role
- 可发现模式和过程
- 连接模式和过程
- 安全模式和过程
-
eSCO:可以简单的理解为和SCO不同点:支持数据包的重传;
-
incoming call:由Phone Network到AG的通话,即称为来电;
-
outgoing call:由AG到Phone Network的通话,即称为拨号,去电;
1.2 HFP Protocol Stack
针对蓝牙电话,涉及到的协议有:HFP、RFCOMM;
目前HFP的使用场景常见的有车载蓝牙、耳机、PDA(Personal Digital Assistant - 掌上电脑,类似于智能手机、平板电脑、手持游戏机等),其中HFP协议中定义了AG和HFP两种角色:
- AG(Audio Gate):音频网关 - 音频设备输入输出网关;
- HF(Hands Free):免提 - 该设备作为音频网关的远程音频输入 / 输出机制,并可提供若干遥控功能;
在车载领域,手机侧为AG,车载侧为HF,在Android源码定义中,通常将AG称为HFP/AG,将HF称为HFPClient/HF;
2. HFP功能支持情况
(M代表强制支持,O代表可选)
Num | function | HF | AG | Num | function | HF | AG |
---|---|---|---|---|---|---|---|
1 | 连接管理 | M | M | 14 | 噪声抑制回声消除 | O | O |
2 | 电话状态信息 | M | M | 15 | 语音识别 | O | O |
3 | 音频连接处理 | M | M | 16 | 号码绑定语音标签 | O | O |
4 | 接收语音来电 | M | M | 17 | 传输多音频能力 | O | M |
5 | 拒绝语音来电 | M | O | 18 | 远程音量控制 | O | O |
6 | 中断电话 | M | M | 19 | 回复和保持 | O | O |
7 | 通话中音频链路切换 | M | M | 20 | 描述号码信息 | O | M |
8 | 免提设备拨号 | O | M | 21a | 扩展电话状态 | O | M |
9 | 历史列表拨号 | O | M | 21b | 扩展电话控制 | O | O |
10 | 拨打最后一个电话 | O | M | 22 | 特有指示 | O | M |
11 | 拨号等待通知 | O | M | 23 | 宽频语音 | O | O |
12 | 三方通话 | O | O | 24 | 编解码器协商 | O | O |
13 | CLI(呼叫线路识别) | O | M | 25 | 手持设备指示器 | O | O |
3. AT 指令集
3.1 GSM 07.07 & 3GPP 27.077 重用的 AT 功能
CMD | 发送方 | Syntax | Response | Name | Description |
---|---|---|---|---|---|
ATA | OK | 标准呼叫应答命令 | |||
ATDdd...dd | 车机 | OK | 标准AT命令,用于拨打电话号码 | 本规范仅包括语音通话 | |
ATD>nnn... | 车机 | OK | 标准ATD命令的扩展,用于内存拨号 | 本规范仅涉及语音通话 | |
ERROR | 标准错误指示代码 | ||||
OK | 对命令执行的标准确认 | ||||
NO CARRIER, BUSY, NO ANSWER, DELAYED, BLACKLISTED | AT命令的扩展响应指示代码 | 这些指令由AG向HF发送,作为对HF向AG发出的AT命令的响应,或从AG发出,作为未经请求的结果代码 | |||
RING | 标准来电指示 | ||||
AT+CCWA | 车机 | AT+CCWA=[[,[,]]] | +CCWA | 标准的呼叫等待通知AT命令 | 在该规范中,仅适用参数启动/禁用呼叫等待通知主动结果代码 |
+CCWA | 手机 | 标准“呼叫等待通知”主动结果代码 | 该规范中仅包含两个属性:number和type number:文本字符串,并应始终包含在双引号内 type:字段指定提供的电话号码的格式 | ||
AT+CHLD | 车机 | AT+CHLD= | 标准呼叫保持和多方处理AT命令 | 的取值范围: 0:释放所有保持的呼叫或将用户确定的用于忙(UDUB)设置为等待呼叫 1:释放所有活动呼叫(如果存在),并接收其他呼叫(保持或等待) 1:释放具有指定索引(索引值为值)的调用 2:保持所有活动呼叫(如果存在)并接受另一个(保持或等待)呼叫 2:使用指定呼叫()请求私人咨询模式。(将所有呼叫置于保持状态,指示的呼叫除外) 3:将保持的呼叫添加到对话中 4:连接两个呼叫并断开用于与两个呼叫的连接(显式呼叫转移)。 | |
AT+CHUP | 车机 | 标准挂起AT命令 | 执行命令使AG终止当前活动的调用 | ||
AT+CIND | 车机 | AT+CIND=?:获取对方特性支持情况 AT+CIND?:获取对方特性值 | +CIND | 标准指示更新AT命令 | |
+CIND | 手机 | 当前电话指示器的标准列表 | |||
AT+CLCC | 车机 | OK | 标准列表当前呼叫命令 | ||
+CLCC | 手机 | OK | 标准列表当前调用结果代码 | ||
AT+COPS | 车机 | +COPS:,, | 用于读取网络运营商信息 | :包含当前模式并且不提供有关操作员名称的信息 :指定参数字符串的格式,在本规范中应始终为0 :以字母数据格式指定带引号的字符串,表示网络运营商的名称。该字符串不得超过16个字符 | |
AT+CMEE | 车机 | 标准AT命令用于启用 | |||
+CME ERROR | +CME ERROR: | 扩展音频网关错误结果代码响应 | 使用结果代码+CME ERROR:作为与AG功能相关的错误的指示 | ||
AT+CLIP | 车机 | AT+CLIP= | +CLIP | 标准呼叫线路识别通知激活AT命令 | 它启用/禁用呼叫线路识别通知主动结果代码 +CLIP |
+CLIP | 手机 | +CLIP: , type> [,, [,[] [,]]] | 标准呼叫线路识别通知主动结果代码 | :参数应为文本字符串,并应始终包含在双引号内 :字段指定提供的电话号码的格式 | |
AT+CMER | 车机 | AT+CMER=[[,[,[, [,]]]]] | OK | 标准事件报告激活/停用AT命令 | :该参数一般情况下value = 3 :分为两种情况:0代表禁用,1代表激活 |
+CIEV | 手机 | +CIEV: , | 标准的指标事件报告主动结果代码 | :AT+CIND=?命令。列表的第一个元素应具有=1 :指标的当前状态 | |
AT+VTS | 车机 | AT+VTS= | 标准DTMF生成AT命令 | ||
AT+CNUM | 车机 | AT+CNUM AT+CNUM=? | +CNUM | 检索用户号码信息 测试用户号码信息 - 未实施 | HF为AG中的“用户号码信息”功能发出的命令。仅使用AT+CNUM格式的动作命令 |
+CNUM | 手机 | +CNUM: [],, ,[ ,] | 将“订户号码信息”从AG发送到HF的标准响应 | :不支持此可选字段,应留空 :包含电话号码的引用字符串,格式由指定 :字段指定提供的电话号码的格式 :不支持此可选字段,应留空 :表示此电话号码与哪个服务相关,4代表语音,5代表传真 |
3.2 蓝牙定义的 AT 功能
CMD | 发送方 | Syntax | Response | Desc | |
---|---|---|---|---|---|
AT+BIA | 车机 | AT+BIA=[<indrep 1>[,…[,[]]]]]] | 蓝牙指示激活,单独激活或停用指示器 | :代表了指标x的状态,1代表激活,0代表禁用 | |
AT+BINP | 车机 | AT+BINP= | +BINP: … | 蓝牙输入,用于从AG请求某些特定数据输入的命令 | 收到此命令后,AG应执行适当的操作,以便使用+BINP响应将请求的信息发送回HF :数据请求,其中value = 1对应于HF中记录的最后一个语音标签的电话号码 :AG返回的数据参数。该参数内容取决于,一般情况下为Phone number |
AT+BLDN | 车机 | AT+BLDN | 蓝牙最后拨打的号码 | 用于呼叫最后拨打的电话号码。收到此命令后,AG应建立对最后拨打的电话号码的语音呼叫。 | |
AT+BVRA | 车机 | AT+BVRA= | +BVRA | 蓝牙语音识别激活 | 启用/禁用AG中的语音识别功能,如果支持增强语音识别状态功能,则此命令用于向AG指示HF已准备号呈现音频输出 :0代表了在AG中禁用语音识别,1代表在AG中启用语音识别,2代表仅当AG和HF都支持增强语音识别状态功能时才应使用该值 |
+BVRA | 手机 | +BVRA: , | 蓝牙语音识别激活 | 当AG中的语音识别功能由AG自主激活/停用时,用于通知HF的非请求结果代码 :0代表了在AG中禁用语音识别,1代表在AG中启用语音识别 :反映AG上语音识别引擎当前状态的位掩码 :仅当AG和HF都支持语音识别文本功能,才会出现 | |
AT+BRSF | 车机 | AT+BRSF= | +BRSF | 蓝牙检索支持的功能 | 通知AG HF中可用的支持功能,并请求有关AG中支持的功能的信息。支持的特性应以十进制值表示 0:EC / NR 功能 1:三方通话 2:CLI演示功能 3:语音识别激活 4:远程音量控制 5:增强的通话状态 6:增强的呼叫控制 7:编解码器协商 8:HF 指标 9:支持的eSCO S4 设置 10:增强的语音识别状态 11:语音识别文本 12-31:留作将来使用 |
+BRSF | 手机 | +BRSF: | 蓝牙检索支持的功能 | AG响应AT+BRSF命令发送的结果码,用于通知HF AG支持哪些功能。支持的特性应以十进制值表示 0:三方通话 1:EC / NR 功能 2:语音识别功能 3:带内铃声功能 4:将号码附加到语音标签 5:拒绝来电的功能 6:增强的通话状态 7:增强的呼叫控制 8:扩展错误结果代码 9:编解码器协商 10:HF 指标 11:支持的 eSCO S4 设置 12:增强的语音识别状态 13:语音识别文本 14-31:留作将来使用 | |
AT+NREC | 车机 | AT+NREC= | 降噪和回声消除 | 发出命令以禁用嵌入AG中的任何回声消除和降噪功能 :0代表了在AG中禁用 EC / NR | |
AT+VGM | 车机 | AT+VGM= | +VGM= | 麦克风增益 | HF发出的命令,用于向AG报告其当前的麦克风增益级别设置 :是一个十进制数字,与由HF控制的特定(取决于实现)音量级别有关。该命令不会改变AG的麦克风增益,它仅指示HF中麦克风增益的当前值,取值范围:0~15 |
AT+VGS | 车机 | AT+VGS= | +VGS= | 扬声器增益 | HF发出的命令,用于向AG报告其当前的扬声器增益水平设置 :是一个十进制数字,与由HF控制的特定(取决于实现)音量级别有关。该命令不会改变AG的扬声器增益,它仅指示HF中麦克风增益的当前值,取值范围:0~15 |
+VGM | 手机 | +VGM= | 麦克风增益 | 由AG主动发出的结果代码,用于设置HF的麦克风增益。 | |
+VGS | 手机 | +VGS= | 扬声器增益 | 由AG主动发出的结果代码,用于设置HF的扬声器增益 | |
+BSIR | 手机 | +BSIR: | 带内铃声的蓝牙设置 | 由AG发出的主动结果代码,用于向HF指示带内铃声设置已在本地更改。HF可以通过改变自己的警报方法作出响应的反应 :0代表了AG不提供带内铃声,1代表AG提供带内铃声 | |
AT+BTRH | 车机 | AT+BTRH=:设置指令 AT+BTRH?:读取当前状态 | +BTRH | 蓝牙响应和保持功能 | HF为AG中的“响应和保持”功能发出的命令。本规范定义了set和read命令的使用,AT+BTRH ? HF应使用命令来查询 AG 的当前“响应和保持”状态 :0代表保留来电,1代表接受保持的来电,2代表拒绝保持的来电 |
+BTRH | 手机 | +BTRH= | 蓝牙响应和保持功能 | 每当来电被搁置或接受或拒绝时,用于通知HF的结果代码。对于AT+BTRH,AG是否也应回复此响应 ? 来自 HF 的命令 :0代表了来电在 AG中保持,1代表了在AG中接受保持的来电,2代表了在AG中拒绝保持的来电 | |
AT+BCC | 车机 | AT+BCC | 蓝牙编解码连接 | HF使用该命令请求AG启动编解码器连接过程 | |
AT+BCS | 车机 | AT+BCS= | 蓝牙编解码器选择 | 此命令向远程设备(AG)确认编解码器,并隐含地确认将在同步连接上使用哪个同步协议,如果不包含任何值,则该命令无效 :所有可能的Codec ID,将AT+BAC的定义 | |
+BCS | 手机 | +BCS: | 蓝牙编解码器选择 | 该命令将编解码器通知给远程设备(HF),并隐含地通知将在同步连接上使用哪种同步协议 :所有可能的Codec ID,将AT+BAC的定义 | |
AT+BAC | 车机 | AT+BAC= [[,[,...[,]]]] (u1,u2, ..., un are a codec IDs) | OK | 蓝牙可用编解码器 | 此命令通知远程设备(AG)HF支持哪些编解码器 :所有可能的Codec ID,将AT+BAC的定义 |
AT+BIND | 车机 | AT+BIND= ,,,...,:列出HF支持的指标 AT+BIND=?:阅读AG支持的指标 AT+BIND?:读取指示的AG启用/禁用状态 | +BIND | 蓝牙HF指示功能 | 该命令使HF能够通知AG支持哪些HF到AG指示符。指示器可以启用或禁用。除非“HF 指示器”功能的 AG 和 HF BRSF 位都设置为1,否则不应使用AT+BIND命令 ...:0-65535,作为十进制无符号整数值输入,不带前导零,引用 HF 指示器分配的编号。 |
+BIND | 手机 | +BIND: (,,,...,):响应AT+BIND=? +BIND: ,:主动或响应AT+BIND? | 蓝牙HF指示功能 | 该响应使AG能够通知HF支持哪些HF指示器及其状态,启用或禁用。 除非“HF 指示器”功能的AG和HF BRSF为都设置为1,否则不应使用+BIND响应 ...:0-65535,作为十进制无符号整数值输入,不带前导零,引用 HF 指示器分配的编号。 :0 - 1,其中0代表了指示器被禁用,不应为此指示器发送值更改,1代表了指示器已启用,可以为该指示器发送值更改 | |
AT+BIEV | 车机 | AT+BIEV= , | 蓝牙HF指示功能 | 此命令使HF能够将启用的HF指示器的更新值发送到AG |
3.3 AT+CIND 相关 indicators及范围
indicator | index | index 范围 | Desc |
---|---|---|---|
call:Call Status indicator | 1 | 0 1 | there are no calls in progress — 没有电话在进行中 at least one call is in progress — 至少有一个电话在进行中 |
callsetup:Call set up status indicator | 2 | 0 1 2 3 | not currently in call set up — 当前没在呼叫中设置 an incoming call process ongoing — 来电进行中 an outgoing call set up is ongoing — 正在设置一个传出呼叫 remote party being alerted in an outgoing call — 呼叫的对方正在响铃 |
service:Service availability indication | 3 | 0 1 | No Home/Roam network available — 没有信号 Home/Roam network available — 有信号服务 |
signal:Signal Strength indicator | 4 | 0~5 | 电话信号质量 |
roam:Roaming Status indicator | 5 | 0 1 | roaming is not active — 没有漫游 a roaming is active — 漫游中 |
battchg:Battery Charge indicator of AG | 6 | 0~5 | AG侧的电量值 |
callheld:Call hold status indicator | 7 | 0 1 2 | No calls held Call is placed on hold or active/held calls swapped(The AG has both an active AND a held call) — 电话被设置为保持或者电话切换中 Call on hold, no active call — 电话保持中,没有电话处于通话中 |
3.4 AT+CLCC
HF请求当前的电话信息列表,构造格式:+CLCC: < idx >,< dir >,< status >,< mode >,< mpty >,< number >,< type >,AG侧回复当前的电话信息列表。如果当前没有电话,AG侧也需回复OK指令,不然将电话信息以列表形式发送给HF;
-
< idx >:当前电话是第几路,从 1 开始计数
-
< dir >:电话方向,0代表往外拨打的电话outgoing;1代表来电incoming;
-
< status >:电话状态
- 0:Active
- 1:Held
- 2:Dialing(outgoing calls only)
- 3:Alerting(outgoing calls only)
- 4:Incoming(incoming calls only)
- 5:Waiting(incoming calls only)
- 6:Call held by Response and Hold
-
< mode >:电话模式
- 0:voice
- 1:data
- 2:FAX
-
< mpty >:是否为多方通话的电话
- 0:this call is NOT a member of a multi-party(conference)call
- 1:this call is a member of a multi-party(conference)call
-
< number >:可选项,电话号码
-
< type >:可选项,电话类型