• 蓝牙配对连接详细解析


    概述

    本文针对蓝牙的连接和配对过程进行详细解析,后续会持续更新

    一、配对连接介绍

    两个蓝牙设备进行连接的时候需要进行配对和连接两个过程,这个两个过程会一起执行,连接和配对的联系是什么呢?下面进行详细介绍。
    配对与连接的联系:配对是连接的基础,只有配对认证通过之后,才能进行连接动作,设备第一次进行蓝牙连接的时候,都需要先进行配对认证,配对认证通过之后才能进行连接过程,第二次或之后进行蓝牙连接的时候,需要先验证设备之前是否进行过配对认证,如果进行过配对认证,那么直接进行连接过程,如果没有进行配对认证则进行配对认证,认证完成后进行连接过程。

    二、蓝牙配对

    目前手表支持与所有设备的配对,但是仅支持与耳机类型的设备进行连接,手机大部分只支持简单安全配对SSP,但是支持所有设备进行连接。
    蓝牙规范定义了两种标准配对过程,LMP配对(也称为基于PIN码)和SSP安全简易配对。
    LMP(Link Manager Protocol)配对,又名PIN码配对,即pincode配对方式,这种配对方式手机中使用的比较少,手机大部分支持的是下面的SSP配对。
    SSP(Secure simple pairing)安全简易配对,下面具体介绍一下SPP配对,SPP配对一共有四种,其中Out of Band很少使用到,四种配对方式具体如下:

    2.1 Numeric Comparison (即confirm配对方式)

    配对双方都显示一个6位的数字,由用户来核对数字是否一致,并输入Yes/No,两端Yes表示一致即可配对,可以防止中间攻击。 使用场景:两端设备可以弹出6位十进制数,并且有yes和no按钮 【使用场景较多的是手机之间配对

    2.2 Passkey Entry

    配对目标输入一个在本地设备上显示的6位数字,输入正确即可配对,并可以防止中间人攻击。 使用场景:一端设备可以显示,另一端设备可以输入。

    2.3 Just Works

    不会进行鉴权,不能防止中间人攻击用于配对没有显示没有输入的设备,主动发起连接即可配对,用户看不到配对过程,不可以防止中间人攻击,例如连接蓝牙耳机。 使用场景:用于即不能显示6位随机数,也不能输入的设备。【蓝牙耳机

    2.4 Out of Band

    两设备是通过别的途径交换配对信息,例如一些NFC蓝牙音箱。【使用较少

    ---------------------遗留问题:怎么查看手机到底使用SSP中具体那个配对方式-------------------------

    任何配对方法的结果都是一样的:即创建共享的链路密钥(Link Key),Link Key非常重要,配对成功后,配对双方都会保存Link Key 到本地,下次连接的时候,只需要从本地读取出Link Key 比较双方Link Key是否可以适配,如果适配的话,直接进行连接,如果没有适配则重新进行配对操作,配对成功后直接进行连接。

    SSP 简单安全配对完整流程:
    在这里插入图片描述
    这是SSP简单安全配对的完整流程,下面针对每个步骤进行详细的讲解。
    Step 1: Optional OOB Information Collection
    可选步骤,OOB信息收集。如果蓝牙设备支持OOB信息交换,则协议栈Host应该从蓝牙控制器Controller获取到OOB信息的C和R值,并将此信息传输到OOB系统,这是一个可选项,有的hci 日志并不能打印出来hci_read_local_oob_data 命令,如果没有,大家不用慌张,非常正常,我们只需要关注SSP配对的必选步骤即可。
    获取信息的流程图如下:
    在这里插入图片描述
    如果协议栈Host和Controller都支持安全连接(安全连接见 Step 2分析),则流程图如下:
    在这里插入图片描述
    Step 2: Enable Simple Pairing and Secure Connections
    必选步骤,根据本端Controller的能力来决定是否使能简单配对及安全连接。这两个使能动作应该在使用简单配对或创建连接之前完成。
    使能简单配对流程图如下:
    在这里插入图片描述
    使能安全连接流程图如下:
    在这里插入图片描述
    这两条使能指令的HCI信息如下:
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/50c162f1f9c84339ba1f987b8799e937.png在这里插入图片描述

    Step 3: Connection Establishment

    可选步骤,简单配对一旦启用,那在之后的蓝牙交互过程中有两个可能的操作会触发SSP流程

    1. l2cap链路连接请求触发到需要安全鉴定的服务
    2. OOB信息传输

    由于OOB在现有的蓝牙设备上使用比较少,所以大部分安全简单配对流程都是由安全服务的l2cap连接请求触发的,其流程图如下:
    在这里插入图片描述

    Step 4: Start Simple Pairing

    必选步骤,协议栈主机Host确定启动简单配对,它就会向控制器Controller发出请求的身份鉴权验证命令。Controller接收到鉴权指令后会请求Host提供链路密钥(Link Key),如果Host有此连接的链接密钥,则不需要配对流程,直接身份验证通过后就可以立即使用该链接密钥;如果Host没有此链路密钥,则开启简单配对流程生成新的链路密钥。
    其流程图如下:
    在这里插入图片描述
    HCI上的信息交互如图所示:
    在这里插入图片描述

    Step 5: IO Capability Exchange

    必选步骤,为了确定使用SSP中的哪种身份验证模型,需要配对连接的两个设备相互交换输入/输出能力
    流程图为:
    在这里插入图片描述
    HCI交互信息如下图:
    在这里插入图片描述

    Step 6: Public Key Exchange

    必选步骤,两个配对的设备间交换公钥,一旦接受到对端发送过来的公钥,本端就可以用此公钥来计算出DHKey,该流程协议栈Host不参与交互,完全是两个设备Controller间的信息交互。

    Step 7: Authentication

    必选步骤,蓝牙设备可以通过使用 Numeric Comparison 、 Passkey Entry 、 OOB 这三种鉴权模型之一进行身份验证,鉴权模型的选择取决于两个设备的IO能力的组合。
    Numeric Comparison:当两个设备都具有输出功能时,或者其中一个设备没有输入或输出功能,则将执行数字比较步骤。如果两个设备都有输出功能,则此步骤需要向用户显示确认值这个值应该显示到步骤8结束为止;如果一个或两个设备没有输出功能,则使用相同的协议,但是协议栈Host将跳过要求用户确认的环节,这就是Just Works模型。
    其流程图如下,该图省略了用户确认数字的计算过程:
    在这里插入图片描述
    HCI信息交互为:
    在这里插入图片描述
    Passkey Entry:在如下两种情况下使用Passkey Entry模型执行省份验证

    1. 当一个设备仅有数字输入,而另一个设备具有显示或数字输入能力
    2. 当两个设备都仅具有数字输入能力

    流程图如下:
    在这里插入图片描述
    Out of Band:只有当两个设备都有一些OOB信息要使用时,OOB身份验证才会完成。 此身份验证方式不需要用户参与。由于市面上使用该方法验证省份进行配对的蓝牙设备比较少,这里就不做深入分析了。

    Step 8: DHKey Checks

    必选步骤,一旦设备经过身份验证,并且DHKey计算已经完成(通过步骤6交换的公钥计算得到的),就会检查生成的DHKey值。如果成功,那么这两个设备都将完成向用户显示信息的操作,因此从Controller向Host发送消息通知双方停止显示此信息。
    流程图如下:
    在这里插入图片描述

    Step 9: Calculate Link Key

    必选步骤,简单的配对完成,链接密钥(Link Key)就可以从DHKey中计算出来,这应该用作标准相互身份验证的输入,并通过HCI事件上报Host保存。
    流程图为:
    在这里插入图片描述
    HCI上报信息如下图:
    在这里插入图片描述

    Step 10: Enable Encryption

    必选步骤,鉴权随着Link Key的上报就完成了,那接下来Host就可以使用标准方法对数据交互进行加密。
    流程图为:
    在这里插入图片描述
    HCI信息交互如下图所示:
    在这里插入图片描述
    鉴权加密流程成功完成也即是SSP简单配对流程结束,接下来蓝牙l2cap链路就可以安全地建立连接了。

    -----------------------------遗留问题:最大配对数目怎么设置 ----------------------------------

    三、蓝牙连接

    ACL连接建立总流程:
    建立ACL Connection在HCI层上看比较简单,只有Create_Connection command和Command status event以及Connection Complete event两个event。在建立连接后,得到重要的Connection handle,建立起ACL连接,这个连接一旦建立起来,L2CAP signaling channel(CID = 0x0033)就已经存在,L2CAP可以在这个Channel进行一些数据传输并建立L2CAp连接。ACL建立完成后才能在ACL建立的基础上建立L2CAP 连接,这里只需要区分一下ACL 与 SCO,这些都属于传输层,ACL传输传统数据,SCO传输实时通话
    -----------------------------遗留问题:微信通话会走哪个链路-----------------------------

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    ![在这里插入图片描述](https://img-blog.csdnimg.cn/e09b10f7cad146c388cb74cfa49ee1e6.png

    在这里插入图片描述在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    总结

  • 相关阅读:
    LVGL库入门教程02-基本控件与交互
    微服务 高可用
    Kotlin协程:Dispatchers.IO线程池原理
    部署LVS-DR群集
    3D图表有效提升数据大屏档次
    Web前端系列技术之Web APIs基础(从基础开始)④
    【web前端】定位
    C# 后台处理 webp图片
    el-table动态配置显示表头
    企业财务数字化转型的机遇有哪些?_光点科技
  • 原文地址:https://blog.csdn.net/qq_41577616/article/details/125602755