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 都能直接编译”。维护者在专门讨论中说明:
- Pi 5 必须切换到非 16K 页内核,否则 Nexmon 编译失败;
- 新路线使用
Makefile.rpi,不再要求先安装修改版brcmfmac; nexutil必须用USE_VENDOR_CMD=1编译,否则 ioctl 会被驱动拒绝 [3]。
开始前至少记录:
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. 实验前准备
- 独立 SD 卡:先做整卡镜像,保留第二张可启动卡;
- 有线网络或串口控制台:
Makefile.rpi unmanage会断开 NetworkManager 对wlan0的管理; - 稳定供电:编译和长时间采集都要求稳定电源;
- 一个匹配信道的发送端:手机、ESP32 或第二块网卡均可;
- 固定 5GHz 信道:关闭自动选台,避开 DFS 与拥挤主信道;
- 本地记录:芯片、固件目录、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. 采集参数与数据量预算
- 固定信道和带宽,采集开始前用信道扫描确认主信道;
- 用 MAC 与 frame-type 过滤减少无关帧;
- 让发送端持续产生符合过滤条件的 UDP/TCP 流量;
- 先采 10 秒并验证解析,再扩展到 10 分钟;
- 记录
makecsiparams参数、nexutil -k返回的 chanspec 和发送端版本。
粗略预算:若匹配帧率约 100 帧/秒,每个 UDP 含一个 80MHz 流,CSI 本体约
100 × 256 × 4 = 102.4KB/s,再加 Ethernet/IP/UDP 与 pcapng 开销。实际大小取决于匹配帧率、core 数和
spatial stream 数,不能用“标称带宽”反推。本站 MT6000 的 10 分钟、8 链记录文件为 58MB,可作为量级参照。
6. 解析与质量检查
采集完成后至少检查:
| 检查 | 合格标准 |
|---|---|
| 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 级的是本项目可复现的实测数据。
- 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) - 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 提取路线。 - 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 卡,因为安装步骤会改动固件、驱动和系统组件。 - 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 多种格式。 - 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)