Nexmon CSI 实战:树莓派 80MHz / 256 子载波、Pi 5 兼容与安全回退

作者 Wu Jun · 更新于 2026-10-29 · 约 6 分钟

Nexmon CSI 由 SEEMOO Lab(TU Darmstadt)维护 [1]。它不是普通用户态抓包工具,而是通过 修改 Broadcom Wi-Fi 固件,让网卡在收到匹配帧时把逐帧 CSI 发送到 UDP 端口;这条路线也在同行评审论文中 有完整描述 [2]。

它能提供高带宽实验数据,但代价同样明确:要匹配芯片与固件、会改动系统网络,失败时还可能暂时失去 Wi-Fi。 因此它适合独立实验 SD 卡和专用测试机,不适合直接在承担家庭网络的唯一树莓派上反复试验。

0. 先看结论

需求 是否适合 Nexmon
固定信道、80MHz、256 个复数 CSI 值 适合,但先核对具体芯片与系统版本
研究不同信道、带宽、帧类型和发送端 适合,参数比消费级路由器灵活
同一块 Wi-Fi 网卡边当日常网络接口边做 24×7 CSI 不建议,采集时接口会被 NetworkManager 释放
没有备份 SD 卡、只靠无线 SSH 操作 不要开始,失败后很容易失去远程入口
已有 MT6000 且目标是全屋长期运行 优先使用本项目已验证的 mt76 路由器 CSI 路线

1. 支持的芯片与树莓派型号

官方矩阵列出四种主要芯片 [1]:

芯片 固件目录 典型设备 带宽
bcm43455c0 7_45_189 Raspberry Pi 3B+ / 4B / 5 20 / 40 / 80MHz
bcm4339 6_37_34_43 Nexus 5 20 / 40 / 80MHz
bcm4358 7_112_300_14_sta Nexus 6P 20 / 40 / 80MHz
bcm4366c0 10_10_122_20 ASUS RT-AC86U 等 20 / 40 / 80MHz

“树莓派 5”不等于“任何 Raspberry Pi OS 都能直接编译”。维护者在专门讨论中说明:

开始前至少记录:

cat /proc/device-tree/model
uname -a
getconf PAGESIZE
iw dev
sudo dmesg | grep -i -E 'brcmfmac|cyfmac|firmware'

Pi 5 的 getconf PAGESIZE 若是 16384,先按要求切换到 kernel=kernel8.img;不要在不了解后果时直接 修改唯一一张系统卡。

2. 实验前准备

  1. 独立 SD 卡:先做整卡镜像,保留第二张可启动卡;
  2. 有线网络或串口控制台:Makefile.rpi unmanage 会断开 NetworkManager 对 wlan0 的管理;
  3. 稳定供电:编译和长时间采集都要求稳定电源;
  4. 一个匹配信道的发送端:手机、ESP32 或第二块网卡均可;
  5. 固定 5GHz 信道:关闭自动选台,避开 DFS 与拥挤主信道;
  6. 本地记录:芯片、固件目录、OS、内核、PAGESIZE、信道、带宽、空间流和采集时间。

上游 Pi 5 路线为了构建旧工具,会安装一些历史兼容包,甚至临时使用归档 Debian 源 [3]。这不是面向生产服务器的加固方案。应当把该卡视为短期实验系统,不保存密码、SSH 私钥、 家庭照片或唯一副本;实验完成后恢复官方固件。

3. 两条安装路径

路径 A:旧 Raspberry Pi OS / 上游传统流程

官方 README 对内核 4.19、5.4、5.10 的 Pi 3B+/4B 给出修改版 brcmfmac 与补丁编译流程。 这条路线高度依赖内核版本,不能把旧命令机械复制到 Pi 5 或新系统。

路径 B:现代 Raspberry Pi OS / Pi 5

对当前 Raspbian / Raspberry Pi OS 和 Pi 5,优先看维护者 Makefile.rpi 指南 [3]。核心顺序如下,不要把代码块当成完整的一键安装脚本; Pi 5 的 armhf 兼容包和 Python 2.7 构建依赖必须按该指南逐项完成:

