BLE Legacy 广播【随机地址配置】 在 BLE Legacy 广播配置中除了要理解广播参数、广播数据、扫描响应数据、广播使能之外还有一个容易被忽略但非常重要的配置项随机地址配置。对应的 HCI Command 是LE Set Random Address command对应命令名称HCI_LE_Set_Random_AddressOCF0x0005命令参数Random_Address返回参数Status一、官方描述翻译Description 翻译这个命令由 Host 使用用来在 Controller 中设置 LE Random Device Address。也就是说Host 可以通过这个命令把一个随机设备地址设置到 Controller 中。如果这个命令用于改变当前地址那么新的随机地址生效时间如下对于广播新的随机地址最迟应在下一次成功执行HCI_LE_Set_Advertising_Enable命令后生效。对于扫描新的随机地址最迟应在下一次成功执行HCI_LE_Set_Scan_Enable命令或HCI_LE_Set_Extended_Scan_Enable命令后生效。对于发起连接或者从 PAwR train 创建连接新的随机地址最迟应在下一次成功执行HCI_LE_Create_Connection命令或HCI_LE_Extended_Create_Connection命令后生效。注意如果正在使用 Extended Advertising 相关命令那么这个命令只影响扫描和发起连接所使用的地址。广播所使用的地址需要通过HCI_LE_Set_Advertising_Set_Random_Address命令来设置。二、Errors 翻译错误类型和描述见规范中的错误码章节。这里特别列出了一个错误条件如果 Controller 中有以下任意一种行为处于启用状态1. 使用 Legacy Advertising command 创建的广播正在启用 2. 扫描正在启用 3. 正在创建连接那么执行该命令会返回Command Disallowed错误码0x0C也就是说如果你想设置随机地址不能在 Legacy 广播已经开启、扫描已经开启、连接创建流程正在进行时直接设置。三、Command Parameters 翻译命令参数Random_Address大小6 octets参数含义Random Device Address也就是 BLE 的随机设备地址。它是一个 48-bit 地址也就是 6 字节地址。格式示例0xXXXXXXXXXXXX注意这里的 Random Address 不是随便填一个 6 字节值就一定合法它必须符合 BLE Random Device Address 的地址格式要求。四、Return Parameters 翻译返回参数Status大小1 octet返回值说明0x00表示HCI_LE_Set_Random_Address command succeeded.也就是命令执行成功。0x01 to 0xFF表示HCI_LE_Set_Random_Address command failed.也就是命令执行失败具体失败原因需要查看 Controller Error Codes。五、Event 翻译当HCI_LE_Set_Random_Address命令完成后Controller 会产生HCI_Command_Complete event前提是该事件没有被屏蔽掉。也就是说这个命令不是通过Command Status event返回结果而是通过Command Complete event返回执行结果。六、这个命令到底是做什么的一句话理解LE Set Random Address command 用来设置 Controller 后续使用的 LE Random Device Address。这个地址可以用于 Legacy 广播、Legacy 扫描、Legacy 发起连接等流程。在 Legacy 广播场景下如果设备不使用 Public Device Address而是使用 Random Device Address那么就需要先通过这个命令把随机地址设置到 Controller 中。然后在LE Set Advertising Parameters command中把Own_Address_Type设置成使用随机地址的类型。七、它和 Legacy 广播有什么关系在 Legacy Advertising 中广播设备自身地址由Own_Address_Type决定。在LE Set Advertising Parameters command中有一个参数Own_Address_Type它决定本设备在广播 PDU 中使用什么地址类型。常见取值可以理解为Public Device Address Random Device Address Resolvable Private Address / Public Identity Address Resolvable Private Address / Random Identity Address如果你设置的是Own_Address_Type Random Device Address那么 Controller 就需要知道这个 Random Device Address 是什么。这个地址就是通过LE Set Random Address command提前设置进去的。所以一个典型的 Legacy 随机地址广播配置流程是1. 关闭 Legacy 广播 2. HCI_LE_Set_Random_Address 3. HCI_LE_Set_Advertising_Parameters Own_Address_Type Random Device Address 4. HCI_LE_Set_Advertising_Data 5. HCI_LE_Set_Scan_Response_Data 6. HCI_LE_Set_Advertising_Enable八、为什么设置后不是“立刻生效”规范里说得很关键如果这个命令用于改变地址那么新的随机地址对于广播来说最迟会在下一次成功执行HCI_LE_Set_Advertising_Enable后生效。这句话的意思是你调用 LE Set Random Address 只是把随机地址设置给 Controller。 真正用于广播通常要等你重新 Enable 广播流程。所以不要理解成广播已经开启了我直接改 Random Address空口广播地址马上变化。这通常是不允许的。因为规范也明确说了如果 Legacy 广播已经启用再执行这个命令可能会返回Command Disallowed所以实际开发中应该这样做先 Disable Advertising 再 Set Random Address 再配置 Advertising Parameters 再 Enable Advertising九、为什么广播、扫描、发起连接都可能用到它BLE 设备不只是 Peripheral 会用地址Central 也会用地址。当设备作为 Scanner 扫描时它也可能发送 Scan Request。当设备作为 Initiator 发起连接时它也会发送连接请求。这些空口包中同样会涉及本设备地址。所以LE Set Random Address command不只是给“广播”用的它也可以影响Advertising Scanning Initiating也就是广播时自己的地址 扫描时自己的地址 发起连接时自己的地址当然具体是否使用这个随机地址还要看后续相关命令里的Own_Address_Type配置。十、Legacy Advertising 和 Extended Advertising 的区别这一点非常重要。规范中特别强调如果使用的是 Extended Advertising commands那么HCI_LE_Set_Random_Address只影响Scanning Initiating也就是扫描和发起连接。它不再用来设置 Extended Advertising 的广播随机地址。Extended Advertising 的广播随机地址要使用HCI_LE_Set_Advertising_Set_Random_Address也就是说Legacy Advertising 使用 HCI_LE_Set_Random_Address 设置广播随机地址 Extended Advertising 使用 HCI_LE_Set_Advertising_Set_Random_Address 设置某个 Advertising Set 的随机地址所以不要把 Legacy Advertising 和 Extended Advertising 的随机地址配置混在一起。十一、Random Address 不是随便生成一个 6 字节地址虽然参数名叫Random_Address但是它不是任意 6 字节都可以。BLE Random Device Address 主要分为Random Device Address ├── Static Device Address └── Private Device Address ├── Resolvable Private Address └── Non-resolvable Private Address不同类型的 Random Address对最高两个 bit 有不同要求。简单理解1. Static Device AddressStatic Random Address 的最高两个 bit 应为11它是随机生成的 48-bit 地址但是一旦初始化后在设备重新上电前不能改变。它可以作为 Identity Address。2. Non-resolvable Private AddressNon-resolvable Private Address 的最高两个 bit 应为00它会变化不能被解析出身份不能作为 Identity Address。3. Resolvable Private AddressResolvable Private Address 的最高两个 bit 应为01它会变化但是可以通过 IRK 解析出真实身份。它本身不能作为 Identity Address但是可以被解析到某个 Identity Address。十二、一个容易踩坑的点Own_Address_Type 必须配合使用只调用HCI_LE_Set_Random_Address并不代表广播一定使用这个随机地址。它只是把随机地址设置到 Controller 中。是否真的使用它还要看LE Set Advertising Parameters command中的Own_Address_Type如果Own_Address_Type配置为 Public Device Address那么即使你设置了 Random AddressLegacy 广播也不会使用这个 Random Address。所以关键关系是LE Set Random Address 设置 Random Device Address 的具体值 LE Set Advertising Parameters 通过 Own_Address_Type 决定广播是否使用 Random Device Address十三、推荐配置流程如果要让 Legacy 广播使用随机地址推荐流程如下1. HCI_LE_Set_Advertising_Enable Advertising_Enable 0x00 先关闭广播 2. HCI_LE_Set_Random_Address Random_Address 需要使用的 Random Device Address 3. HCI_LE_Set_Advertising_Parameters Own_Address_Type Random Device Address 4. HCI_LE_Set_Advertising_Data 配置广播数据 5. HCI_LE_Set_Scan_Response_Data 配置扫描响应数据可选 6. HCI_LE_Set_Advertising_Enable Advertising_Enable 0x01 开启广播这样随机地址才会在 Legacy 广播流程中生效。十四、常见错误Command Disallowed如果你在广播已经开启时执行HCI_LE_Set_Random_Address可能会失败并返回Command Disallowed 0x0C原因是 Controller 当前正在使用相关地址规范不允许在这些流程启用期间修改随机地址。常见触发场景Legacy 广播已经开启 扫描已经开启 正在创建连接解决方式先关闭广播 / 扫描 / 连接创建流程 再设置随机地址 然后重新开启对应流程十五、和 Filter Accept List 的关系LE Set Random Address command和Filter Accept List不是一回事。LE Set Random Address 配置本设备使用的随机地址 Filter Accept List 配置允许名单用来过滤对端设备比如 Peripheral 广播时LE Set Random Address影响的是我这个广播设备用什么地址发出去而 Filter Accept List 影响的是我允许哪些对端设备来扫描我、连接我两者是不同维度。十六、和 Resolving List 的关系LE Set Random Address也不是 Resolving List。LE Set Random Address 设置本设备当前要使用的 Random Device Address Resolving List 用于通过 IRK 解析对端设备的 Resolvable Private Address如果你只是想让本设备使用一个 Static Random Address 做 Legacy 广播那么通常配置LE Set Random Address Own_Address_Type Random Device Address就可以。但如果涉及隐私地址、RPA、IRK、地址解析那就会涉及Resolving List Local IRK Peer IRK Address Resolution Identity Address这已经不是单纯LE Set Random Address一个命令能解决的事情。十七、总结LE Set Random Address command是 BLE Legacy 广播中非常重要的一个地址配置命令。它的核心作用是由 Host 设置 Controller 中的 LE Random Device Address。在 Legacy 广播中如果希望广播包中使用 Random Device Address那么通常需要先执行 HCI_LE_Set_Random_Address 再在 HCI_LE_Set_Advertising_Parameters 中配置 Own_Address_Type 最后重新 Enable Advertising需要特别注意1. Random_Address 是 6 字节也就是 48-bit 地址 2. Random Address 不是随便填必须符合 BLE Random Device Address 的格式 3. 广播开启、扫描开启、正在创建连接时可能不允许修改 Random Address 4. 对 Legacy Advertising 来说它影响广播随机地址 5. 对 Extended Advertising 来说它不设置广播随机地址只影响扫描和发起连接 6. Extended Advertising 的广播随机地址要使用 HCI_LE_Set_Advertising_Set_Random_Address一句话总结LE Set Random Address 负责设置“本设备的随机地址” Own_Address_Type 负责决定“后续广播/扫描/连接流程是否使用这个随机地址”。