0755-82922363

为什么你的HID蓝牙键盘回连时总是“失忆”?聊聊 BLE 地址、RPA 与 IRK

你是否遇到过这种抓狂的情况:蓝牙键盘(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)虽然装束和口令都变了,但只要掏出他的另半块虎符一合,你就能立刻验明真身。

整个过程里,在旁边跟踪的窃贼(第三方扫描器)只能看到不断变化的口令,永远不知道虎符的形状。

IRK ?? RPA ??????????

四、根治 HID 设备“回连失忆”的药方

了解了原理,修复固件问题的思路也就清晰了:绝对不能假设存下来的手机地址是永久有效的。

一个稳健的 HID 回连流程应该这样设计:

第一步:不再是傻傻地发定向广播

设备唤醒后,可以先短暂尝试用老地址连接。如果失败,马上切换成观察者模式白名单扫描。主动扫描周围手机的广播包,从里面获取手机当前的 RPA。

第二步:用 IRK 去“认主人”

拿到手机的当前 RPA 后,立刻用配对时存好的手机 IRK,对这个地址进行解析运算。

如果解析成功——这就是我的主人!立即向这个新地址发起连接。

如果解析失败——这不是我的手机,继续扫描。

第三步:最后的兜底方案——被动等待

如果以上主动寻找都失败了(比如手机蓝牙暂时没在扫描),设备就自己作为 Peripheral 开始常规广播。

等到手机需要连接时(比如用户点亮屏幕),手机自己会发起扫描。手机里存有键盘的 IRK,它也能认出键盘的广播,从而主动发起连接。蓝牙 HID 标准流程里,这种由主机(手机)发起的连接,成功率往往是最高的。

??? HID ???????

五、一点思考:隐私与体验的权衡

蓝牙的 RPA/IRK 机制,是在隐私保护和用户体验之间寻找的平衡点。它让我们既能享受无线无拘束的便利,又不用担心在公共场合被轻易追踪。

而对于开发者而言,理解这套身份认证的逻辑,不再简单粗暴地存储和使用地址,而是善用 IRK 这把钥匙去“主动辨认”变脸后的主人,才能做出真正稳定、不让人抓狂的蓝牙产品。

联系方式

地址:深圳市龙华区观湖街道观乐路5号多彩科创园B栋801

邮箱:steven@yunthinker.com