经典蓝牙连接过程

news2024/10/6 12:35:45

ACL是连接基础,sco需要再ACL连接成功后建立连接。基本链接流程如下:

 

一、创建连接

从用户点击扫描到的蓝牙设备开始,发起连接的设备会发送create_connection给controller。controller会进行page过程。

 而后会底层链接完成,这个完成仅仅是确认两边连接请求的一次交换。

二、Feature交换

 连接完成后,进行两端的物理层功能交换。确定能力一致性。中间也会针对物理层策略进行配置:Master/slave switch; hold mode; sniffer mode ;Remote name、remote version等。

 

三、配对 

最早的配对是采用输入pin码的形式,但是手机上大多是采用simple pair的方法.对于非首次连接的设备,配对的过程,所谓交换安全密钥的过程就不再必要,可以直接跳过。

 

 simple pair

 

 这里发送的user confirmation也代表首次链接时,用户点击accpet对话框的一个标志。

 Simple pair以发起认证,link key互换,IO信息交换,用户点击接受连接位置,代表simple pair完成。

四、Profile连接

说明几个主要profile的连接过程。对于手机而言,蓝牙连接成功标志为配对后某个profile连接完成,即便后续几个profile还在连接中。代码如下:CachedBluetoothDevice.java

    public boolean isConnected() {
        synchronized (mProfileLock) {
            for (LocalBluetoothProfile profile : mProfiles) {
                int status = getProfileConnectionState(profile);
                if (status == BluetoothProfile.STATE_CONNECTED) {
                    return true;
                }
            }

            return false;
        }
    }
  • HFP

HFP连接首先进行SDP服务发现过程,分配逻辑信道后开启连接。由于HFP基于Rfcomm实现,所以需要先行建立rfcomm连接.

 Rfcomm连接开启先基于sdp申请的CID在L2CAP进行连接和信息交换。

 由于Rfcomm不止围绕HFP一个profile服务(还有opp等),在rfcomm完成后,还需要进行HFP连接,这其中的部分连接过程如下所示:

 基于音频基础理论,两端是被进行音频传输前,需要统一支持的编码格式,采样率,控制语义等,在HFP中进行了这些信息的交换。

  • A2DP/AVRCP

A2DP作为重要的profile,基于的协议为AVDTP。在SDP发现后,同样进行L2CAP的连接后,才能进行上层profile的连接。

 同样需要进行音频信息的交换,HFP的音频参数不能和A2DP复用并且基于profile的独立规则,需要再进行一次音频信息交换.个人理解,HFP主要保证音频传输稳定性,A2DP则需要提升音频细节,需要采用不同的编码和采样率。

 

 

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

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

相关文章

CSS初级教程【第四天】

CSS初级教程【第四天】【1】CSS 外边距【2】CSS 外边距合并【3】所有 CSS 外边距属性【4】CSS 内边距【5】内边距和元素宽度【6】所有 CSS 内边距属性【7】CSS 高度和宽度【8】设置 CSS 尺寸属性CSS上回学习链接 CSS初级教程【第一天】 CSS初级教程【第二天】 CSS初级教程【第三…

windows本地安装openjdk环境

1讲一下为什么要选openjdk 先讲一下为什么小编在这里选择openjdk,而不是像绝大多数人一样选择jdk。那是因为,jdk在1.8的某个版本之后,就不是免费的版本了,不能免费用于商用。有过工作经验的就知道,公司一般对电脑上安装…

掌握这17张图,没人比你更懂RecyclerView的预加载

回顾上一篇文章,我们为了减少描述问题的维度,于演示之前附加了许多限制条件,比如禁用了RecyclerView的预拉取机制。 实际上,预拉取(prefetch)机制作为RecyclerView的重要特性之一,常常与缓存复用机制一起配合使用、共…

Go语言设计与实现 -- Mutex源码剖析

