浏览器本地 CSI 抓包质量检查器(GL-MT6000 / mt76)
作者 Wu Jun · 更新于 2026-11-02 · 约 6 分钟
先判断抓包文件本身是否可分析,再决定是否投入时间做清洗、频谱或机器学习。
这个工具只解析本项目公开格式 double timestamp + uint16 length + mt76 CSI payload,
所有 CSI 数据都在当前浏览器标签页内处理,不会上传到服务器 [1] [2]。
本地解析,不上传 CSI 文件;发送端 MAC 只计数,不写入报告。
选择抓包文件后开始本地检查。
抓包质量结果
详细计数与一致性
它检查什么
| 检查层 | 结果 | 说明 |
|---|---|---|
| 文件分帧 | 外层 10 字节记录头、payload 长度、尾部截断 | 发现错位或文件没写完 |
| 闭合测量组 | chain_info bit 15 |
统计完整组、尾部未闭合记录和每组链记录数 |
| 链一致性 | Tx/Rx 组合与众数 | 区分“完整 2×4 组”和缺链组,不把数组下标当物理天线证明 |
| 子载波 | data_num 分布 |
识别 256 子载波组与异常切换 |
| 时间连续性 | 组起始间隔、p50、p95、最大值 | 找出 >1 秒、>5 秒空档和倒序时间 |
| I/Q | payload 字节数与是否全零 | 发现长度不符或没有有效 CSI 数值的记录 |
判读规则
- 通过:至少 10 个闭合组,链组和子载波覆盖达到 98%,存在非零 I/Q,且没有时间倒序;
- 复核:文件可解析,但有尾部截断、缺链、子载波混用、时间倒序或最大空档超过 5 秒;
- 失败:没有闭合测量组、payload 头损坏、没有非零 I/Q,或根本不是本项目抓包格式。
阈值是快速筛查基线,不是 IEEE 标准,也不是对算法精度的保证。正式实验仍应记录固件、驱动、信道、带宽、 采样命令、盘剩余空间和 daemon 内存;需要更完整的统计时,再运行 Python 质量审计。
得到结果之后怎么处理
不要看到“复核”就立刻删文件,也不要看到“通过”就直接训练模型。先按下表把问题放回采集链:
| 结果 | 先核对什么 | 不建议怎么做 |
|---|---|---|
| 外层分帧失败 | 文件是否由本项目 csi_capture 脚本生成;10 字节外层头、长度字段、传输过程是否截断;生成器版本是否一致 |
手工改长度或把其他格式直接当成本容器解析 |
| 没有闭合测量组 | chain_info bit15、frame-type/MAC 过滤、客户端是否持续产生流量、接口名与 daemon 日志 |
直接归因于天线损坏或固件完全不支持 |
| 链组覆盖不足 | 每组实际 Tx×Rx 组合、chain_info、固件与天线配置;缺链是否集中在固定链 |
静默补零、复制其他链,或把数组下标当成物理天线证明 |
| 子载波数量混用 | 采集期间是否切换 20/40/80MHz、RU、客户端带宽或信道配置;不同配置是否被拼进同一文件 | 把 64、256 等不同形状的记录直接拼成矩阵 |
| 时间空档超线 | 同一时间窗的 daemon 日志、AP/客户端计数、抓包端丢包与磁盘停顿;是否本来就没有触发 CSI 上报 | 仅凭文件空档断言 UDP 丢包,或直接伪造均匀时间轴 |
| I/Q 为空或长度不符 | payload 头中的 data_num、实际字节数、字节序、写入是否完整;目标流量是否真正命中过滤条件 |
把全零或短 payload 补成可分析矩阵后继续比较算法 |
| 全部通过 | 保存固件、驱动、信道、带宽、采样命令、文件 SHA-256 和报告;再做独立 session 验证 | 把容器通过解释成人体检测、定位或模型准确率已经成立 |
这张表只处理“文件与采集链是否可用于下一步”,不评价分类器或感知任务的科学有效性。 如果结果需要提交给维护者,请附导出的 JSON/Markdown 报告、相关日志和最小复现步骤; 原始抓包可能仍含未脱敏 MAC 和绝对时间,分享前应使用 数据脱敏流程。
重要边界:空档不等于“网络丢包”
UDP 抓包文件只能证明“这段时间没有写入闭合测量组”。原因可能是网络丢包、接收程序来不及落盘, 也可能是路由器端没有触发 CSI 上报、过滤条件没有命中合法帧,或采集 daemon 已经停止。 除非同时保存了 daemon 日志、网卡计数与抓包端丢包计数,否则不能把单个时间空档归咎为某一种原因。
同样,未闭合尾组常常只是停止采集时恰好截断;它应被隔离,不应被静默补零。这个失败模式与 Python 审计脚本的口径一致,便于网页快速检查和离线复算互相对照。
数据格式与复现
网页解析的是第三方分析机侧文件:
repeated:
float64 host_timestamp
uint16 payload_length
payload_length bytes:
24-byte little-endian mt76 CSI header
int16 I/Q pairs
该格式来自 csi_capture.py 与 csi_capture_linux.sh,payload 头定义沿用 mt76 CSI 上报结构;
本项目工具包公开了脚本、格式说明与真机回环测试 [1] [3]。
想先验证网页行为,可点击上方“加载公开 60 秒样本”。预期结果是
2,777 条记录、347 个完整组、256 子载波、8 条链/组和 1 条尾部残片。
也可以下载同一个脱敏文件后用 Python 复算:
隐私说明
CSI 原始文件本身会被当前页面读取,但不会通过表单、fetch 或分析接口上传。页面只加载站点原有的
JavaScript、样式、字体与广告脚本;这些常规页面请求不应包含你选择的文件内容。导出的报告默认不包含
发送端 MAC,只保留发送端数量。浏览器扩展、恶意脚本或设备被控制时,任何本地处理都不等于绝对安全,
因此仍应在可信设备上处理未脱敏抓包。
参考与数据来源
本文的每条外部结论都标注来源与证据等级(分级标准);标注 E 级的是本项目可复现的实测数据。
- E 级 · 本项目实测
Router CSI Toolkit — 采集/分析/守护脚本(MIT,公开仓库)
Router CSI Lab · 2026
github.com/jjjwu/router-csi-toolkit · 核实: GitHub API 于 2026-11-02 核实公开仓库、抓包质量预检、成功 CI 与 v0.1.3 Release;归档 SHA-256 为 59f144c0…adea7 · 公开版含无第三方依赖的抓包质量预检;网页端检查器使用同一容器定义和边界口径。 - E 级 · 本项目实测
Router CSI Lab — GL-MT6000 (MT7986) Wi-Fi CSI dataset, 10 s sample + 10 min capture
Router CSI Lab · 2026
doi:10.5281/zenodo.23434789 · 核实: CC BY 4.0;SHA-256 已发布;Zenodo DOI 10.5281/zenodo.23434789 · 数据集已获 Zenodo DOI(10.5281/zenodo.23434789),可直接引用。 - 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 能力的补丁正是在这一代码库之上编排。