本文共 4809 字,大约阅读时间需要 16 分钟。
ESP32 是一款低功耗、高集成度、性能稳定的 Wi-Fi 和蓝牙双模芯片,广泛应用于物联网开发。它采用 2.4 GHz Wi-Fi 加蓝牙双模技术,基于 TSMC 40nm 制程,具备低功耗、高性能和安全可靠的特点。ESP32 芯片集成双核 160 MHz MCU、浮点运算单元 (FPU)、硬件安全加速器、多种传感器以及丰富的外围接口,为物联网应用提供了强大的处理能力和扩展性。其外围器件不超过 10 个,能够实现高效的数据处理、可靠的安全性能以及多协议通信功能。ESP32 还支持混杂模式嗅探空中报文,适用于多种无线监控场景。
本文旨在利用 ESP32 的混杂接收模式,捕获空中数据流,解析并分析无线设备发送的 Probe Request 帧,计算周围区域的人流量。通过 MQTT 协议将数据发送至 OneNet 物联网平台,实现人流量的实时监控和云端数据处理。这一方案不仅能够提供科学的数据分析,还能便捷地实现数据的可视化展示,满足多行业的安保和监控需求。
登录 OneNet 平台后,进入开发者中心,创建新的物联网产品。技术参数配置如下:
产品创建完成后,会生成产品 ID 和设备 ID,需在后续程序中填充这些信息。
在 OneNet 平台上,选择“折线图”类型,设置坐标轴,完成应用框架配置。目前数据流尚未上报,需等待设备端数据上报后选择数据流。
git clone https://github.com/espressif/esp-iot-solutioncd esp-iot-solutiongit submodule update --init --recursive
本 Demo 位于 esp-iot-solution/examples/check_pedestrian 目录。
根据平台选择:
esp-iot-solution/submodule/esp-idf/docs/get-started/windows-setup.rst 搭建编译环境。esp-iot-solution/submodule/esp-idf/docs/get-started/linux-setup.rst 搭建编译环境。在 main/include/onenet.h 中填充 OneNet 参数:
#define ONENET_DEVICE_ID "*****"#define ONENET_PROJECT_ID "*****"#define ONENET_AUTH_INFO "*****"#define ONENET_DATA_STREAM "******"
export IDF_PATH=~/somepath/esp-iot-solution/submodule/esp-idfexport PATH=/opt/xtensa-esp32-elf/bin/:$PATH
make menuconfig
在“Serial flasher config”中设置默认串口;在“Demo Configuration”中设置 Wi-Fi SSID 和密码。
make flash monitor
编译完成后,程序会自动烧录并运行。按 control+] 退出监控界面。
... (启动信息)I (136) wifi: wifi firmware version: 59e5fabI (136) wifi: config NVS flash: enabledI (136) wifi: config nano formating: disabledI (136) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSEI (146) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSEI (186) wifi: Init dynamic tx buffer num: 32I (186) wifi: Init data frame dynamic rx buffer num: 32I (186) wifi: Init management frame dynamic rx buffer num: 32I (186) wifi: wifi driver task: 3ffbfa0c, prio:23, stack:4096I (196) wifi: Init static rx buffer num: 10I (196) wifi: Init dynamic rx buffer num: 32I (196) wifi: wifi power manager task: 0x3ffc5d8c prio: 21 stack: 2560I (206) phy_init: failed to load RF calibration data (0x1102), falling back to full calibrationI (546) phy: phy_version: 366.0, ba9923d, Oct 31 2017, 18:06:17, 0, 2I (546) wifi: mode : sta (24:0a:c4:04:5a:fc)I (546) SNIFFER: Connecting to AP...I (2236) wifi: n:12 0, o:1 0, ap:255 255, sta:12 0, prof:1I (2246) wifi: state: init -> auth (b0)I (2246) wifi: state: auth -> assoc (0)I (2246) wifi: state: assoc -> run (10)I (2256) wifi: connected with BL_841R, channel 12I (5086) event: sta ip: 192.168.111.111, mask: 255.255.255.0, gw: 192.168.111.1I (5086) SNIFFER: Connected.... (继续人流量检测日志)
在 OneNet 平台上,设备在线状态显示正常,点击设备对应的应用,选择数据流“Pedestrian-flow”,即可查看人流量变化曲线图。注意:默认数据上报周期为 10 分钟,需等待 10 分钟后才能看到曲线。
Probe Request 包属于 802.11 无线局域网协议,基本帧结构如下:
- 标识符- 协议版本- 输入地址- 传输地址- 命令字段- 信息字段- MAC 地址- 信号强度- 时间戳
通过 Wireshark 等抓包工具,可以捕获实际的 Probe Request 包,观察其中的信号强度和 MAC 地址等信息。
Probe Request 判定
在程序中首先检查数据包头是否为 Probe Request:if (sniffer_payload->header[0] != 0x40) { return;} MAC 地址选择过滤
过滤掉来自特定 ESP32 芯片的设备 MAC 地址:for (int i = 0; i < 32; ++i) { if (!memcmp(sniffer_payload->source_mac, esp_module_mac[i], 3)) { return; }} 重复设备过滤
剔除同一设备发送的重复 Probe Request:for (station_info = g_station_list->next; station_info; station_info = station_info->next) { if (!memcmp(station_info->bssid, sniffer_payload->source_mac, sizeof(station_info->bssid))) { return; }} 链表存储设备信息
创建设备信息链表,存储每个设备的信息:if (!station_info) { station_info = malloc(sizeof(station_info_t)); station_info->next = g_station_list->next; g_station_list->next = station_info;} MQTT 数据发布
ESP32 发布 MQTT 消息,将人流量数据发送至 OneNet 平台:uint16_t val = s_device_info_num / 10;char buf[128];memset(buf, 0, sizeof(buf));sprintf(&buf[3], "{\"%s\":%d}", ONENET_DATA_STREAM, val);uint16_t len = strlen(&buf[3]);buf[0] = data_type_simple_json_without_time;buf[1] = len >> 8;buf[2] = len & 0xFF;mqtt_publish(client, "$dp", buf, len + 3, 0, 0); 信号强度划分区域
RSSI 值与距离成反比,通过测量不同区域的 RSSI 值,确定各区域的划分标准。人流量统计
以 10 分钟为一个统计周期,统计该周期内所有设备的出现次数,计算人流量。链表清空与重置
在 10 分钟后,清空设备链表,开始新的监控周期。通过 ESP32 的混杂模式嗅探空中报文,结合 MQTT 协议实现人流量数据的实时监控与云端展示。该方案充分利用 ESP32 的多功能性和低功耗特点,适用于多种无线监控场景。未来可通过优化信号划分算法和多区域监控,提升检测精度和可靠性。
转载地址:http://kxxd.baihongyu.com/