本文针对蓝牙的连接和配对过程进行详细解析,后续会持续更新
两个蓝牙设备进行连接的时候需要进行配对和连接两个过程,这个两个过程会一起执行,连接和配对的联系是什么呢?下面进行详细介绍。
配对与连接的联系:配对是连接的基础,只有配对认证通过之后,才能进行连接动作,设备第一次进行蓝牙连接的时候,都需要先进行配对认证,配对认证通过之后才能进行连接过程,第二次或之后进行蓝牙连接的时候,需要先验证设备之前是否进行过配对认证,如果进行过配对认证,那么直接进行连接过程,如果没有进行配对认证则进行配对认证,认证完成后进行连接过程。
目前手表支持与所有设备的配对,但是仅支持与耳机类型的设备进行连接,手机大部分只支持简单安全配对SSP,但是支持所有设备进行连接。
蓝牙规范定义了两种标准配对过程,LMP配对(也称为基于PIN码)和SSP安全简易配对。
LMP(Link Manager Protocol)配对,又名PIN码配对,即pincode配对方式,这种配对方式手机中使用的比较少,手机大部分支持的是下面的SSP配对。
SSP(Secure simple pairing)安全简易配对,下面具体介绍一下SPP配对,SPP配对一共有四种,其中Out of Band很少使用到,四种配对方式具体如下:
配对双方都显示一个6位的数字,由用户来核对数字是否一致,并输入Yes/No,两端Yes表示一致即可配对,可以防止中间攻击。 使用场景:两端设备可以弹出6位十进制数,并且有yes和no按钮 【使用场景较多的是手机之间配对】
配对目标输入一个在本地设备上显示的6位数字,输入正确即可配对,并可以防止中间人攻击。 使用场景:一端设备可以显示,另一端设备可以输入。
不会进行鉴权,不能防止中间人攻击用于配对没有显示没有输入的设备,主动发起连接即可配对,用户看不到配对过程,不可以防止中间人攻击,例如连接蓝牙耳机。 使用场景:用于即不能显示6位随机数,也不能输入的设备。【蓝牙耳机】
两设备是通过别的途径交换配对信息,例如一些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
可选步骤,简单配对一旦启用,那在之后的蓝牙交互过程中有两个可能的操作会触发SSP流程
由于OOB在现有的蓝牙设备上使用比较少,所以大部分安全简单配对流程都是由安全服务的l2cap连接请求触发的,其流程图如下:
必选步骤,协议栈主机Host确定启动简单配对,它就会向控制器Controller发出请求的身份鉴权验证命令。Controller接收到鉴权指令后会请求Host提供链路密钥(Link Key),如果Host有此连接的链接密钥,则不需要配对流程,直接身份验证通过后就可以立即使用该链接密钥;如果Host没有此链路密钥,则开启简单配对流程生成新的链路密钥。
其流程图如下:
HCI上的信息交互如图所示:
必选步骤,为了确定使用SSP中的哪种身份验证模型,需要配对连接的两个设备相互交换输入/输出能力
流程图为:
HCI交互信息如下图:
必选步骤,两个配对的设备间交换公钥,一旦接受到对端发送过来的公钥,本端就可以用此公钥来计算出DHKey,该流程协议栈Host不参与交互,完全是两个设备Controller间的信息交互。
必选步骤,蓝牙设备可以通过使用 Numeric Comparison 、 Passkey Entry 、 OOB 这三种鉴权模型之一进行身份验证,鉴权模型的选择取决于两个设备的IO能力的组合。
Numeric Comparison:当两个设备都具有输出功能时,或者其中一个设备没有输入或输出功能,则将执行数字比较步骤。如果两个设备都有输出功能,则此步骤需要向用户显示确认值这个值应该显示到步骤8结束为止;如果一个或两个设备没有输出功能,则使用相同的协议,但是协议栈Host将跳过要求用户确认的环节,这就是Just Works模型。
其流程图如下,该图省略了用户确认数字的计算过程:
HCI信息交互为:
Passkey Entry:在如下两种情况下使用Passkey Entry模型执行省份验证
流程图如下:
Out of Band:只有当两个设备都有一些OOB信息要使用时,OOB身份验证才会完成。 此身份验证方式不需要用户参与。由于市面上使用该方法验证省份进行配对的蓝牙设备比较少,这里就不做深入分析了。
必选步骤,一旦设备经过身份验证,并且DHKey计算已经完成(通过步骤6交换的公钥计算得到的),就会检查生成的DHKey值。如果成功,那么这两个设备都将完成向用户显示信息的操作,因此从Controller向Host发送消息通知双方停止显示此信息。
流程图如下:
必选步骤,简单的配对完成,链接密钥(Link Key)就可以从DHKey中计算出来,这应该用作标准相互身份验证的输入,并通过HCI事件上报Host保存。
流程图为:
HCI上报信息如下图:
必选步骤,鉴权随着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