上图来自面向信仰编程 上图中,第一列为常见的同步原语,第二列为容器,第三列为互斥锁。 接下来我们来逐一介绍一下: Mutex 我们先来看一下sync.Mutex的结构体: type Mutex struct {// 当前互斥锁的状态state int32…

代码随想录算法训练营第一天 java : 704.二分查找法、27.移除算法

文章目录Leecode 704.二分查找题目连接:[Leecode 704.二分查找](https://leetcode.cn/problems/remove-element/)遇到的问题题目二分法的第一种写法 (左闭右闭)第二种解法(左闭右开 代码呈现)Leecode 27.移除元素题目链接&#xf…

MyBatis【创建与使用】

MyBatis【创建与使用】🍎一. MyBatis🍒1.1. MyBatis 是什么?🍒1.2 没有使用MyBatis时的操作流程🍒1.3 MyBatis的操作与数据库之间的流程🍎二.创建MyBatis项目🍒2.1 idea创建🍒2.2 配…

【Git】一文带你入门Git分布式版本控制系统(撤销修改、删除文件)

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,也会涉及到服务端 📃个人状态: 在校大学生一枚,已拿多个前端 offer(秋招) 🚀未…

Debezium故障演练

1、搭建演练环境 postgresql及wal2json插件安装:https://blog.csdn.net/li281037846/article/details/128411222 kafka及kafka-connect安装,略 //添加debezium connector curl -i -X POST -H "Content-Type:application/json" -H "Accepted:applic…

Qt样式(qss)使用小结(软件换肤,比如暗黑模式)

1.背景: Qt style sheet(qss)跟前端技术一样,就是为了美化界面。关键是,太好用了。之前还为此写过一篇博客。 Qt样式(qss)手册小结_大橘的博客-CSDN博客 其中主要是记录如何获取手册细节。 …

6、GPIO输入按键检测(轮询检测)

目录 0x01、简介 0x02、硬件设计 0x03、编写函数 0x001、按键初始化 0x002、按键检测 0x003、按键led翻转 0x04、源程序下载地址 0x01、简介 本次实验主要实现按键控制LED灯。 由于机械按键在按下和抬起的时候会产生按键抖动,所以在设计的时候需要考虑如何消除抖…

Pytorch可视化特征图(代码 亲测可用)

2013年Zeiler和Fergus发表的《Visualizing and Understanding Convolutional Networks》 早期LeCun 1998年的文章《Gradient-Based Learning Applied to Document Recognition》中的一张图也非常精彩,个人觉得比Zeiler 2013年的文章更能给人以启发。从下图的F6特征&…

会议OA项目-首页

目录一、Flex布局简介什么是flex布局?flex属性学习地址:案例演示二、轮播图组件及mockjs三、会议OA小程序首页布局一、Flex布局简介 布局的传统解决方案,基于盒状模型,依赖 display属性 position属性 float属性 什么是flex布局…

简单有效的Mac内存清理方法,不用收藏也能记住

Mac电脑使用的时间越久,系统的运行就会变的越卡顿,这是Mac os会出现的正常现象,卡顿的原因主要是系统缓存文件占用了较多的磁盘空间,或者Mac的内存空间已满。如果你的Mac运行速度变慢,很有可能是因为磁盘内存被过度占用…

如何理解并记忆DataFrame中的Axis参数

当我们遇到有axis参数的方法时,脑子里的第一反应应该是:这个方法一定是沿着某一方向进行某种“聚合”或者“过滤”操作。在此场景下,Axis参数就是用来设定操作方向的:是垂直方向还是水平方向? axis0: 一行一行推进&…

【微服务架构实战】第1篇之API网关概述

1.网关概述 采用分布式、微服务的架构模式开发系统时,API 网关是整个系统中必不可少的一环。 1.1 没有网关会有什么问题? 在微服务架构模式下,1个系统会被拆分成多个微服务,如果每个微服务都直接暴露给调用方,会有以…

MySQL主键和唯一键的区别

主键和唯一键基本知识参考这篇文章 MySQL表的约束 ,本篇文章主要是谈一谈主键和唯一键的区别从而更好的理解唯一键和主键。 在上篇文章中已经提到 主键: primary key 用来唯一的约束该字段里面的数据,不能重复,不能为空&#x…

vue父页面调用子页面及方法及传参,鼠标光标定位

项目场景: vue父页面调用子页面及方法 问题描述 vue中父界面调用子界面及方法时界面可以调用,但是调用方法的时候第一次报错,但是关掉界面再次重新打开就没问题了 原因分析: 在我之前添加鼠标指针定位的时候,如果在…

记录scoped属性的使用和引发的问题

背景 在对表格数据进行样式处理时,通过业务逻辑判断,进行对符合要求的表格填充背景色,没有符合预期的效果。反复排查校验代码和判断逻辑,都没有什么问题,可能还是样式上出现问题。再通过F12 选取元素对表格设置背景色时…

获取树形结构中,父节点下所有子/孙节点(递归方式)

获取树形结构中,父节点下所有子/孙节点(递归方式)1 树形结构(TreeItem类)2 测试代码(main函数)3 运行效果1 树形结构(TreeItem类) 这里通用型树形结构为TreeItem类&…

初学Java web(七)RequestResponse

Request&Response Request:获取请求数据 Response:设置响应数据 一.Request对象 1.Request继承体系 Tomcat需要解析请求数据,封装为requestx对象并且创建requestx对象传递到service方法中 使用request对象,查阅JavaEE API文档的HttpServletReque…