【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

在蓝牙电话的数据传输中使用的是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代表可选)

NumfunctionHFAGNumfunctionHFAG
1连接管理MM14噪声抑制回声消除OO
2电话状态信息MM15语音识别OO
3音频连接处理MM16号码绑定语音标签OO
4接收语音来电MM17传输多音频能力OM
5拒绝语音来电MO18远程音量控制OO
6中断电话MM19回复和保持OO
7通话中音频链路切换MM20描述号码信息OM
8免提设备拨号OM21a扩展电话状态OM
9历史列表拨号OM21b扩展电话控制OO
10拨打最后一个电话OM22特有指示OM
11拨号等待通知OM23宽频语音OO
12三方通话OO24编解码器协商OO
13CLI(呼叫线路识别)OM25手持设备指示器OO

3. 通话过程协议分析

上述过程中,描述的都是在非通话状态下的 AT+ 指令的状态信息,接下来我们对通话状态过程中涉及到的AT指令状态信息进行描述;

3.1 接听电话 - AG

        从AG端接听Incoming call的流程比较简单,其中包括了几个动作:来电、响铃和接听,AG只是会通过+CIEV、RING和AT+CLCC等指令进行交互,其中通过+CIEV指令更新callsetup和call状态;

3.1.1 来电

 +CIEV

Bluetooth HFP Profile[Role: AG - Audio Gate (1)]AT Stream: \r\n+CIEV: 2,1\r\nCommand 0: +CIEVCommand: +CIEV (Indicator Events Reporting)Type: Response (0x003a)ParametersIndicator Index: 2Indicator 2: 1
  • Indicator Index = 2:对应了AT+CIND指令的Indicator,index = 2对应的是callsetup;
  • Indicator 2 = 1:对应了callsetup的1,意为正在呼叫中,但是不区分是outgoing还是incoming;

+AT+CLCC 

Bluetooth HFP Profile[Role: HS - Headset (2)]AT Stream: AT+CLCC\rCommand 0: +CLCCCommand Line Prefix: ATCommand: +CLCC (Current Calls)Type: Action Command (0x000d)Parameters: No
Bluetooth HFP Profile[Role: AG - Audio Gate (1)]AT Stream: \r\n+CLCC: 1,1,4,0,0,"18717895345",129\r\nCommand 0: +CLCCCommand: +CLCC (Current Calls)Type: Response (0x003a)ParametersID: 1Direction: Mobile Terminated (1)State: Incoming (4)Mode: Voice (0)Mpty: Call is not one of multiparty (conference) call parties (0)Number: "18717895345"Type: The phone number format may be a national or international format, and may contain prefix and/or escape digits. No changes on the number presentation are required. (129)
  • ID = 1:当前电话是第几路,从 1 开始计数;
  • Direction:电话方向,0代表往外拨打的电话outgoing;1代表来电incoming;
  • State:电话状态,当前状态为4,意为incoming;
  • Mode:电话模式,当前模式为0,意为voice;
  • Mpty:是否为多方通话的电话,0代表当前为非多方通话状态;
  • Number:来电号码
  • Type:可选项,电话类型,129代表了国内号码;
3.1.2 选择编解码器

选择编解码器逻辑基本上和拨号逻辑类同;

 +BCS & AT+BCS

Bluetooth HFP Profile[Role: AG - Audio Gate (1)]AT Stream: \r\n+BCS: 2\r\nCommand 0: +BCSCommand: +BCS (Bluetooth Codec Selection)Type: Response (0x003a)ParametersCodec: mSBC (2)

当前选用的编解码器为mSBC,AT+BAC指令用于获取蓝牙可用编解码器,而对应的AT+BCS指令用于指定使用哪种编解码器;

Bluetooth HFP Profile[Role: HS - Headset (2)]AT Stream: AT+BCS=2\rCommand 0: +BCSCommand Line Prefix: ATCommand: +BCS (Bluetooth Codec Selection)Type: Action Command (0x003d)ParametersCodec: mSBC (2)

然后返回对应的OK Response;

 同步连接请求

3.1.3 响铃

RING 

