1. WiFi人流统计系统技术概述
在商业综合体、展览场馆和公共交通枢纽等场景中,准确统计实时人流量对运营决策至关重要。传统基于摄像头的方案存在隐私争议和设备成本高的问题,而基于WiFi探测请求帧的统计技术提供了一种低成本、高精度的替代方案。
这套系统的核心原理是:当智能手机等设备开启WiFi功能时(即使未连接网络),会主动发送包含MAC地址的探测请求帧(Probe Request)。我们使用ESP32-C3等低功耗芯片作为嗅探节点,捕获这些帧并提取设备唯一标识,通过去重算法实现人流量统计。
注意:现代移动设备普遍采用MAC地址随机化技术,这给传统统计方法带来挑战。最新方案通过信号强度(RSSI)指纹、设备行为模式等多维度数据进行辅助识别。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构与核心技术解析
2.1 硬件选型:ESP32-C3的优势
乐鑫ESP32-C3成为首选硬件平台,主要基于以下考量:
- 集成2.4GHz WiFi和低功耗蓝牙5.0
- 支持IEEE 802.11b/g/n协议
- 功耗表现优异(深度睡眠电流<5μA)
- 成本控制在$2-3/片
相比树莓派等方案,ESP32-C3在批量部署时可将硬件成本降低80%以上。实际测试中,单节点在-75dBm接收灵敏度下,可覆盖半径约15米的范围。
2.2 探测请求帧捕获机制
设备在以下情况会发送探测请求:
- 周期性扫描可用网络(默认每2-5分钟)
- 用户手动打开WiFi设置界面时
- 设备从睡眠状态唤醒时
关键帧字段解析:
cpp复制struct probe_request {
uint8_t frame_control[2]; // 类型子类型标识
uint8_t duration[2];
uint8_t receiver[6]; // 广播MAC(FF:FF:FF:FF:FF:FF)
uint8_t transmitter[6]; // 设备真实MAC
uint8_t seq_ctl[2];
uint8_t timestamp[8];
uint8_t beacon_interval[2];
uint8_t capability[2];
// 可选SSID等字段
};
2.3 MAC地址随机化应对策略
Android 8+和iOS 14+设备默认启用随机MAC特性,表现为:
- 每次探测使用不同MAC
- 不同SSID探测使用不同MAC
- 设备重启后MAC变化
我们的解决方案:
- 信号指纹匹配:记录RSSI波动模式
- 探针时序分析:设备有固定探测间隔
- 多AP协同定位:通过三角测量确认设备位置
- 行为特征建模:结合设备支持的速率集、信道偏好等
3. 系统实现细节
3.1 ESP32-C3固件开发
使用乐鑫IDF开发环境,核心捕获逻辑:
cpp复制void wifi_sniffer_init() {
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
wifi_promiscuous_filter_t filter = {
.filter_mask = WIFI_PROMIS_FILTER_MASK_MGMT_PROBE_REQ
};
ESP_ERROR_CHECK(esp_wifi_set_promiscuous_filter(&filter));
ESP_ERROR_CHECK(esp_wifi_set_promiscuous(true));
ESP_ERROR_CHECK(esp_wifi_set_promiscuous_rx_cb(sniffer_callback));
}
void sniffer_callback(void* buf, wifi_promiscuous_pkt_type_t type) {
if (type != WIFI_PKT_MGMT) return;
const wifi_promiscuous_pkt_t* pkt = (wifi_promiscuous_pkt_t*)buf;
const wifi_ieee80211_mac_hdr_t* hdr = &pkt->rx_ctrl;
if (hdr->frame_ctrl.subtype == 0x04) { // Probe Request
process_probe_request(pkt->payload, pkt->rx_ctrl.rssi);
}
}
3.2 数据聚合与去重
采用时间-空间双重去重算法:
- 时间窗口:5分钟内的相同设备视为一次出现
- 空间去重:多个AP检测到同一设备时,取信号最强的记录
Redis存储结构设计:
bash复制# 设备指纹哈希
HSET device:fingerprint 34:4b:50:xx:xx:xx '{"rssi_hist":[-65,-67,-63],"last_seen":1630000000}'
# 实时人数统计
ZADD location:entrance 1630000000 34:4b:50:xx:xx:xx
EXPIRE location:entrance 3600
3.3 可视化后台搭建
使用Python+Flask构建管理后台,关键功能:
- 实时热力图显示
- 人流量趋势分析
- 驻留时间统计
- 设备回头客识别
数据管道架构:
code复制[ESP32-C3] --MQTT--> [Mosquitto] --Telegraf--> [InfluxDB]
|
[Grafana]
|
[Flask API]
4. 部署优化与实测数据
4.1 场地部署方案
典型商场部署参数:
| 区域类型 | 节点密度 | 安装高度 | 天线类型 |
|---|---|---|---|
| 出入口 | 2-3个/门 | 2.5-3m | 全向天线 |
| 中庭 | 1个/50㎡ | 4-6m | 高增益定向 |
| 商铺走廊 | 1个/20m | 2m | 贴片天线 |
4.2 性能实测对比
某购物中心对比测试数据(8:00-22:00):
| 指标 | 摄像头统计 | WiFi统计 | 误差率 |
|---|---|---|---|
| 总人流量 | 12,847 | 13,102 | +2.0% |
| 峰值时段人数 | 1,532 | 1,488 | -2.9% |
| 平均驻留时间 | 48min | 51min | +6.2% |
4.3 常见问题排查
-
SPI通信异常:
- 检查ESP32-C3的GPIO6-11专用SPI引脚配置
- 确认flash_mode设置为DIO(非QIO)
- 降低SPI时钟频率至20MHz以下
-
信号覆盖不均:
- 使用wifi_analyzer工具检测信道干扰
- 调整节点间信道分布(1/6/11错开)
- 添加外置天线增强定向覆盖
-
数据漂移问题:
- 部署参考节点用于RSSI校准
- 采用卡尔曼滤波平滑信号波动
- 设置-85dBm的信号强度阈值
5. 隐私保护与合规要点
虽然系统仅捕获公开的探测帧,仍需注意:
- 数据存储加密:MAC地址需HMAC-SHA256哈希处理
- 保留期限控制:原始数据不超过24小时
- 显著位置设置告知牌:"本场所使用WiFi信号分析技术进行客流统计"
- 提供opt-out机制:关闭WiFi可避免被统计
实测发现约78%的iOS设备和62%的Android设备会发送探测请求。在典型商业场景中,系统可捕获65%-85%的在场设备,统计误差控制在±5%以内。通过结合蓝牙信标数据,可进一步提升覆盖率至90%以上。
