我想构建一个应用程序来测量 WiFi 信道负载。这需要计算接收到的数据包的空中时间。我的做法是:
1. 将ESP32配置为混杂模式,开启接收各种数据包。
2. 在rx回调中,获取包速率和包长度。
3. 使用速率和长度,计算 tx 时间,并添加前导码:air_
time = length * 8 / rate + 192 us。
例如,如果我以 1 Mbps 的速度接收到一个 1000 字节的数据包,则传输时间为:
air_time = 1000 * 8 / 1e6 + 192e-6 = 8192 us。
我的问题是我不知道如何获得数据包速率。目前我检查
wifi_pkt_rx_ctrl_t数据并执行以下操作:
1. 如果数据包是 802.11n (sig_mode == 1),获取带宽(20 或 40 MHz)、SGI 和 MCS,使用
此表进行解码。
2. 如果数据包是 802.11bg (sig_mode == 0),则使用
速率字段。
问题出在第 2 步。我在
速率字段上遇到两个问题: 1.
wifi_pkt_rx_ctrl_t::rate
是如何解释的?它是以 500 kbps 为单位的比特率吗(例如,速率 22 表示 11 Mbps)?或者我应该使用
wifi_phy_rate_t枚举来解释它(例如速率 3 是 11 Mbps)?
2. 独立于我如何解释这个字段,我在我所做的捕获中有不一致的值。例如,我没有看到以 1 Mbps 传输的帧,应该有很多,因为当我使用运行 Wireshark 的 PC 进行捕获时,我看到的主要是信标帧。