4. 使用 WiFi 6 的 OFDMA 进行多设备通信模拟

任务目标

本案例通过软件方式模拟 WiFi 6 OFDMA(正交频分多址)机制:多个 ESP32-S3 设备在同一信道内并发传输数据时,OFDMA 将信道资源划分为多个资源单元(RU)分配给不同设备,使它们能够并行传输而非串行等待。你将编写一个 Python 模拟程序,对比 OFDMA 与传统 CSMA/CA(载波侦听多址)在相同设备数量和数据负载下的总传输延迟差异,从而直观理解 OFDMA 对多设备并发通信的延迟改善原理。

环境依赖

  • Python 3.8+(无需第三方库,仅使用标准库 random、statistics)
  • 运行平台:任意支持 Python 的 PC 或开发机

核心实现

模拟逻辑如下:

  • OFDMA 模式:所有设备的数据在同一时间窗口内并行传输,总延迟 = 最大单设备传输时间 + 调度开销。
  • CSMA/CA 模式:设备竞争信道,每次仅一个设备传输,其余设备等待,总延迟 = 所有设备传输时间之和 + 退避时间。

模拟参数包括设备数量、每设备数据量、信道速率、OFDMA 子载波数等。通过多次随机试验取平均值,输出两种模式的延迟对比。

import random
import statistics

# ========== 模拟参数 ==========
NUM_DEVICES = 8            # 设备数量
DATA_PER_DEVICE = 1500     # 每设备数据量(字节)
CHANNEL_RATE = 100e6       # 信道速率(bps)
OFDMA_RU_COUNT = 4         # OFDMA 资源单元数(同时传输的设备数)
SCHED_OVERHEAD = 0.0002    # OFDMA 调度开销(秒)
SLOT_TIME = 0.000009       # CSMA/CA 时隙(秒,802.11ax 标准)
BACKOFF_MAX = 16           # 最大退避时隙数
TRIALS = 100               # 随机试验次数

def transmission_time(data_bytes):
    """计算单设备传输时间(秒)"""
    return data_bytes * 8 / CHANNEL_RATE

def simulate_ofdma():
    """OFDMA:设备分组并行传输,组内并行,组间串行"""
    total_time = 0.0
    devices = list(range(NUM_DEVICES))
    # 按 RU 数量分组
    for i in range(0, NUM_DEVICES, OFDMA_RU_COUNT):
        group = devices[i:i + OFDMA_RU_COUNT]
        # 组内并行:取最大传输时间
        max_tx = max(transmission_time(DATA_PER_DEVICE) for _ in group)
        total_time += SCHED_OVERHEAD + max_tx
    return total_time

def simulate_csma():
    """CSMA/CA:设备串行竞争信道,每次一个设备传输"""
    total_time = 0.0
    for _ in range(NUM_DEVICES):
        # 随机退避时间
        backoff = random.randint(0, BACKOFF_MAX) * SLOT_TIME
        total_time += backoff + transmission_time(DATA_PER_DEVICE)
    return total_time

def run_comparison():
    """运行多次试验,返回平均延迟对比"""
    ofdma_times = []
    csma_times = []
    for _ in range(TRIALS):
        ofdma_times.append(simulate_ofdma())
        csma_times.append(simulate_csma())
    return {
        "ofdma_avg": statistics.mean(ofdma_times),
        "csma_avg": statistics.mean(csma_times),
        "improvement": (statistics.mean(csma_times) - statistics.mean(ofdma_times)) / statistics.mean(csma_times) * 100
    }

if __name__ == "__main__":
    result = run_comparison()
    print(f"OFDMA 平均总延迟: {result['ofdma_avg']*1000:.3f} ms")
    print(f"CSMA/CA 平均总延迟: {result['csma_avg']*1000:.3f} ms")
    print(f"延迟改善: {result['improvement']:.1f}%")

运行与验证

  1. 将上述代码保存为 ofdma_sim.py。
  2. 在终端执行:python3 ofdma_sim.py
  3. 观察输出结果:OFDMA 模式的总延迟应显著低于 CSMA/CA 模式,延迟改善通常在 50% 以上(具体数值取决于设备数与 RU 数的比例)。

通过条件:程序正常运行并输出两组延迟数据,且 OFDMA 延迟小于 CSMA/CA 延迟。若设备数能被 RU 数整除(如 8 设备、4 RU),OFDMA 延迟约为 CSMA/CA 的 1/2 加上少量调度开销。

参数调整与观察

  • 修改 NUM_DEVICES 为 16、OFDMA_RU_COUNT 为 4,观察改善比例变化。
  • 增大 DATA_PER_DEVICE 至 5000,传输时间占比增大,OFDMA 优势更明显。
  • 将 OFDMA_RU_COUNT 设为 1,此时 OFDMA 退化为串行,延迟应与 CSMA/CA 接近。
OFDMA 与 CSMA/CA 多设备传输时序对比(8 设备) 时间 → CSMA/CA(串行) 设备1 设备2 设备3 设备4 设备5 设备6 设备7 设备8 退避 退避 退避 退避 总延迟 = 8 × (传输 + 退避) OFDMA(并行分组) 设备1-4 并行 设备5-8 并行 调度 调度 总延迟 = 2 × (调度 + 最大传输) RU 资源单元 调度开销

上图展示了 8 台设备在两种机制下的传输时序差异:CSMA/CA 中设备必须逐个占用整个信道,而 OFDMA 将设备分为两组,每组内 4 台设备通过不同 RU 并行传输,总时间大幅缩短。

常见问题

  • OFDMA 延迟为何不是严格等于 CSMA 的一半?:因为每次分组传输都包含固定调度开销,且 CSMA 的退避时间具有随机性。
  • 能否模拟更真实的信道噪声?:可以,但本案例聚焦于 OFDMA 与 CSMA 的机制性差异,加入噪声会引入重传逻辑,超出当前目标范围。
  • ESP32-S3 实际支持 OFDMA 吗?:ESP32-S3 的 WiFi 6 功能在特定驱动和 AP 配合下支持 OFDMA 接收,但完整的上行 OFDMA 传输需 AP 调度。本模拟用于理解其原理,实际硬件行为受驱动和固件限制。