Frame 501: 21 bytes on wire (168 bits), 21 bytes captured (168 bits)
Bluetooth[Source: HuaweiDe_42:c7:dd (30:aa:e4:42:c7:dd)][Destination: BarrotTe_50:67:20 (04:7f:0e:50:67:20)]
Bluetooth HCI H4
Bluetooth HCI ACL Packet
Bluetooth L2CAP Protocol
Bluetooth RFCOMM Protocol
Bluetooth HFP Profile[Role: AG - Audio Gate (1)]AT Stream: \r\nRING\r\nCommand 0: RINGCommand: RING (Incoming Call Indication)Type: Response (0x0d0a)Parameters: No

 AT+CLIP & +CLIP

一般情况下,AT+CLIP指令和+CLIP指令不会出现,即AT+CLIP指令的Response不是+CLIP;

AT+CLIP指令,标准呼叫线路识别通知激活AT命令,它启用/禁用呼叫线路识别通知主动结果代码 +CLIP;

该指令的执行时间一般是在ProfileService启动阶段就设置好了;

…………………………
Bluetooth HFP Profile[Role: HS - Headset (2)]AT Stream: AT+CLIP=1\rCommand 0: +CLIPCommand Line Prefix: ATCommand: +CLIP (Calling Line Identification Notification)Type: Action Command (0x003d)ParametersMode: Enabled (1)
  • Mode:Enabled (1),启用呼叫线路识别通知激活,0代表禁用;

对应的Response为OK;

呼叫线路识别通知激活之后,就可以等待incoming;

Bluetooth HFP Profile[Role: AG - Audio Gate (1)]AT Stream: \r\n+CLIP: "18717895345",129\r\nCommand 0: +CLIPCommand: +CLIP (Calling Line Identification Notification)Type: Response (0x003a)ParametersNumber: "1871789xxxx"Type: The phone number format may be a national or international format, and may contain prefix and/or escape digits. No changes on the number presentation are required. (129)
  • Number:来电号码;
  • Type = 129:国内号码;

AT+CLCC & +CLCC

Bluetooth HFP Profile[Role: HS - Headset (2)]AT Stream: AT+CLCC\rCommand 0: +CLCCCommand Line Prefix: ATCommand: +CLCC (Current Calls)Type: Action Command (0x000d)Parameters: No
Bluetooth HFP Profile[Role: AG - Audio Gate (1)]AT Stream: \r\n+CLCC: 1,1,4,0,0,"18717895345",129\r\nCommand 0: +CLCCCommand: +CLCC (Current Calls)Type: Response (0x003a)ParametersID: 1Direction: Mobile Terminated (1)State: Incoming (4)Mode: Voice (0)Mpty: Call is not one of multiparty (conference) call parties (0)Number: "1871789xxxx"Type: The phone number format may be a national or international format, and may contain prefix and/or escape digits. No changes on the number presentation are required. (129)
  • ID = 1:路线1;
  • Direction = 1:来电;
  • State = 4:来电状态;
  • Mode = 0:voice;
  • Mpty = 0:非多方通话;
  • Number = 1871789xxxx:来电号码;
  • Type = 129:国内号码;

然后 AT+CLCC & +CLCC指令组合会一直响应,在响铃阶段和通话阶段都会响应,只是响应的状态值不一样;

然后返回对应的Response为OK;

3.1.4 接听

+CIEV: 1,1 

Bluetooth HFP Profile[Role: AG - Audio Gate (1)]AT Stream: \r\n+CIEV: 1,1\r\nCommand 0: +CIEVCommand: +CIEV (Indicator Events Reporting)Type: Response (0x003a)ParametersIndicator Index: 1Indicator 1: 1
  • call = 1:代表了至少有一个电话在进行中,call 状态从 0 -> 1,代表了从未接通状态到接通状态的变化;

 +CIEV: 2,0

Bluetooth HFP Profile[Role: AG - Audio Gate (1)]AT Stream: \r\n+CIEV: 2,0\r\nCommand 0: +CIEVCommand: +CIEV (Indicator Events Reporting)Type: Response (0x003a)ParametersIndicator Index: 2Indicator 2: 0
  • callsetup = 0:代表了当前没在呼叫中,callsetup 状态从 1 -> 0,代表了从呼叫状态到结束呼叫状态的变化;

