当前位置: 首页 > article >正文

结合实例从HCI层分析经典蓝牙连接和配对过程

我们知道,经典蓝牙BREDR的link key协商是在LMP层做的,那么蓝牙Host在鉴权的过程中,会跟BT SOC有哪些交互:

首次配对

  1. 在HCI Inuqiry找到想要配对的设备后,Host会调用HCI Create Connection命令去连接对方设备,创建ACL连接,如下图,ACL Connection handle = 0x0004:
    在这里插入图片描述
  2. ACL连接创建成功后: 蓝牙HOST会去读取时钟偏移,设置Link Policy(支持role swithc, Hold Mode和Sniff Mode),以及读取对方设备的feature和extended feature:需要注意的是extended feature里的SC Host就是说支持Secure connection,也就是蓝牙4.2采用的基于ECDH鉴权加密机制,如下图:
    在这里插入图片描述
  3. 接下来蓝牙Host还会读取对方设备的名字,会设置APCF的过滤规则(通过0xFD57命令),然后就开始进入鉴权过程,如下图红色框:
    在这里插入图片描述
步骤HCI详解
1HCI Authentication Requested蓝牙host发起鉴权
2HCI Command Status (Success, Command=Authentication Requested)BTSOC响应OK
3HCI Link Key RequestBTSOC请求HOST是否有现成的link key
4HCI Link Key Request Negative ReplyHOST找了一通没有发现对方设备的link key
5HCI Command Complete (Command=Link Key Request Negative Reply, Success)BTSOC响应HOST:好的,我知道了,你没有现成的Link key,我会告诉对方设备的
6HCI IO Capability Request对方设备要来查询HOST的IO capability
7HCI IO Capability Request Reply (IoCapability=Yes/No, HostOobDataPresent=None, Auth=MITM+Dedicated)HOST告诉对方设备IO Capability是支持显示,并且要求认证需要MIMT,以及Dedicated Bond
8HCI Command Complete (Command=IO Capability Request Reply, Success)BTSOC回应HOST,同时会问对方设备的IO Capbility
9HCI IO Capability Response (IoCapability=None, RemoteOobDataPresent=None, Auth=!MITM+General)对方设备的IO Capability是不支持显示,也不支持OOB,不要求MIMT,需要General Bonding
10HCI User Confirmation Request (Pass=039802)经过上面双方交互了IO Capability,双方确定了Numeric comparison配对方式,对方要求显示4个字节字符:039802 ,这里手机上会有一个弹窗显示这几个数字,让用户点击确认
11HCI User Confirmation Request Reply用户点击确认,没错,就是这个数字
12HCI Command Complete (Command=User Confirmation Request Reply, Success)BTSOC把这个用户的确认信息告诉了对方设备
13HCI Simple Pairing Complete (Success)BTSOC和对方设备经过一番LMP交流计算出最终的link key之后,告诉HOST鉴权成功完成。
14HCI Link Key Notification ( Key=F6E7A1F5:80C01AEF:27F16B1B:75C0B7E5, Type=Unauthenticated-256)BTSOC告诉HOST Link key,HOST会帮BTSOC保存在本地。
15HCI Authentication Complete (Success, Connection=0x0004)鉴权成功结束,皆大欢喜。

配对后的连接

如果首次配对结束,蓝牙HOST会保存Link key 在本地,那么下次连接的时候就不需要重新计算Link Key,过程就简单了很多,如下图:
在这里插入图片描述

步骤HCI详解
1HCI Authentication Requested蓝牙host发起鉴权
2HCI Command Status (Success, Command=Authentication Requested)BTSOC响应OK
3HCI Link Key RequestBTSOC请求HOST是否有现成的link key
4HCI Link Key Request Reply (14:6C:27:DF:91:B1, Key=26AF7922:13E89779:8D76C776:C35BA8F2)HOST在本地找到了之前配对过的Link key,然后发给了BTSOC
5HCI Command Complete (Command=Link Key Request Reply, Success, 14:6C:27:DF:91:B1)BTSOC回应了BTHOST给的link key说明没问题
6HCI Authentication Complete (Success, Connection=0x000E)鉴权成功结束。

配对后,但对方设备的Link Key丢失

  1. 对方设备如果擦除了Link Key,那么整个流程就要分为两次了: 由于手机端不知道对方设备的Link Key已经丢失,然后会把之前的配对过的Link Key发给对方,但鉴权肯定是不成功的,对方会返回HCI Authentication Complete (PIN Or Key Missing, Connection=0x000C),如下图:在这里插入图片描述
  2. 由于手机端收到了PIN Or Key Missing,说明对方Link Key已经不存在了,那么需要重新鉴权协商Link Key,这个过程就跟首次配对的流程是一样的,如下图: 在这里插入图片描述

曾经遇到过的问题

之前碰到过一个对方Link key丢失后,手机重新配对,但不会发起A2DP音乐播放的问题,最后通过比较鉴权过程发现有细小差别:
在这里插入图片描述
差别就在于对方设备回复的HCI IO Capability Response ,里面有个Authentication Requirement,正常情况下是0x04,异常情况下是0x00,然后查看Core Spec:
在这里插入图片描述
应该是手机看到这个设备不需要Bonding,所以不会发起A2DP等服务的SDP查询,近而不会进行A2DP播放。


http://www.kler.cn/a/450778.html

相关文章:

  • 微调大模型时,如何进行数据预处理? 将<input, output>转换为模型所需的<input_ids, labels, attention_mask>
  • 后端-redis
  • 汽车IVI中控开发入门及进阶(44):杰发科智能座舱芯片
  • Linux系统安装部署xtrabackup
  • 一网多平面
  • Canoe E2E校验自定义Checksum算法
  • cursor保存更改操作技巧
  • MimicBrush:智能图像编辑新宠,能否革新你的创意设计?
  • Unity-URP设置单独渲染UI相机
  • 数据结构:算法篇:快速排序;直接插入排序
  • 迪文串口屏_T5L平台_界面状态图标显示和隐藏
  • 51单片机之RTC电子钟
  • 虚幻引擎是什么?
  • 《通义千问AI落地—中》:前端实现
  • Windows如何切换用户访问局域网共享文件夹,如何切换网上邻居的账户
  • 仿闲鱼的二手交易小程序软件开发闲置物品回收平台系统源码
  • 关于如何正确在测试用例中mock静态方法的问题
  • vue2+Three.js或WebGL上传预览CAD文件
  • 实时预警,防范暴力事件 ----AI监控保障监狱安全与秩序
  • WebClient HTTP 请求问题处理模板(泛型响应、忽略 SSL 证书等)
  • 《信管通低代码信息管理系统开发平台》Windows环境安装说明
  • 电感降额和选型规范
  • 点亮核心板小灯 STM32U575
  • 瑞吉外卖项目学习笔记(七)新增菜品、(批量)删除菜品
  • PHP医院安全(不良)事件管理系统源码,通过运用RCA分析工具,借助柏拉图、鱼骨图等分析工具,分析问题产生的根本原因
  • NLP 中文拼写检测纠正论文-01-介绍了SIGHAN 2015 包括任务描述,数据准备, 绩效指标和评估结果