# 仅 Raspberry Pi 5:先切换到非 16K 页内核,然后重启
grep -qxF 'kernel=kernel8.img' /boot/firmware/config.txt || \
  echo 'kernel=kernel8.img' | sudo tee -a /boot/firmware/config.txt
sudo reboot

sudo apt update
sudo apt full-upgrade
sudo apt install git libgmp3-dev gawk qpdf bison flex make \
  autoconf libtool texinfo xxd libnl-3-dev libnl-genl-3-dev \
  bc libssl-dev tcpdump

git clone --depth=1 https://github.com/seemoo-lab/nexmon.git
cd nexmon
source setup_env.sh
make

# 新路线必须启用 vendor command
cd "$NEXMON_ROOT/utilities/nexutil"
sudo -E make install USE_VENDOR_CMD=1
sudo setcap cap_net_admin+ep /usr/bin/nexutil

cd "$NEXMON_ROOT/patches/bcm43455c0/7_45_189"
git clone --depth=1 https://github.com/seemoo-lab/nexmon_csi.git
cd nexmon_csi
make -f Makefile.rpi install-firmware
make -f Makefile.rpi unmanage
make -f Makefile.rpi reload-full

unmanage 后不要依赖 wlan0 维持 SSH。接着用上游 makecsiparams 生成参数,配置 CSI 并进入 monitor:

# 示例仅说明字段;MAC、帧类型、信道都应按你的实验替换
SENDER_MAC="${SENDER_MAC:?先设置测试发送端 MAC}"
CSI_PARAMS="$(makecsiparams -c 44/80 -C 1 -N 1 -m "$SENDER_MAC" -b 0x88)"
sudo nexutil -Iwlan0 -s500 -b -l34 -v"$CSI_PARAMS"
sudo nexutil -m1
sudo tcpdump -i wlan0 dst port 5500 -w csi-10s.pcap

命令不会内置任何示例 MAC;未设置 SENDER_MAC 时会直接报错。一定要从官方 README 复制当前参数格式。 该仓库曾发生向后不兼容变更,旧博客里的 magic、参数串或命令不能盲用。

4. UDP 包与 CSI 数据格式

当前 README 说明,每个匹配帧、每个已配置的 core/spatial stream 会产生一个 UDP 包,目标端口通常为 5500。载荷结构如下:

uint16  magic = 0x1111
uint8   source_mac[6]
uint16  wifi_sequence
uint16  core_and_spatial_stream
uint16  chanspec
uint16  chip_version
...     CSI samples

bcm43455c0 和 bcm4339 的 CSI 是交错 int16 I / int16 Q;bcm4358 与 bcm4366c0 使用不同的 压缩浮点格式。20 / 40 / 80MHz 分别有 64 / 128 / 256 个复数槽位,每个槽位 4 字节。槽位包含导频、 保护带和空子载波,不能把 256 个值都当成有效信息子载波。

80MHz 接收端也可能收到只占 20MHz 的帧,此时大量子载波接近零并不是“采集坏了”,而是发送帧本身没有占满 80MHz。应同时记录发送端带宽与帧类型,并在分析时移除保护带/空子载波、检查有效子载波比例。

5. 采集参数与数据量预算

粗略预算:若匹配帧率约 100 帧/秒,每个 UDP 含一个 80MHz 流,CSI 本体约 100 × 256 × 4 = 102.4KB/s,再加 Ethernet/IP/UDP 与 pcapng 开销。实际大小取决于匹配帧率、core 数和 spatial stream 数,不能用“标称带宽”反推。本站 MT6000 的 10 分钟、8 链记录文件为 58MB,可作为量级参照。

6. 解析与质量检查

工具 适合场景
CSIKit [4] 多格式解析、可视化、CSV/JSON 导出
csiread [5] Cython 解析、较快的批处理和实时示例

采集完成后至少检查:

检查 合格标准
UDP 包 端口 5500 有持续数据
pcap 可读 tcpdump -r csi-10s.pcap 能读出包
magic / 芯片格式 与当前 Nexmon 版本、芯片型号一致
bandwidth 80MHz 配置下能看到预期 256 槽位
有效子载波 记录帧带宽与零值比例,不把全部槽位当有效
时间轴 统计包间隔,报告 p95 与最大值
过滤 发送端 MAC 与 frame type 符合配置