3.1.5 通话中

 AT+CLCC & +CLCC

HF侧向AG侧发送 Action Command 类型的 AT+CLCC 指令,请求列出当前的呼叫状态信息;

Bluetooth HFP Profile[Role: AG - Audio Gate (1)]AT Stream: \r\n+CLCC: 1,1,0,0,0,"18717895345",129\r\nCommand 0: +CLCCCommand: +CLCC (Current Calls)Type: Response (0x003a)ParametersID: 1Direction: Mobile Terminated (1)State: Active (0)Mode: Voice (0)Mpty: Call is not one of multiparty (conference) call parties (0)Number: "1871789xxxx"Type: The phone number format may be a national or international format, and may contain prefix and/or escape digits. No changes on the number presentation are required. (129)
  • ID = 1:路线1;
  • Direction = 1:来电;
  • State = 0:活跃状态,即通话中;
  • Mode = 0:voice;
  • Mpty = 0:非多方通话;
  • Number = 1871789xxxx:来电号码;
  • Type = 129:国内号码;

而该指令的响应直到通话结束之后,才会停止响应;

3.2 接听电话 - HF

和拨打阶段类似,在HF响应操作的时候,对应ATD多了一个ATA的指令操作,该指令为标准呼叫应答命令,用于HF侧告知AG侧接电话;

3.2.1 接听

ATA 

Bluetooth HFP Profile[Role: HS - Headset (2)]AT Stream: ATA\rCommand 0: ACommand Line Prefix: ATCommand: A (Call Answer)Type: Action Command (0x000d)Parameters: No

  • Command:A,CAll Answer,电话应答指令;

然后返回对应的OK Response;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/768708.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL详解

本笔记源于【狂神说Java】 B站收UP主:遇见狂神说。即可看见教程 或者点击链接MySQL最新教程 目录 1、初始MySQL 1.1、数据库简介 1.2、数据库管理系统 1.3、MySQL简介及安装 1.4、SQLyog 2、操作数据库 2.1、操作数据库(了解) 2.2、数…

WM8978 —— 带扬声器驱动程序的立体声编解码器(2)

接前一篇文章:WM8978 —— 带扬声器驱动程序的立体声编解码器(1) 六、引脚详细说明 引脚(PIN)名称(NAME)类型(TYPE)描述(DESCRIPTION)1LIP模拟输入…

006、Dynamo Python 之Revit元素类别

今天我们来聊聊 Revit 元素这点事,不仅仅是在 Dynamo Python 之中涉及,我们在日常使用 Revit 的时候,也涉及这个问题,只是对我们日常画图没什么影响,所以很多人并没太在意这块。 Revit Elements 分为六个组&#xff1a…

Redis实战篇-4

实战篇Redis 1.3 、实现发送短信验证码功能 页面流程 具体代码如下 贴心小提示: 具体逻辑上文已经分析,我们仅仅只需要按照提示的逻辑写出代码即可。 发送验证码 Overridepublic Result sendCode(String phone, HttpSession session) {// 1.校验手机…

算法打卡day15

今日任务: 1)110.平衡二叉树 2)257. 二叉树的所有路径 3)404.左叶子之和 110.平衡二叉树 题目链接:110. 平衡二叉树 - 力扣(LeetCode) 给定一个二叉树,判断它是否是高度平衡的二叉树…

基于大数据的空气质量预测和可视化分析

城市空气质量数据采集系统设计与实现 🏙️ 研究背景 🌬️ 城市化与环境挑战:随着城市化进程的加快,环境污染问题,尤其是空气质量问题,已成为公众关注的焦点。数据监测的重要性:城市空气质量数…

控价其实是对品牌市场的保护

品牌发展过程中,如果有越来越多的经销商加入,必然要做好控价,否则渠道的混乱,会使得品牌价值受损,比如低价的出现,会影响正规经销商的出货,使其竞争力增加,同时价格的不稳定会连带产…

小游戏-扫雷

