【Android】【Bluetooth Stack】蓝牙电话协议分析(超详细)

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 >:可选项,电话类型

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-23 13:30:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-23 13:30:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-23 13:30:04       82 阅读
  4. Python语言-面向对象

    2024-03-23 13:30:04       91 阅读

热门阅读

  1. Android 静默安装二(无障碍服务版)

    2024-03-23 13:30:04       44 阅读
  2. Windows C++ 监听注册表是否发生变化

    2024-03-23 13:30:04       43 阅读
  3. ChatGPT助力写作:论文写作新利器

    2024-03-23 13:30:04       51 阅读
  4. 001-Windows下PyTorch极简开发环境配置(上)

    2024-03-23 13:30:04       43 阅读
  5. js知识总结

    2024-03-23 13:30:04       38 阅读
  6. 多目标优化算法帕累托前沿的指标

    2024-03-23 13:30:04       37 阅读
  7. 前端需要掌握的 mysql 基础知识

    2024-03-23 13:30:04       41 阅读
  8. 数据结构与算法:选择排序与快速排序

    2024-03-23 13:30:04       38 阅读
  9. Redis中的常用数据结构

    2024-03-23 13:30:04       40 阅读