BLE 蓝牙地址类型详解 一、BLE 蓝牙地址的两种基本类型在蓝牙低功耗Bluetooth Low Energy, BLE中设备地址Bluetooth Device Address, BD_ADDR分为两大类别1. 公共地址Public Device Address定义由 IEEE 分配给制造商的全球唯一地址类似于以太网的 MAC 地址。特点48 位6 字节长度前 24 位为Company IDOUI, Organizationally Unique Identifier由 IEEE 分配后 24 位由厂商自行分配确保全球唯一性永不改变烧录在硬件中标识特征地址的最高两位bit 47-46为002. 随机地址Random Device Address定义设备动态生成的地址非全球唯一用于隐私保护。特点同样为 48 位长度最高两位bit 47-46为01、10或11用于区分子类型可以周期性更换防止被追踪子类型静态随机地址Static Random Address私有随机地址Private Random Address不可解析私有地址Non-resolvable Private Address可解析私有地址Resolvable Private Address二、地址类型的详细标识规则BLE 地址的最高两位bit 47-46是区分地址类型的关键标志位地址类型Bit 47Bit 46二进制前缀说明公共地址0000...IEEE 分配的全球唯一地址静态随机地址1111...上电时生成生命周期内不变不可解析私有地址0101...周期性更换不可被解析可解析私有地址1010...周期性更换可被配对设备解析注意随机地址的其余 46 位不能全为 0 或全为 1这是 BLE 规范的要求。三、各地址类型详解1. 公共地址Public Device Address格式: [OUI (3 bytes)][Company Assigned (3 bytes)] 示例: 00:1A:7D:DA:71:13 └──┬──┘ └────┬────┘ Company ID 厂商分配优点全球唯一稳定可靠缺点永久暴露设备身份存在隐私风险应用场景不需要隐私保护的场景如固定 Beacon、公开设备2. 静态随机地址Static Random Address生成时机设备每次上电时生成或首次使用时生成并存储在 Flash 中生命周期直到设备重新上电或恢复出厂设置前保持不变用途设备没有公共地址时的替代方案隐私性中等地址不随时间变化但仍非全球唯一格式: 11xx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx ↑↑ 固定前缀 113. 不可解析私有地址Non-resolvable Private Address生成方式完全随机生成除标志位外更换周期建议每 15 分钟更换一次特点连配对设备也无法识别其身份提供最高级别的隐私保护缺点配对设备无法自动重连需要用户手动选择应用场景对隐私要求极高且不需要自动重连的场景格式: 01xx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx ↑↑ 固定前缀 014. 可解析私有地址Resolvable Private Address生成方式基于Identity Resolving Key (IRK)和随机数生成更换周期建议每 15 分钟更换一次特点只有持有相同 IRK 的配对设备才能解析出真实身份兼顾隐私保护和自动重连能力解析原理地址包含 24 位哈希值和 24 位随机数配对设备使用 IRK 和随机数计算哈希匹配则识别成功应用场景大多数 BLE 设备如手环、耳机的默认选择格式: 10xx xxxx xxxx xxxx xxxx xxxx | xxxx xxxx xxxx xxxx xxxx xxxx ↑↑ └────┬────┘ └────┬────┘ 固定前缀 10 哈希值(24b) 随机数(24b)四、地址类型对连接的影响1. 扫描与广播阶段场景影响说明广播地址类型决定扫描响应的处理方式扫描方需要根据地址类型决定是否尝试连接可解析私有地址广播只有配对设备能识别未配对设备看到的是不断变化的随机地址公共地址广播所有设备可见设备身份公开容易被追踪2. 连接建立阶段地址类型组合连接可行性注意事项公共 ↔ 公共✅ 完全支持最稳定的连接方式公共 ↔ 随机✅ 完全支持需正确识别对方地址类型随机 ↔ 随机✅ 完全支持静态随机地址需注意地址冲突概率极低可解析私有 ↔ 可解析私有✅ 支持双方需已配对并交换 IRK不可解析私有 ↔ 任意⚠️ 受限配对设备无法自动识别需用户干预3. 连接后的影响特性公共地址静态随机可解析私有不可解析私有自动重连✅ 支持✅ 支持✅ 支持需 IRK❌ 不支持隐私保护❌ 无⚠️ 弱✅ 强✅ 最强地址变化❌ 不变❌ 不变✅ 周期性变化✅ 周期性变化配对要求无无需要配对需要配对追踪难度极易较难困难极难4. 实际开发中的注意事项地址类型声明广播数据包中必须正确声明地址类型TxAdd字段连接请求中必须正确指定目标地址类型白名单White List过滤使用可解析私有地址时控制器需要 IRK 才能正确过滤白名单白名单可以配置为只接受特定地址类型的设备绑定Bonding与 IRK配对过程中交换 IRK 是支持可解析私有地址自动重连的前提如果 IRK 丢失已配对设备将无法识别地址变化后的设备Android/iOS 差异iOS强制使用随机地址通常是可解析私有地址公共地址很少暴露Android较为灵活但新版本也倾向于使用随机地址保护隐私这导致在开发跨平台应用时必须正确处理地址类型连接失败排查如果设备使用随机地址但连接请求中指定为公共地址连接会失败如果 IRK 不匹配可解析私有地址设备将无法被白名单接受五、Python 示例解析 BLE 地址类型def parse_ble_address(address: str) - dict: 解析 BLE 蓝牙地址类型 Args: address: 蓝牙地址字符串如 A4:CF:12:34:56:78 Returns: 包含地址类型信息的字典 # 清理地址字符串 addr_clean address.replace(:, ).replace(-, ).replace( , ) if len(addr_clean) ! 12: raise ValueError(无效的蓝牙地址长度) # 获取第一个字节 first_byte int(addr_clean[:2], 16) # 提取最高两位 bit47 (first_byte 7) 0x01 bit46 (first_byte 6) 0x01 # 判断地址类型 if bit47 0 and bit46 0: addr_type 公共地址 (Public Device Address) subtype IEEE 全球唯一地址 elif bit47 1 and bit46 1: addr_type 随机地址 (Random Device Address) subtype 静态随机地址 (Static Random Address) elif bit47 0 and bit46 1: addr_type 随机地址 (Random Device Address) subtype 不可解析私有地址 (Non-resolvable Private Address) elif bit47 1 and bit46 0: addr_type 随机地址 (Random Device Address) subtype 可解析私有地址 (Resolvable Private Address) else: addr_type 未知 subtype 未知 return { address: address, first_byte: f0x{addr_clean[:2].upper()}, bit47: bit47, bit46: bit46, address_type: addr_type, subtype: subtype, oui: addr_clean[:6].upper() if bit47 0 and bit46 0 else None, is_random: not (bit47 0 and bit46 0) } # 示例测试 if __name__ __main__: test_addresses [ 00:1A:7D:DA:71:13, # 公共地址 (00) F4:CF:A2:34:56:78, # 静态随机地址 (11) 5E:CF:A2:34:56:78, # 不可解析私有地址 (01) A4:CF:A2:34:56:78, # 可解析私有地址 (10) ] for addr in test_addresses: result parse_ble_address(addr) print(f\n地址: {result[address]}) print(f 首字节: {result[first_byte]} (Bit47{result[bit47]}, Bit46{result[bit46]})) print(f 类型: {result[address_type]}) print(f 子类型: {result[subtype]}) if result[oui]: print(f OUI: {result[oui]})六、总结核心要点说明地址长度所有 BLE 地址均为 48 位6 字节类型标识最高两位bit 47-46决定地址类型隐私优先级不可解析私有 可解析私有 静态随机 公共自动重连只有公共、静态随机、可解析私有地址支持开发注意必须正确声明和识别地址类型否则连接失败BLE 的地址类型设计在设备识别和隐私保护之间取得了平衡。理解这些地址类型及其标识规则对于开发稳定的 BLE 应用和排查连接问题至关重要。