7. 常见故障

现象 原因 优先检查
编译在 Pi 5 失败 仍使用 16K 页内核 getconf PAGESIZE、kernel=kernel8.img
nexutil 命令被拒绝 未用 vendor command 编译 USE_VENDOR_CMD=1
没有任何 UDP 没流量、MAC/帧类型过滤错误 ping/iperf、tcpdump、过滤参数
chanspec 异常或接口未 up 网卡未启动、另一程序改信道 nexutil -k、关闭 wpa_supplicant
80MHz 大部分为空 收到 20MHz 控制帧或发送端未占满 看发送端带宽和帧类型
恢复后 Wi-Fi 消失 固件 alternative 或驱动未恢复 sudo update-alternatives --config cyfmac43455-sdio.bin
运行数风流中断 供电、过热、距离或干扰 固定信道、检查温度和供电

8. 安全回退

实验完成后,必须恢复到可正常联网的固件:

make -f Makefile.rpi restore-wifi

如果命令失败,使用备用 SD 卡启动,或用读卡器恢复整卡镜像。不要在没有串口、显示器和备用卡的情况下, 把一张卡同时用于实验、远程管理和唯一数据存储。

9. 与 ESP32、MT6000 的取舍

项目 Nexmon + Pi ESP32 CSI MT6000 + mt76 CSI
典型带宽 20–80MHz 20MHz,部分 40MHz 本项目实测 HE80
典型子载波 64 / 128 / 256 槽位 30–64 个实测子载波 256 个复数槽位
灵活换信道/带宽 高 中 中
长期运行 需专门维护实验系统 低功耗、单房间 适合已有路由器长期部署
主要风险 固件、内核、网络被改坏 采样率和干扰 驱动补丁与路由器性能调优

站内继续阅读:树莓派两种角色 · ESP32 CSI 入门 · MT6000 复现教程 · 本站 10 分钟数据集

参考与数据来源

本文的每条外部结论都标注来源与证据等级(分级标准);标注 E 级的是本项目可复现的实测数据。

  1. C 级 · 官方资料 seemoo-lab/nexmon_csi — CSI extraction on various Broadcom Wi-Fi chips
    SEEMOO Lab, TU Darmstadt
    github.com/seemoo-lab/nexmon_csi · 核实: GitHub API 2026-10-29 (stars 479, last push 2026-09-30; README lists bcm43455c0 on Raspberry Pi 3B+/4B/5)
  2. B 级 · 同行评审 Free Your CSI: A Channel State Information Extraction Platform For Modern Wi-Fi Chipsets
    F. Gringoli, M. Schulz, J. Link, M. Hollick · Proceedings of the 13th ACM Workshop on Wireless Network Testbeds, Experimental Evaluation & Characterization · 2019
    doi:10.1145/3349623.3355477 · 被引 334 · 核实: Crossref API 2026-10-29 (334 citations; DOI and venue resolved) · Nexmon CSI 平台的同行评审论文,说明其固件补丁与逐帧 CSI 提取路线。
  3. C 级 · 官方资料 Raspberry Pi 5 and recent Raspberry Pi OS kernel versions — Makefile.rpi guide
    SEEMOO Lab, TU Darmstadt · 2026
    github.com/seemoo-lab/nexmon_csi/discussions/395 · 核实: Official maintainer discussion fetched 2026-10-29; documents Pi 5 kernel=kernel8.img, USE_VENDOR_CMD=1, capture and restore-wifi · 项目维护者给出的现代树莓派路线;仍需使用独立实验 SD 卡,因为安装步骤会改动固件、驱动和系统组件。
  4. C 级 · 官方资料 Gi-z/CSIKit — Python CSI parsing and visualisation
    G. Zhang
    github.com/Gi-z/CSIKit · 核实: GitHub API 2026-10-11 (stars 307, MIT, last push 2025-02-19) · 支持 Atheros / Intel / Nexmon / ESP32 / FeitCSI / PicoScenes 多种格式。
  5. C 级 · 官方资料 citysu/csiread — fast Cython CSI parser
    S. Zhu
    github.com/citysu/csiread · 核实: GitHub API 2026-10-11 (stars 142, MIT, last push 2024-10-12)