You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 09:15:00