BLE扫描可靠性:重复过滤、RSSI窗口与漏报
BLE扫描回调变安静,可能是没有收到匹配报文,也可能是控制器过滤重复、系统延后上报,或者App自己丢弃了更新。不同原因需要不同修复。提高扫描占空比或宣布外设离开之前,应先明确产品究竟需要哪一种观测。
涉及产品资格声明时,应核对SIG的Core 6.0页面及强制更新;本文不是合规检查清单。
适用范围:本文讨论传统BLE广播的无连接观测,以Bluetooth Core 6.0和Zephyr 3.7.0为协议与嵌入式接口基线,Android接口用于说明应用层报告。这些是明确版本边界,不代表最新版。资料核查日期为2026年10月11日,示例与图示均为分析方案,未声称已经测得接收率或测距精度。
先定义指标与分母
配网关注扫描启动到首个合格报告的时间;设备列表关注证据是否新鲜、列表是否稳定;广播载荷监测关注不同业务序号到达多少。这些目标不能混用。扫描器可能很快发现目标,却很少重复上报它。
计算丢包率需要可信的实际发送数量、可比较的时间戳,以及明确的信道与PHY范围。不能用回调数除以标称广播间隔推算的报文数。一次广播事件可能对应多次空口发送,而软件又可能合并或过滤报告。真正要测丢包率时,需要有计数能力的发射端或适当捕获参考。
区分请求的监听时间与实际接收
Core 6.0链路层第4.4.3节将扫描间隔定义为相邻窗口起点的间距,窗口不能大于间隔;信道选择与调度冲突同样影响接收。窗口等于间隔表达连续扫描请求,不保证每个广播都被收到。
例如间隔120毫秒、窗口30毫秒,标称监听比例为百分之二十五。Zephyr 3.7.0的这两个字段采用0.625毫秒单位,对应数值分别为192和48。这只是算术比例,并非百分之二十五的发现概率;报文时机、信道重合、干扰与其他无线任务都会改变结果。

将三层过滤分开记录
控制器重复过滤、主机或系统报告策略、App列表去重属于不同层。Core 6.0传统广播模型中,重复判断可能依据扫描状态期间的广播地址,载荷变化本身不一定构成新报告;广播数据与扫描响应分别处理。因此不能认为传感器字节变化,就一定绕过控制器过滤。
嵌入式扫描器可在其他条件不变时,对比BT_LE_SCAN_OPT_FILTER_DUPLICATE开启与关闭。过滤接受列表也要保持不变,因为允许哪些广播者与是否上报重复是不同问题。手机端则记录公开API实际提供的选项,不能假设应用可以直接控制控制器。
Android还通过扫描设置构造器提供批量报告配置。应尽可能保存ScanResult中的观测时间戳,其时间基准是设备启动后经过的时间。回调到达时间应另存一列,不能把启动相对时间直接与日历时间相减。
界面去重不要抹掉证据
建议在App去重之前维护有容量上限的观测记录,包含会话编号、观测时间、回调到达时间、接口提供的地址与地址类型、报告种类、载荷版本、RSSI和解析结果。原始标识仅在测试确有需要时保留,不应无理由进入日常用户分析日志。
设备列表另行更新:同一行收到多个报告是正常现象,即使名称与类别不变,也应更新最后观测时间和样本数。但“App去重前”仍处于控制器和系统过滤之后。如果下层过滤了重复报告,时间戳变旧不能证明无线接收已经停止。
地址发生变化时需要明确身份策略。名称不适合当唯一键,不同设备可能同名。尚未建立可靠关联的候选,不应仅凭名称相同、RSSI相近就合并。应将两台同型号设备并排测试;错误合并往往看起来像漏报。
RSSI窗口用于稳定显示
RSSI描述接收信号强度,距离推断需要针对部署环境建模和验证。单一门限不能消除朝向、外壳及传播条件的影响。蓝牙SIG的安全与隐私指南也提醒,信号强度不能作为安全的距离证明。
一个待验证的界面方案是维护五秒窗口,至少取得五个有效观测后显示中位RSSI,并保留样本数及最新样本年龄。这些数字是示例,需按产品调整。若必须显示“附近”等类别,可以采用不同进入和退出门限,并增加持续时间条件;尚未建立精度证据时,应称为信号类别。
不要把接口定义的无效RSSI纳入平均,也不要用虚构弱信号填补没有样本的时段。样本不足应返回“观测不足”。先用保存的轨迹检查窗口与状态机,再做运动试验,避免把逻辑错误误认为无线环境变化。
通过成对实验确定边界
- 固定固件、发射功率、位置、朝向、广播模式与载荷,记录扫描器及控制器版本和全部参数。
- 用有时限的会话建立静止基线,不改监听比例,仅比较重复过滤开关。
- 每次只调整窗口或间隔之一,报告发现时延分布,以及观察期内始终未发现的次数。
- 在实际干扰和运动条件下重复,同时保留静止对照组。
- 向App回放重复、载荷变化、损坏及同名设备记录,分别检查解析、新鲜度与显示。
- 确认取消和扫描失败有独立结果,不被错误归为外设超时。
验收应写明支持环境、发现目标及经过实测确定的容许失败率。尚无测量时,应交付方法和不确定性。可靠扫描器需要解释没有证据、证据被过滤,以及已经收到但未显示的区别。