Bluetooth LE扫描时如何通过BlueZ基于HCI添加设备白名单
BlueZ HCI 实现LE扫描白名单过滤方案
完全可以通过HCI控制器的白名单机制在硬件层面过滤非目标设备的广播包,既可以避免无关流量涌入,又能获取目标设备的全量广播报文,实现步骤如下:
1. 将目标设备MAC加入HCI白名单
调用BlueZ提供的hci_le_add_white_list接口,把你需要监听的目标设备MAC地址提前添加到蓝牙控制器的硬件白名单中:
// 示例参数:hci_fd为已打开的hci设备句柄 uint8_t addr_type = 0; // 0为公共地址,1为随机地址,根据目标设备实际地址类型填写 bdaddr_t target_addr; // 把目标MAC字符串转为bdaddr_t结构,比如目标MAC是AA:BB:CC:DD:EE:FF str2ba("AA:BB:CC:DD:EE:FF", &target_addr); // 调用添加白名单接口,超时时间设为10000ms int ret = hci_le_add_white_list(hci_fd, addr_type, &target_addr, 10000); if (ret < 0) { // 错误处理,比如控制器白名单已满、权限不足等 }
如果需要添加多个目标设备,重复调用上述接口即可,单蓝牙控制器的白名单容量通常在10~100条区间,满足普通场景需求。
2. 修改扫描参数的过滤策略
调整hci_le_set_scan_parameters函数的filter_policy参数为0x01,该参数的含义是仅接收白名单内设备的LE广播包,其余设备的广播包会被控制器直接丢弃,不会上传到主机侧:
// 修改后的扫描参数设置代码 hci_le_set_scan_parameters( hci_fd, static_cast<int>(scan_type), interval, window, own_type, 0x01, // 原来的filter_policy改为0x01,启用白名单过滤 10000 );
3. 调整重复过滤配置
因为已经在硬件层面过滤了所有非目标设备的流量,此时可以将hci_le_set_scan_enable的filter_dup参数设为0关闭重复报文过滤,即可收到目标设备的所有广播报文,不会出现1分钟才能收到一次的问题:
hci_le_set_scan_enable(hci_fd, 0x01, 0x00, 10000); // filter_dup设为0,关闭重复过滤
注意事项
- 若需要修改白名单(增删目标设备),需要先调用
hci_le_set_scan_enable关闭扫描,修改完成后再重新开启扫描 - 如果目标设备使用BLE随机可解析地址,需要提前同步对应的IRK(身份解析密钥),并将
filter_policy调整为支持地址解析的对应值,否则会出现白名单匹配失败的问题 - 不需要白名单时可调用
hci_le_clear_white_list清空控制器白名单
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

