BLE 配对绑定与绑定信息丢失问题

一、概述

在 NXP BLE 产品开发中,我们通常使用的是设备端角色,而且要实现基本的配对和绑定功能,得以去完善这个通信过程。在实际情况中,因为 FLASH 存储空间的有限性,所以绑定有添加信息固然就有删除信息,因此 BLE主机或从机绑定信息的丢失问题也是需要我们去关心的。

二、应用场景

基本所有的蓝牙设备都默认带有配对绑定功能,这点毋庸置疑。我们需要处理的问题情况有 BLE 主机端丢失绑定信息或从机端丢失绑定信息的情况,因为某些产品它并不像手机这么方便能够观测到蓝牙连接状态,所以更多时候要依靠蓝牙协议栈具有相对应的机制去底层处理。

三、NXP BLE 配对绑定功能开启

配对和绑定是实现蓝牙射频通信安全的一种机制,执行配对步骤去建立密钥,然后用于加密链路,执行特定于传输的密钥分发来共享密钥,这些密钥可用于加密连接,在未来的重连、验证签名数据和随机地址解析中具有重要作用。而绑定则是配对过程中生成一个长期密钥 LTK,如果配对的两个设备把这个 LTK 存储起来放到 FLASH 中,那么这两台设备再次重连的时候,就可以跳过之前的配对流程,直接使用这个 LTK 去对蓝牙通信链路进行加密。


图一

因为配对是一个三阶段的过程,阶段一是配对特性交换,配对开始时,配对特性交换应由发起设备发起,通常是主机端,如果响应设备不支持配对或配对不能执行,则响应设备应使用配对失败的信息对主机端响应,配对功能交换用于交换 IO 功能、OOB 身份验证数据可用性、身份验证要求、密钥大小需求和哪些需要传输分发的特定密钥,用于确定阶段二中使用的密钥生成方法。

阶段二包括 legacy pairing 的 STK 生成和 secure pairing 的 LTK 生成过程,连接通信过程会被 STK 加密,其中,配对的前两个阶段是必须的,经过第二阶段后,BLE 通信链路可根据加密需求选择加密或者不加密,如果加密,则阶段三就可以生成一系列特殊作用的密钥并分发出去,其实也就是主从机将自己的密钥交给对方,如果不加密,则无需进行第三阶段。所以配对过程中其实不存储 LTK 也即是不分发 LTK 也是可以的,配对完成后是能通过 STK 对链路进行加密的,但如果两台设备再次重连,那么久需要再重新走一遍配对流程,否则两者之间还是明文通信。

但一般情况下,我们会将配对绑定等同,以免混淆,毕竟只配对不绑定的设备非常少见。在 NXP BLE SDK 中,我们如果要使用蓝牙配对绑定功能,那么需要打开以下几个宏:


图二

gAppUseBonding_d、gAppUsePairing_d、gAppUseNvm_d 三个宏均设置为 1 即可。

其中,gAppUseNvm_d 用于打开 NVM 机制,打开后,芯片的 FLASH 部分区域将会用来存储绑定信息,并使用的是磨损算法,具体的绑定信息存储量需要根据具体代码和FLASH、RAM 空间进行分配。如果gAppUseNvm_d 设置为 0,那么所有绑定数据将存储在 RAM 中,这意味着在芯片掉电复位或重置芯片后这部分绑定数据都会消失。

四、绑定信息丢失问题

  • 主机端删除了绑定信息,从机端保留绑定信息:

这种情况下,通常需要主机再次发起配对请求,进行重新配对。任何一端没有配对信息了,都需要再走一次配对流程,配对由主机发起,主机什么时候删除绑定信息,这对于从机来说是一种不可控的行为,在 NXP BLE 协议栈中,也没有对应的底层处理可以去判断主机是否还存有绑定信息。那么当主机端再次发起配对请求时,从机端是不是会通过新的绑定信息去覆盖原来的绑定信息呢?通过查看 NXP BLE 文档和测试发现,在重新配对操作时,我们并不需要应用层再去对增加的白名单进行判断,API 会主动对该部分进行处理,无需应用层进行干预,此时配对完之后,我们可以发现从机端已经添加过的记录并不会再次添加进来。

图三 

  • 主机端保留绑定信息,从机端删除绑定信息:

这种情况下,从机端丢失了 LTK 信息,将无法通过双方的通信加密,在 NXP BLE 协议栈中,底层会提示 gConnEvtPairingNoLtk_c 事件以表示从机端绑定信息丢失了。


图四

从机端调用 Gap_SendSlaveSecurityRequest API 通知对端主机请求本地安全需求,该过程具有与配对请求相同的参数,它没有配对效果,只是通知主机端发起配对请求。而主机端如果是 IOS 手机或安卓手机,根据操作系统的区别有不同的处理方式,其中 IOS 手机只能通过手动删除主机端绑定信息并且重新配对,安卓手机可以执行新的绑定程序,删除掉旧的绑定信息,也即是会主动跳出一个新的配对请求窗口。

以下为测试结果:


图五

  
图六

我们可以发现安卓手机可以发起配对请求,而 IOS 手机不会。IOS 端并没有相应 API 可以知道配对失败,去让 APP 端重启配对过程,但是可以使用(void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error,错误码返回的方式进行事件处理,通过获取系统提示错误码 error = 14,去提示用户删除蓝牙配对信息。

五、总结

 通过以上的讲解,我们对配对和绑定的概念和一些基本问题也有了更多的了解,便于我们在后续的产品开发中有更清晰的处理方式。

六、参考资料

【1】Bluetooth Low Energy Application Developer Guide.pdf

【2】Core_V5.3.pdf

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论

gounie

gounie

4 个月前
ios端有什么其他办法在收到错误码之后在app程序里处理不通知用户手动删除记录的方法么?