不买新硬件:用 GL-MT6000 路由器拿到 256 子载波 CSI

2026-10-11 · 约 4 分钟

这篇是完整复现路线:一台 GL-MT6000(MT7986)路由器,不额外买网卡,拿到 80MHz、256 子载波的 CSI。 文中的每一步都在真机上跑过,包括失败与回退。

本文所有性能数字均为本项目可复现的一手实测(E 级):原始抓包、脚本与 SHA-256 校验值一并公开 [2] [3]; mt76 驱动与补丁的出处为上游开源仓库 [1]。

0. 先看结论

项目 实测值
硬件 GL-iNet GL-MT6000(MT7986A + MT7976)
系统 OpenWrt SNAPSHOT,Linux 6.18
Wi-Fi 固件 mt7986_wm.bin 20260515,MD5 3ce21eda…98019
采集接口 独立 AP 接口(如 csi0),5GHz / HE80 / ch44
短测 10 秒 561 帧(55 帧/秒)
长测 10 分钟 57,293 帧(95.5 帧/秒),无 >5 秒断流
每条测量 256 子载波,tx 0/1 × rx 0/1/2/3 共 8 条链
内存 daemon 常驻 ≈5.2MB,稳定

1. 前置条件与风险

⚠️ 刷机有风险。GL-MT6000 有 U-Boot 恢复通道,但必须先演练回退, 并保留原厂固件与配置备份。以下操作仅供个人技术研究。

需要的准备:

  1. 原厂回退固件(.bin)+ 配置备份;
  2. 一条网线 + 能设置静态 IP 的电脑;
  3. 构建环境(Linux + Docker,或直接使用现成镜像);
  4. 目标客户端设备(手机即可),用于产生 CSI 测量流量。

2. 路线图

① 只读调研原厂 → ② 编译带 CSI 补丁的 OpenWrt → ③ 刷机
→ ④ 配置独立 AP 接口 → ⑤ 开启 CSI(frame-type + MAC 过滤)
→ ⑥ 用 daemon 收 UDP → ⑦ 验证数据完整性 → ⑧ 长稳与工程化

3. 编译要点(mt76 CSI 补丁)

CSI 能力来自三个部分,缺一不可:

组件 作用
9000-mt7915-csi-implement-csi-support.patch 在内核 mt76 驱动里加 CSI 控制与上报(nl80211 vendor 命令 + debugfs)
mt76-vendor 工具 下发 CSI 控制命令(启停、MAC 过滤、frame-type)
mt76-csi-daemon + LuCI 页面 持续采集、UDP/ubus/REST 输出与可视化

这三部分都建立在 OpenWrt 开源的 mt76 驱动之上 [1]。

固件版本很关键:MT7986 需要 20260515 版 Wi-Fi 固件(旧版本里 CSI 上报路径没有调用者, 表现为"使能成功但永远没有数据")。

# 校验刷进去的固件版本(在路由器上执行)
md5sum /lib/firmware/mediatek/mt7986_wm.bin
# 期望:3ce21edabe201608e7bec0dd16898019
dmesg | grep -i "WM Firmware"
# 期望:Build Time: 20260515…

4. 刷机与首启配置

  1. 断电按住 Reset 上电进入 U-Boot(电脑静态 IP 192.168.1.2,访问 192.168.1.1);
  2. 上传 sysupgrade 镜像并等待重启;
  3. 首启用 LAN 直连,配置 LAN 网段(例如 192.168.9.1/24,避免与上游冲突)。

踩坑:如果电脑的 Wi-Fi 网关和上游路由器都在 192.168.1.0/24, 访问 U-Boot 页面时必须绑定有线网卡(curl --interface ethX),否则会走错出口。

5. 开启 CSI(最关键的一步)

CSI 有两个必须同时满足的条件,缺一个就"永不落盘":

# ① 设置 frame-type 过滤(0,34 = 目标帧类型),否则固件不上报
mt76-vendor <iface> set csi ctrl=1,0,0,34

# ② 把目标设备加入 MAC 过滤表(只上报过滤表里的站点)
mt76-vendor <iface> set csi ctrl=1,0,0,0 macaddr=<client-mac>

# 验证(debugfs)
cat /sys/kernel/debug/ieee80211/phy1/mt76/csi_stats
#   CSI enable: 1
#   mac: <client-mac>, interval: 0

要点:

6. UDP 数据格式(自己写解析器必备)

daemon 默认把每条链记录以 UDP 发出(主机字节序,小端):

偏移 字段 说明
0 ts (uint32) 微秒时间戳(实测 600s 对应 599,931,160 µs)
4 ta[6] 发送端 MAC
10 rssi (int8) dBm
11 snr (uint8) dB
12 data_bw 带宽编码
13 pri_ch_idx 主信道索引
14 rx_mode 接收模式
15 pad 对齐
16 data_num (uint16) 子载波数(本项目 = 256)
18 tx_idx (uint16) 发送链编号
20 rx_idx (uint16) 接收链编号
22 chain_info (uint16) bit15 = 本条是本次测量的最后一条链
24… int16 I/Q 交错 每子载波 4 字节(I、Q 各 2)
# 最小解析示例(UDP payload;抓包文件前面还有 10 字节记录头)
import struct
HDR = struct.Struct("<I6sbBBBBBHHHH")   # ts, ta, rssi, snr, bw, ch, mode, pad, num, tx, rx, chain
ts, ta, rssi, snr, bw, ch, mode, _pad, n, tx, rx, chain = HDR.unpack_from(buf, 0)
iq = struct.unpack_from(f"<{n*2}h", buf, HDR.size)

7. 验证与长稳

# 10 秒快测
scripts/csi_capture_session.sh 10
# 10 分钟长稳
scripts/csi_capture_session.sh 600

判定标准(本项目实测通过):

8. 五个必修的坑

  1. 没有 frame-type 过滤 → 零数据(最常见);
  2. 忘记加 MAC 过滤 → 抓到别的设备或什么都抓不到;
  3. 固件版本不对 → 使能成功但没有上报;
  4. CSI 抢了家用 SSID 的带宽/速率 → Wi-Fi 突然变慢(见排障文章);
  5. 依赖公网做测试 → 结果不可复现:内网自建文件/流量源,才能测出真实链路性能。

9. 下一步

参考与数据来源

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

  1. C 级 · 官方资料 openwrt/mt76 — mac80211 driver for MediaTek Wi-Fi chipsets
    OpenWrt project / MediaTek
    github.com/openwrt/mt76 · 核实: GitHub API 2026-10-11 (stars 890, last push 2026-10-08) · 本项目使用的开源 mt76 驱动上游;CSI 能力的补丁正是在这一代码库之上编排。
  2. E 级 · 本项目实测 本项目 10 分钟实测抓包(57,293 条 / 600.0 s,SHA-256 00373f83…95e2)
    Router CSI Lab · 2026
    csi.okwujun.pw/zh/datasets/ · 核实: 分片重组逐字节校验通过(2026-10-11)
  3. E 级 · 本项目实测 Router CSI Toolkit — 采集/分析/守护脚本(MIT)
    Router CSI Lab · 2026
    csi.okwujun.pw/zh/tools/ · 核实: 仓库打包含 SHA-256,脚本在真机运行

本页含联盟链接(rel="sponsored"),你通过链接购买不会增加成本,本站可获得少量佣金。