资讯动态

解密 esp8266-sniffer 的 RxControl 位域结构体:看懂 ESP8266 底层收包细节

发布时间:2026/8/25 9:14:04 来源:尧图企业网站定制
解密 esp8266-sniffer 的 RxControl 位域结构体看懂 ESP8266 底层收包细节【免费下载链接】esp8266-snifferAn easy experiment which uses the ESP8266 wifi module to look for near smartphones around you项目地址: https://gitcode.com/gh_mirrors/es/esp8266-snifferesp8266-sniffer 是一个用 ESP8266 WiFi 模块实现的极简Wi-Fi 嗅探器它能监听周围手机不断广播的 probe request 探测包并把信号强度、MAC 地址和正在寻找的 SSID 打印到串口。本文将带你逐位拆解它的核心——RxControl位域结构体看懂 ESP8266 底层收包的每一个细节 为什么新手要研究 ESP8266 嗅探器的底层收包很多人以为用 ESP8266 做嗅探只需要调用一个 API。实际上芯片在混杂模式promiscuous mode下每收到一帧就会交给你的回调函数一块原始字节缓冲区——里面既有硬件元信息也有纯数据。想从这坨字节里读出信号有多强、走的哪个信道、是什么编码就必须读懂这块缓冲区的地图。这张地图就是RxControl位域结构体。RxControl 位域结构体全景96 个比特12 个字节完整定义位于 src/main.cpp 第 14-39 行。它利用 C 语言的**位域bit field**语法把 96 个比特正好 12 字节精确切分成 30 个字段struct RxControl { signed rssi:8; unsigned rate:4; // ... 省略完整定义见 src/main.cpp unsigned channel:4; // 本包所在信道 unsigned:12; };按功能分组后每个字段的含义一目了然1️⃣ 基础信号信息第 1-3 位组字段位宽含义rssi8 位有符号接收信号强度dBm数值越大设备越近本项目打印的就是它rate4 位物理层传输速率is_group1 位是否为组播/广播组包2️⃣ 802.11n 判断与长度第 5-11 位组字段位宽含义sig_mode2 位0 802.11n 包1 非 11n 包legacy_length12 位非 11n 包的长度MCS7 位11n 包的调制与编码方案0-76CWB1 位是否为 HT4040MHz 带宽包HT_length16 位11n 包的长度3️⃣ 地址匹配标记字段位宽含义damatch0/damatch1各 1 位目标 MAC 地址是否命中2 个匹配位bssidmatch0/bssidmatch1各 1 位BSSID 是否命中4️⃣ 调制特性与帧状态第 23-26 位组字段位宽含义Smoothing1 位发送功率平滑Not_Sounding1 位是否非 sounding 包Aggregation1 位是否使用了 A-MPDU 聚合STBC2 位空时块编码FEC_CODING1 位是否 LDPC 编码SGI1 位是否短保护间隔rxend_state8 位接收结束状态ampdu_cnt8 位A-MPDU 子帧计数channel4 位本包所在的 Wi-Fi 信道 新手最容易忽略的一点rssi是有符号数signedWiFi 信号强度通常为负值如 -77 dBm用无符号类型读会出现巨大的正数。收包全流程从原始缓冲区到串口输出RxControl并不是孤立存在的。src/main.cpp 第 41-46 行定义了完整的收包结构SnifferPacketSnifferPacket RxControl(12 字节) data[112 字节数据] cnt len整条链路只有三步非常清晰注册回调setup()中调用wifi_set_promiscuous_rx_cb(sniffer_callback)再wifi_promiscuous_enable(1)打开混杂模式回调触发每收到一帧芯片调用sniffer_callback把缓冲区强制转型为SnifferPacket*于是硬件元信息自动落进rx_ctrl纯数据落进data解析过滤showMetadata()先用位运算拆出帧控制字段frameType / frameSubType只放行管理帧中的 probe requestsubtype 0x04然后打印rx_ctrl.rssi、wifi_get_channel()、偏移 10 处的 Peer MAC以及偏移 26 处的 SSID。这就是开头截图里RSSI: -87 Peer MAC: e4:ce:8f:xx:xx:xx SSID: Cheil_Mobile一行的诞生过程 信道跳频技巧1 秒换一次信道看得更广ESP8266 一次只能停在一个信道上收包。项目用 src/main.cpp 第 107-121 行的channelHop()解决了这个问题通过os_timer每1000ms把信道从 1 依次跳到 13再循环。配合RxControl里的channel字段你甚至能知道每个探测包是在哪个信道被捕获的。快速上手3 步编译烧录git clone https://gitcode.com/gh_mirrors/es/esp8266-sniffer cd esp8266-sniffer pio run -t uploadplatformio.ini 已配置好nodemcuv2开发板和 115200 波特率串口接上 USB 打开串口监视器就能看到周围手机发出的探测包滚动输出。写在最后读懂RxControl这一个结构体你就掌握了 ESP8266 混杂模式收包的完整解剖图信号强度、11n 特性、地址匹配、信道信息全部藏在这 96 个比特里。⚠️重要提醒本项目仅用于学习目的只监听手机主动公开广播的、未加密的 probe request 探测包不破解任何私有通信。使用请先确认所在国家/地区的法律法规。更多项目背景可参阅 README.mdWi-Fi 帧格式细节可参考 doc/capture.jpg 所在的示例目录。【免费下载链接】esp8266-snifferAn easy experiment which uses the ESP8266 wifi module to look for near smartphones around you项目地址: https://gitcode.com/gh_mirrors/es/esp8266-sniffer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价