扫雷大多人都不陌生,是一个益智类的小游戏,那么我们能否用c语言来编写呢, 我们先来分析一下扫雷的运行逻辑, 首先,用户在进来时需要我们给与一个菜单,以供用户选择, 然后我们来完善一下&#…

Vue 实现带拖动功能的时间轴

1.效果图 2. 当使用timeline-slider-vue组件时,你可以设置以下属性: date:用于设置时间轴滑块的初始日期,格式通常为 YYYY-MM-DD。 mask:一个布尔值,用于控制是否显示背景遮罩。 markDate:一…

Java 面试宝典:什么是大 key 问题?如何解决?

大家好,我是大明哥,一个专注「死磕 Java」系列创作的硬核程序员。 本文已收录到我的技术网站:https://skjava.com。有全网最优质的系列文章、Java 全栈技术文档以及大厂完整面经 回答 Redis 大 key 问题是指某个 key 对应的 value 值很大&am…

C语言——sizeof与strlen的对比

一.sizeof 我们在学习操作符的时候&#xff0c;就了解到了sizeof操作符&#xff0c;它的作用是求参数所占内存空间的大小&#xff0c;单位是字节。如果参数是一个类型&#xff0c;那就返回参数所占的字节数。 #include <stdio.h>int main() {int a 10;size_t b sizeo…

Mamba 基础讲解【SSM,LSSL,S4,S5,Mamba】

文章目录 Mamba的提出动机TransformerRNN Mama的提出背景状态空间模型 (The State Space Model, SSM)线性状态空间层 (Linear State-Space Layer, LSSL)结构化序列空间模型 &#xff08;Structured State Spaces for Sequences, S4&#xff09; Mamba的介绍Mamba的特性一&#…

美团2024届秋招笔试第二场编程真题

要么是以0开头 要么以1开头 选择最小的答案累加 import java.util.Scanner; import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和…

C# 右键快捷菜单(上下文菜单)的两种实现方式

在C#中&#xff0c;ContextMenuStrip是一种用于创建右键菜单的控件。它提供了一种方便的方式来为特定的控件或窗体添加自定义的上下文菜单选项。有两种实现方式&#xff0c;如下&#xff1a; 一.通过ContextMenuStrip控件实现 1.从工具箱中拖一个ContextMenuStrip控件到窗体上…

LLM - 大语言模型的分布式训练 概述

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/136924304 大语言模型的分布式训练是一个复杂的过程&#xff0c;涉及到将大规模的计算任务分散到多个计算节点上。这样做的目的是为了处…

领域、系统和组织-《实现领域驱动设计》中译本评点-第2章(4)

相关链接 DDD领域驱动设计批评文集>> 汪峰哭晕在厕所-《实现领域驱动设计》中译本评点-第2章&#xff08;1&#xff09; 可不是乱打的-《实现领域驱动设计》中译本评点-第2章&#xff08;2&#xff09; “领域”的错误定义-《实现领域驱动设计》中译本评点-第2章&…

Tomcat介绍,Tomcat服务部署

目录 一、Tomcat 介绍 二、Tomcat 核心技术和组件 2.1、Web 容器&#xff1a;完成 Web 服务器的功能 2.2、Servlet 容器&#xff0c;名字为 catalina&#xff0c;用于处理 Servlet 代码 2.3、JSP 容器&#xff1a;用于将 JSP 动态网页翻译成 Servlet 代码 Tomcat 功能组件…

Window全网解析网站下载视频

全网解析网站下载视频 介绍m3u8格式cbox格式 解析视频下载的方法方法一解析视频下载视频 方法二老王浏览器下载使用浏览器解析下载视频 总结 介绍 今天分享一下如何解析网页中的视频进行下载。通常情况下我们打开的某某网站的视频是不提供下载接口的&#xff0c;甚至说你下载了…

ClickHouse--11--物化视图

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.物化视图什么是物化视图? 1.1 普通视图1.2 物化视图1.3 优缺点1.4 基本语法1.5 在生产环境中创建物化视图1.6 AggregatingMergeTree 表引擎3.1 概念3.2 Aggregat…

面试算法-87-分隔链表

题目 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 示例 1&#xff1a; 输入&#xff1a;head [1,4,3,2,5,2], x …