你是否遇到过这种抓狂的情况:蓝牙键盘(HID设备)在连接一次手机后,下次唤醒时却怎么也连不上,手机上明明显示“已保存”,但就是没反应,最后只能删掉设备重新配对。
这并不是键盘坏了,也不是手机蓝牙抽风。背后是 BLE 协议中一项精巧的隐私保护机制在起作用。要理解这个问题,我们需要从 HID 设备的回连机制、手机蓝牙地址的“变脸术”(RPA) 以及一把至关重要的钥匙(IRK) 说起。
一、HID 设备的“主动回连”陷阱
很多低功耗蓝牙 HID 设备(如键盘、鼠标)为了省电,在不工作时会断开连接。当用户再次敲击键盘时,设备会快速发起重连。这种设计很贴心,但实现方式里有一个巨大的坑。
设备通常会发起一种特殊的广播包,叫做定向广播。它就像是拿着信封,上面只写了一个收件人的地址,只有那个特定地址的设备能收到。
这个地址从哪来? 是 HID 设备上次成功连接手机时,从手机的广播包里存下来的。
问题出在哪? 这个地址,在现代手机上,是会定期变化的。当地址变了,键盘还在向旧地址大喊“我在这里”,手机根本听不到,自然无法重连。
二、手机的“变脸术”:RPA
现在几乎所有的智能手机(iOS 和 Android 新版),都不会在 BLE 广播中一直使用自己真实的物理地址(Public Address)。为了防止被追踪,它们会周期性地生成一个随机地址进行广播。
这其中,最关键的类型是可解析私有地址(Resolvable Private Address,简称 RPA)。
RPA 由一个随机数和一串密钥(IRK)运算生成,它最大的特点就是定时更换,通常每 15 分钟左右就会变一次。这对于 HID 设备的回连简直就是灾难:
下午 3:00 键盘连接手机,并记住了手机的地址(此刻的 RPA)。
3:15 键盘休眠,手机也在后台,手机的 RPA 已经悄悄换了。
3:20 用户敲击键盘想唤醒它。键盘拿出 3:00 记下的旧地址,向它发送定向广播。
结果自然是石沉大海。因为拿着旧 RPA 的键盘,在手机看来已经是一个认不出主人的陌生呼叫了。

三、它认出“变脸的你”:IRK 与地址解析
既然 RPA 一直在变,手机又怎么知道“那个不停换地址的设备”就是自己的键盘呢?反过来,键盘要怎么认出换了地址的手机呢?
这就要靠绑定阶段交换的密钥——身份解析密钥(Identity Resolving Key,简称 IRK)。
IRK 是在配对时,双方交换的一把特殊的“钥匙”。它有两个核心用途:
生成 RPA:设备用自己的 IRK 和一个随机数,生成看起来随机的 RPA。
解析 RPA:对方用存好的 IRK,去解算收到的 RPA。如果解算成功,就能确认“这个换了新地址的设备,就是和我绑定过的那一个”。
整个过程就像古代兵符的虎符对验:
你手里有半块虎符(你的 IRK),我手里有另外半块(对方的 IRK)。
每次我派出的信使(RPA)虽然装束和口令都变了,但只要掏出他的另半块虎符一合,你就能立刻验明真身。
整个过程里,在旁边跟踪的窃贼(第三方扫描器)只能看到不断变化的口令,永远不知道虎符的形状。

四、根治 HID 设备“回连失忆”的药方
了解了原理,修复固件问题的思路也就清晰了:绝对不能假设存下来的手机地址是永久有效的。
一个稳健的 HID 回连流程应该这样设计:
第一步:不再是傻傻地发定向广播
设备唤醒后,可以先短暂尝试用老地址连接。如果失败,马上切换成观察者模式或白名单扫描。主动扫描周围手机的广播包,从里面获取手机当前的 RPA。
第二步:用 IRK 去“认主人”
拿到手机的当前 RPA 后,立刻用配对时存好的手机 IRK,对这个地址进行解析运算。
如果解析成功——这就是我的主人!立即向这个新地址发起连接。
如果解析失败——这不是我的手机,继续扫描。
第三步:最后的兜底方案——被动等待
如果以上主动寻找都失败了(比如手机蓝牙暂时没在扫描),设备就自己作为 Peripheral 开始常规广播。
等到手机需要连接时(比如用户点亮屏幕),手机自己会发起扫描。手机里存有键盘的 IRK,它也能认出键盘的广播,从而主动发起连接。蓝牙 HID 标准流程里,这种由主机(手机)发起的连接,成功率往往是最高的。

五、一点思考:隐私与体验的权衡
蓝牙的 RPA/IRK 机制,是在隐私保护和用户体验之间寻找的平衡点。它让我们既能享受无线无拘束的便利,又不用担心在公共场合被轻易追踪。
而对于开发者而言,理解这套身份认证的逻辑,不再简单粗暴地存储和使用地址,而是善用 IRK 这把钥匙去“主动辨认”变脸后的主人,才能做出真正稳定、不让人抓狂的蓝牙产品。





