如何对BLE客流量计数器(Paxcounter)过滤仅统计手机设备
仅统计手机MAC地址的Paxcounter改造方案
问题背景
- 当前基于BLE/WiFi的Paxcounter统计精度不足,会将蓝牙鼠标、耳机、手机等所有带MAC地址的设备全部计入客流
- 尝试过旧版本仓库的
VENDORFILTER变量,但过滤效果不准确 - 使用设备为LilyGO LoRa3,支持LoRaWAN
可行改造方案
1. 基于BLE广播包特征过滤手机
手机的BLE广播带有特定特征,可与外设区分:
- 过滤**通用访问配置文件(GAP)**广播类型:手机多发送
AD_TYPE_COMPLETE_LOCAL_NAME或AD_TYPE_SHORT_LOCAL_NAME,名称常包含品牌标识;蓝牙外设多发送服务UUID类广播(如耳机的音频服务UUID) - 解析设备类别(Device Class):手机的设备类别属于
0x0200(电话类),扫描到BLE设备后解析该字段,仅保留符合类别的设备 - 代码改造示例(在BLE扫描回调中添加逻辑):
void ble_scan_callback(esp_ble_gap_cb_event_t event, esp_ble_gap_cb_param_t *param) { if (event == ESP_GAP_BLE_SCAN_RESULT_EVT) { esp_ble_gap_cb_param_t *scan_result = (esp_ble_gap_cb_param_t *)param; uint8_t dev_class[3]; // 提取广播中的设备类别字段 if (esp_ble_resolve_adv_data(scan_result->scan_rst.adv_data, ESP_BLE_AD_TYPE_DEV_CLASS, dev_class, sizeof(dev_class)) == ESP_OK) { // 匹配手机设备类别(0x0200) if ((dev_class[1] == 0x02) && (dev_class[2] == 0x00)) { add_to_bucket(scan_result->scan_rst.bda); } } } }
2. 结合WiFi探针的DHCP请求特征过滤
手机连接WiFi时会发送DHCP请求,其中主机名通常带有手机品牌标识,而鼠标、耳机等外设一般不会发起DHCP请求:
- 在WiFi探针模式下,监听DHCP数据包的
Hostname字段,仅保留包含手机品牌关键字(如"iPhone"、"Huawei"、"Xiaomi")的设备 - 改造点:在WiFi数据包解析函数中添加主机名检查逻辑
3. 优化MAC地址厂商过滤(解决旧版本VENDORFILTER不准确问题)
旧版本厂商MAC前缀列表可能过时,可通过以下方式优化:
- 更新
vendor_array.h中的厂商前缀为最新手机品牌MAC前缀集合(从IEEE官方MAC数据库获取) - 添加LoRaWAN远程更新逻辑:允许远程推送最新厂商前缀,无需重烧固件
- 前缀检查示例代码:
bool is_mobile_vendor(uint8_t *mac) { // 可扩展的手机厂商MAC前缀列表 const uint8_t mobile_vendors[][3] = { {0x00, 0x1A, 0x79}, // Apple {0xDC, 0x2C, 0x26}, // Huawei {0x5C, 0xCF, 0x7F} // Xiaomi }; for (int i = 0; i < sizeof(mobile_vendors)/sizeof(mobile_vendors[0]); i++) { if (memcmp(mac, mobile_vendors[i], 3) == 0) { return true; } } return false; } // 在统计前添加过滤 if (is_mobile_vendor(device_mac)) { add_to_bucket(device_id); }
4. 结合BLE连接尝试(低功耗场景慎用)
手机通常会响应BLE连接请求,而鼠标等外设一般不会:
- 扫描到设备后发起短暂BLE连接请求,若设备响应则判定为手机并计入统计
- 注意:此方法会增加设备功耗,需调整连接超时时间适配场景
注意事项
- 所有改造需在PlatformIO环境下编译,确保ESP32 BLE/WiFi依赖库版本匹配
- 可通过LoRaWAN远程下发过滤规则(如厂商前缀、关键字),提升灵活性
- 需在实际场景中测试验证过滤效果,排除误判情况
内容的提问来源于stack exchange,提问作者Coiny
相关产品推荐
相关产品推荐

