蓝牙地址类型小结

1 前言

蓝牙地址(Bluetooth Address),又称为蓝牙设备地址(Bluetooth Device Address,BD_ADDR),是蓝牙设备在无线通信中用于唯一标识自身的一种地址。这个地址通常是一个 48 位的唯一标识符,采用 EUI-48(Extended Unique Identifier 48-bit)格式。

通常以六组十六进制数字表示,每组包含两个字符,中间以冒号或连字符分隔。例如,一个蓝牙地址的格式可能是:00:1A:2B:3C:4D:5E。

为区分不同的蓝牙设备,一般使用蓝牙地址和地址类型进行标识蓝牙设备。地址类型包括public device address 和 random device address,两者均为 48 bit长度。其中,经典蓝牙(BR/EDR)设备只有 public 地址,BLE 设备可以使用其中一种也可以使用两种。

2 BLE 设备地址类型

蓝牙地址类型小结_第1张图片

2.1 Public device address

对经典蓝牙来说,蓝牙地址应是一个符合 IEEE 802-2014 标准第 8.2 节(“通用地址”)的 48 位扩展唯一标识符(EUI-48)(IEEE SA - IEEE 802-2014)。

创建有效的 EUI-48 需要从 IEEE 注册管理机构获得以下 MAC 地址块类型之一。

• MAC Address Block Large (MA-L)

• MAC Address Block Medium (MA-M)

• MAC Address Block Small (MA-S)

具体申请详情请参考 IEEE SA - Registration Authority,也就是公司向 IEEE 申请购买一个唯一的蓝牙地址号段,一般是 3 字节的长度。

蓝牙地址类型小结_第2张图片

Welcome to The Public Listing For IEEE Standards Registration Authority 这里可以查看已经注册的公司信息,包括公司号段(company id)和公司地址信息。

蓝牙地址类型小结_第3张图片

2.2 Random device address

BLE 设备大部分使用随机地址,一方面随机地址不需要花钱购买,而且私密性更好,不容易被追踪。

2.2.1 Static device address

static address 是随机生成的 48-bit 地址,有如下特点:

1. 低位46bits 随机数,不能全为0,也不能全为1。

2. 最高两个 bit 为 “11”。

3. 每次重新上电都可以改变,上电周期内保持不变

蓝牙地址类型小结_第4张图片

2.2.2 Private device address

与 Public Device Address 不同,Private Device Address 是在设备运行时动态生成的,因此具有更高的随机性和隐私性。

Private Device Address 分为两种类型:

2.2.2.1 Resolvable private address(RPA,可解析私有地址)

这种地址允许其他设备在一定条件下解析出设备的真实身份。通过一个随机数和 IRK( identity resolving key) 加密生成。

蓝牙地址类型小结_第5张图片

RPA 有如下特点:

  1. 高24bits(prand)是随机生成的,其中最高两个bit为“10”; 

 2. 低位24bits,是IRK和 随机数高prand通过hash运算hash = ah(IRK, prand)得到的。

3. RPA 最终是由 prand 和 hash 连接起来组成的, randomAddress = prand || hash

4. 可以周期变化,变化周期可以通过 host 指定,一般默认是 15 分钟

蓝牙地址类型小结_第6张图片

2.2.2.2 Non-resolvable private address(NRPA 不可解析私有地址)

这种地址不提供身份解析的能力,其他设备无法通过这个地址获知设备的真实身份。这种地址适用于一些场景,例如广告中使用的地址,旨在提供更高的隐私保护。

NPRA有如下特点:

1. 低位46bits 随机数,不能全为0,也不能全为1。

2. 最高两个 bit 为 “00”。

蓝牙地址类型小结_第7张图片

2.2.2.3 Private device address resolution

解析 RPA 地址需要用到配对过程中对端分发的 IRK,然后使用同样的 hash 算法,将 IRA 和RPA中的 prand 部分作为入参进行计算localHash = ah(IRK, prand),最后将计算出来的 lcoahHash跟 RPA 地址中的 hash 部分进行比较,如果相同则认为解析成功,否则则失败。

non-resolvable private address 是不可解析的

3. 注意事项:

大家可能在以前的core spec 中看到 bluetooth address 的相关介绍,有提到company id 的概念,也就是本文中提到的的public 地址的蓝牙地址号段,这个要跟 Link Layer 消息 LL_VERSION_IND的company_identifer区别开来:

蓝牙地址类型小结_第8张图片

这个是向 SIG 申请的一个 2字节长度的 Id,一般是用来表明这个蓝牙芯片是哪个厂商的,详情请参考 Assigned Numbers

4. 蓝牙地址在产品中的应用

对于public 地址,产品厂商一般会在产线根据自己购买的号段生成一个地址

对于 random地址,一般是生成一个 static device address 地址,然后将地址写入flash的指定位置,在开机上电后去读取地址然后写给 controller,也有时候在读取的时候发生读取失败或者读到非法的地址值,这个时候可能会重新随机生成一个地址

以上是工作过程中的一点总结和经验分享,有错误之处请指出,也欢迎一起探讨。

5. 参考文档

BLE Core Specification 5.4

你可能感兴趣的:(物联网,iot)