蓝牙地址
public address
- 一般写在 固件中,不能改变的地址
- BR/EDR也同样使用该地址
- 在log 中为BD_ADDR参数
random address
- 另一种类型的地址,可以分为两种,static address和private address
- random static address 一般是开机自动产生,有host通过set random address传递给control
- private address 分为resolvable 和Non-resolvable两种类型
- 重点关注resolvable private address,这类地址可以被解析。
- 当设备同时拥有对端IRK和本地IRK的时候,就可以将resolvable private address解析成indentify address。
indentify address
- 这类地址是一个抽象的概念,故名思意,其作用就是识别设备的地址
- 如果一个设备仅支持public address, 那么该public address 可以作为这个设备的indentify address,在配对过程中使用
- 如果一个设备支持random static address,同样可以作为indentify address使用
- 如果一个设备使用的是resolvable private address, 通过IRK解析之后的地址,才是indentify address。
RPA(resolvable private address)
IRK
- IRK是设备配对过程中,SMP 交换的信息
- 自己的IRK和对端的IRK,用来解析私有地址
- 所有已经配对过设备的IRK,在resolving list这个表中维护
RPA产生
- 为了连接过程中的安全,我们可以用RPA地址与对端设备连接
- 每次连接,RPA地址并不是固定的地址,但是拥有IRK的设备,能够解析RPA地址,指向相同的设备
- RPA通过IRK和pRand 产生
- 可以产生自己的RPA,也可以产生对端设备的RPA
RPA解析
- localHash = ah(IRK,pRand)
- 接收到对端的RPA之后,可以计算出对端的peerHash值,前24bit 即为对端的hash
- localHash 与peerHash对比,就能解析出是否是曾经配对过的设备
- RPA解析的目的是:将random address转化为indetify address, 然后获取到正确的LTK或者GATT cache
resolving list
- 这个列表保护一些列对端和自己的IRK配对记录
- 列表维护在controller中,可以不经过host,完成解析RPA功能
- 此列表中的地址是inditify address,一个设备一个地址,通过确定的地址,找到正确的IRK
RPA flow
注意事项
此次bluedroid 有一个google bug
在enable RPA 之前,应该停掉所有adv,包括mutil adv
不然enable RPA 会出现错误error:command disallow,导致RPA功能不能正常启动