
开门见山说一句如果你做的是 Wi-Fi 感知、无线行为识别、室内定位这一类研究方向那 CSI信道状态信息一定不陌生而 Intel 5300 网卡配合 CSI Tools 这套开源方案几乎是绕不开的“老古董”组合。但偏偏这套工具的安装并不像普通软件一样apt-get install就完事尤其是 Ubuntu 14.04 这个系统版本很多新入坑的人光在内核、固件、驱动上就能折腾好几天。这篇博文就按我自己实际调试的顺序把 CSI Tools 在 Intel 5300 Ubuntu 14.04 上的安装过程、编译逻辑、常见报错和数据验证一次讲清楚。文章适合两类人一是实验室刚接触 CSI 的研究生手里有 Intel 5300 网卡和一台旧电脑想尽快跑通第一个采集实验二是以前装过但换机器后需要重新复现环境想找一份相对完整的操作记录当参考。整篇不会只贴命令我会把每一步背后为什么要这么做的原因也讲明白这样一旦遇到环境差异你也能自己调整而不是卡死在某个报错上。1. 为什么现在还要折腾这套组合价值判断与适用边界很多人看到 Ubuntu 14.04 第一反应是“这个系统已经停止维护多少年了”这没错。但在 CSI 研究这个细分领域里设备老、系统旧不代表不能干活反而意味着驱动接口稳定。CSI Tools 本身依赖的是旧版内核里的无线子系统结构后期内核一直在改 API官方仓库又没有频繁跟进所以新内核上编译很容易报出一堆莫名其妙的错误。Ubuntu 14.04 默认内核 3.13 系列恰好处于一个“既能跑得动补丁又不会太旧装不上编译器”的平衡点这也是为什么大量论文的实验环境描述里写的就是这个组合。1.1 CSI 和 RSSI 的本质差异先花点时间说清楚一个基本概念。RSSI 是接收信号强度指示它只是一个单点数值告诉你信号到了没到、大概强不强但信道状态信息描述的是信号从发送端到接收端之间经过多条路径叠加后在每一个 OFDM 子载波上的幅度和相位变化。你可以把 RSSI 理解成你在游泳池边只看水面总高度而 CSI 是逐点记录整个水面上每个区域的水波纹起伏。Intel 5300 在 WiFi 链路里能向上层驱动暴露这些子载波级的信息CSI Tools 所做的就是把这份信息截获、转存、交给用户态程序。这套能力在动作识别、手势感知、人体存在检测这类研究里非常关键因为人的移动会改变多径传播状态CSI 中的相位和幅度特征也随之变化。而 RSSI 只会告诉你整体强度变了丢失了大量细节。所以很多论文宁可用老旧网卡也要坚持拿到 CSI。1.2 为什么偏偏是 Intel 5300 加 Ubuntu 14.04Intel 5300 是 802.11n 时代的 mini-PCIe 无线网卡最高支持三根天线、3x3 MIMO而 CSI Tools 正是基于它的 iwlwifi 驱动做了修改让驱动在收到每个数据包时额外导出一份 CSI 记录。市面上能拿到 CSI 的消费级网卡并不多Atheros 系列有开源驱动但大多是单天线、数据格式不统一Intel 5300 因为论文积累多、参考代码全成了事实上的入门标准。Ubuntu 14.04 的出现则和内核版本绑定有关。CSI Tools 的补丁需要针对特定版本的内核源码进行应用版本差别太大会产生大量 context offset手工修正非常痛苦。在 14.04 上看不到特别新的内核正好和补丁的兼容范围重叠。另一个现实原因是很多实验室的老台式机或旧笔记本只认这些老系统装新发行版反而没有对应驱动支持。2. 安装前把环境钉死硬件识别、内核版本和依赖安装安装这种事最怕的是环境没确认清楚就跟着教程一路往下敲。CSI Tools 不是普通应用它需要改动内核驱动和固件一旦型号不对、内核不匹配后面大概率是浪费时间。建议在动手前花十分钟把环境和硬件确认清楚。2.1 用 lspci 确认网卡型号第一步不是连网线、装依赖而是确认你手里的卡到底是不是 Intel 5300。在终端执行lspci | grep -i network正常会看到类似这样的输出02:00.0 Network controller: Intel Corporation PRO/Wireless 5300 AGN [Shiloh] Network Connection这里一定要认准型号。Intel 5100、6200、6300 和 5300 虽然都走 iwlwifi 驱动但 CSI Tools 的解码逻辑和固件是为 5300 定制的换一张卡之后即使看起来驱动正常拿到的数据也不会是期望的 CSI 格式。如果说的是“Intel WiFi Link 5100 AGN”就不要强行折腾了要么换硬件要么走别的 CSI 方案。另外如果是在台式机上用转接卡连接还需要确认插槽供电和 BIOS 里是否打开了 Wireless LAN 选项。如果lspci里完全看不到设备别急着重装系统先进 BIOS 找找有没有禁用无线网络相关项。2.2 系统版本和内核头文件系统推荐使用英文环境下的 Ubuntu 14.04 LTS安装完成后先确认内核版本uname -r跑出来的版本一般是3.13.0-xx-generic。后面编译驱动模块时需要内核头文件直接安装对应版本sudo apt-get update sudo apt-get install -y build-essential git iw wireless-tools linux-headers-$(uname -r) libncurses-dev libssl-dev这里一个小小的坑是很多人用linux-headers-generic安装但系统重启之后换了内核再编译时会发现/lib/modules/$(uname -r)/build指向不存在导致编译报错。最稳妥的做法是编译之前跑一遍uname -r并ls /lib/modules/$(uname -r)/build确认软链接存在。2.3 停用网络管理器Ubuntu 桌面版默认启用 NetworkManager它会自动接管无线网卡名为wlan0的接口可能随时被切到某个已知网络。CSI 采集时网卡需要进入 monitor 模式如果 NetworkManager 在后台捣乱monitor 模式会被反复拉回 managed。更麻烦的是它可能自动连接一个无线网络让信道跳来跳去。建议直接把 NetworkManager 服务停掉sudo service network-manager stop如果是服务器版没有图形界面也可以选择不再启动网络管理服务。实际实验网络可以通过有线网口连接网线CSI 这只无线网卡专门用来收包和发包不要让系统去管理它。这样能省掉后面很多莫名其妙的“monitor 起不来”问题。3. 源码拉取、内核补丁与固件替换核心安装链路环境就绪后进入正题。整套 CSI Tools 安装链路可以概括为三步拉取源码、给内核或驱动打补丁、替换固件。官方仓库里的 README 是最权威的参考但文字少、细节少很多步骤新人容易漏我在这里把关键环节拆开讲。3.1 获取官方仓库用 git 把两个仓库克隆到当前用户目录cd ~ git clone https://github.com/dhalperi/linux-80211n-csitool.git git clone https://github.com/dhalperi/linux-80211n-csitool-supplementary.git第一个仓库是核心补丁和内核相关代码第二个仓库包含固件、脚本、MATLAB 解析工具。两个目录分别是纯英文名建议不要做任何改名后续命令里会多次引用。克隆完成后先不要急着操作打开linux-80211n-csitool里的 README 看一遍。重点看它建议的内核版本。如果官方 README 里给的是老内核版本但你的 Ubuntu 14.04 用的版本不同说明要么降级内核要么手工调整补丁。对于大多数实验室复现场景推荐直接安装和补丁兼容的版本少走弯路。3.2 编译打过补丁的内核CSI 数据的导出并非纯用户态程序能完成需要修改 iwlwifi 驱动让它在每收到一个数据包后把 CSI 记录通过内核接口传出去。因此常见做法是把补丁应用到对应版本的内核源码然后重新编译内核。具体步骤可以压缩成下面几条不同版本细节略有差异cd /usr/src # 将 linux-80211n-csitool 的补丁目录展开查看 ls ~/linux-80211n-csitool/patches/确认补丁文件后下载或解压对应版本的内核源码。Ubuntu 14.04 可以通过 apt 获取源码sudo apt-get install dpkg-dev linux-source cd /usr/src sudo tar -xf linux-source-*.tar.bz2 cd linux-source-* sudo patch -p1 ~/linux-80211n-csitool/patches/对应补丁文件补丁应用成功后编译配置阶段可以用 oldconfig也可以先 menuconfig 检查必要的无线选项有没有打开。编译命令一般用make oldconfig make -j$(nproc) sudo make modules_install install sudo update-grub编译时间取决于机器配置四核机器通常也要一两个小时不要在虚拟机里硬扛预留足够内存和磁盘空间。重启后进入新内核再用uname -r确认版本已经切换。如果版本号和编译前的 Ubuntu 默认内核一致说明可能没有改 grub 启动顺序需要手动进入高级选项选择新安装的内核。3.3 替换 5300 固件内核编译不是全部还需要把 CSI Tools 提供的固件复制到系统固件目录。这一步的作用是让无线网卡在运行时能识别和上报 CSI 信息。先备份原固件sudo cp /lib/firmware/iwlwifi-5000-2.ucode /lib/firmware/iwlwifi-5000-2.ucode.bak sudo cp ~/linux-80211n-csitool-supplementary/firmware/iwlwifi-5000-2.ucode /lib/firmware/iwlwifi-5000-2.ucode注意文件名可能因为网卡硬件版本不同而略有不同可以通过查看 dmesg 里驱动所请求的固件名来确认dmesg | grep iwlwifi装上自定义固件后如果之后实验需要回到普通 Wi-Fi 模式记得用备份文件还原否则可能影响网卡的常规通信能力。3.4 加载驱动并创建 monitor 接口固件替换完成后卸载并重新加载驱动sudo modprobe -r iwldvm sudo modprobe -r iwlwifi sudo modprobe iwlwifi然后查看系统日志确认驱动加载没有报错dmesg | tail -n 20看到类似iwlwifi 0000:02:00.0: loaded firmware version ...的日志后再创建 monitor 接口。这里有两种方式一种是直接改现有接口另一种是新建一个mon0sudo ip link set wlan0 down sudo iw dev wlan0 set type monitor sudo ip link set wlan0 up或者sudo iw dev wlan0 interface add mon0 type monitor sudo ip link set mon0 up新建接口的好处是 wlan0 还可以留作 managed 模式方便后期走常规网络通道但 NetworkManager 停掉之后两者都能满足采集需求。用iw dev查看接口是否处于 monitor 状态即可确认。4. 第一次采集 CSI从 log_to_file 到 MATLAB 解析验证安装完成不代表能采到数据还需要让网卡产生或接收到足够的数据包。CSI 记录跟数据包是绑定的没有流量就没有 CSI。很多人第一步卡在这里感觉工具都装好了就是采不到数据。以下是我验证环境是否跑通的标准流程。4.1 制造流量最简单的方式是把网卡连接到一个无线路由器上然后从有线侧 Ping 这个无线接口的 IP。但如果你已经停用了 NetworkManager手动连接 Wi-Fi 会麻烦一些。更省事的做法是直接使用注入或监听模式从另一台设备或本机网卡向该无线网卡发送 ping 包。假设你已经建立了一个 monitor 模式的mon0接口并且有一个可用的无线 AP 可以让网卡关联那么可以在一个终端启动采集sudo ~/linux-80211n-csitool-supplementary/scripts/log_to_file csi.dat在另一个终端持续发送 pingping -i 0.1 192.168.1.1-i 0.1表示每 0.1 秒发一个包这样采集文件里能积累足够多的 CSI 记录。如果希望更密集可以改成ping -f但要注意不要让缓冲区溢出数据量太大可能导致丢包。建议保持 10~20 秒然后 CtrlC 结束采集。4.2 读取和检查 CSI 数据采集完成后csi.dat文件里是二进制数据。官方 supplementary 仓库提供了 MATLAB 解析脚本在~/linux-80211n-csitool-supplementary/matlab目录下有一个read_bf_file.m函数。打开 MATLAB切换到该目录执行csi_trace read_bf_file(../csi.dat); csi_entry csi_trace{1}; csi csi_entry.csi; size(csi)正常情况下size(csi)会得到类似1 x 30或3 x 30的矩阵。如果只有 1 行说明当前只用了 1 根天线如果是 3 行说明三天线配置已经生效。矩阵长度通常就是 30 个子载波。这个结果就是关键验证信号CSI 数据已经能从 Intel 5300 网卡里实打实地导出来。4.3 判断数据是否有效的三个信号除了矩阵维度还要检查数值是否合理。一是在 MATLAB 里画一下幅度plot(abs(csi));如果幅度曲线平坦且没有太多异常尖峰说明采集正常如果某个子载波幅度为零可能是天线或信道配置问题。二是看csi_entry里的timestamp、rssi字段是否在变化完全不变说明采集的包不够文件里可能只有空记录。三是看文件大小几十 KB 以下往往意味着只采到几十个包数据量偏小不足以做分析。常见但容易忽略的问题是采集脚本写权限。如果命令以普通用户执行但当前目录在/root下会直接权限拒绝。最简单的做法是给命令前加sudo或把输出文件放在当前用户有写权限的目录。5. 安装阶段的常见坑与完整排查思路这部分是整篇里最有实际价值的地方。CSI Tools 的安装问题通常不是单一原因而是内核、固件、系统服务叠加导致。我会把我在 Ubuntu 14.04 上遇到过的几类问题按排查链路逐一列出。5.1 编译内核时找不到头文件或版本字符串不匹配常见报错是/lib/modules/3.13.0-xx-generic/build: No such file or directory这说明系统没有安装当前内核对应的 headers或者 headers 包安装到了另一个内核版本上。解决方法是重新安装精确版本sudo apt-get install --reinstall linux-headers-$(uname -r)然后检查ls -l /lib/modules/$(uname -r)/build另一个坑是编译时看到vermagic版本不匹配。这种情况通常是 Ubuntu 内核与补丁源码版本不一致导致的。解决办法是重新下载和当前运行内核完全一致的内核源码而不是去仓库里找到一个差不多的版本。如果实在找不到可以手动修改补丁里的偏移量但这不是新手该做的操作更推荐直接切换内核版本。5.2 固件文件加载失败如果dmesg里出现iwlwifi 0000:02:00.0: Direct firmware load for iwlwifi-5000-2.ucode failed十有八九是固件没复制进去或者复制到了错误目录。确认ls -l /lib/firmware/iwlwifi-5000-2.ucode再看权限固件文件不需要执行权限但需要可读。最常见的错误是复制时没加sudo文件被写入失败。如果文件存在但还是报相同错误可能是 Ubuntu 内核需要的固件名不同用dmesg查看它期望的具体名字然后把 CSI 固件改名成对应的名称。注意备份好原始固件切换普通模式时再改回来。5.3 网卡进入 monitor 后立刻恢复 managed这类问题最典型的表现是用iw dev wlan0 set type monitor后iw dev显示 monitor但几秒后又变成 managed。这通常不是网卡驱动问题而是系统网络管理服务重新接管了接口。即使在前面执行过sudo service network-manager stop如果 NetworkManager 配置了自动启动或者你用的是桌面环境它可能又自动拉起。彻底解决方式sudo systemctl stop NetworkManager sudo systemctl disable NetworkManager14.04 上如果没有 systemctl就用servicesudo service network-manager stop sudo update-rc.d network-manager disable另外有些版本里 wpa_supplicant 也会参与竞争。如果发现 monitor 状态不稳定可以一并停掉sudo killall wpa_supplicant5.4 采集文件里只有包头没有有效载荷log_to_file脚本能运行采集文件也在增长但 MATLAB 里读取时发现csi_trace里的记录大多数是空结构。这种情况通常不是驱动没有导数据而是没有有效的数据包到达网卡。有一个经验是确保网卡处于 monitor 模式后不需要关联 AP 也能收到环境中其他设备的无线数据帧但如果环境太安静、没有流量采集到的就是空转记录。最可靠的做法还是制造流量比如从另一台电脑 ping 到网卡所在机器或者使用随机包注入工具。另一个容易被忽略的点是网卡在 5GHz 和 2.4GHz 频段的工作方式不同。如果 AP 在 5GHz而你只把网卡设置在 2.4GHz 的信道上同样收不到包。用iw dev mon0 info确认当前信道和 AP 实际信道一致。6. 实验侧的进阶调节信道、带宽与天线配置技巧当数据通道完全打通后接下来需要面向实验需求调整无线参数。CSI 质量和子载波数量受物理层配置影响很大下面这些调整我在实验中验证过可以说每个都直接改变了数据形态。6.1 固定信道与干扰排查无线环境里信道跳变是 CSI 采集的大忌。如果在 2.4GHz 频段实验网卡可能会自动跳到干扰较小的信道导致一段时间前后采集到的 CSI 不在同一频点上后续数据分析会非常混乱。所以采集前一定要手动固定信道sudo iw dev mon0 set channel 362.4GHz 就设置为固定信道比如 6 或 11sudo iw dev mon0 set channel 6然后用iw dev mon0 info确认当前信道。如果发现信道里有大量其他 Wi-Fi 设备换信道重试。一般来说5GHz 的 36、40、44、48 信道在实验室环境相对干净推荐优先实验。6.2 带宽对 CSI 子载波数量的影响Intel 5300 是 802.11n 网卡支持 20MHz 和 40MHz 两种信道带宽。在 20MHz 模式下CSI 数据通常是 30 个子载波如果用 40MHz数据包含的子载波数可能会更多实际数量取决于驱动和固件上报逻辑。带宽增加能带来更多频域采样点但也会让单个符号持续时间变短对多径分辨能力有影响。设置 40MHz 带宽可以使用类似的接口命令但要注意信道组必须匹配。比如 36 信道对应的 40MHz 模式是 HT40 或 HT40−可以用sudo iw dev mon0 set channel 36 HT40如果你只需要复现已有论文建议先固定在 20MHz因为大量已发表实验默认采用这个参数数据格式和后续处理代码都更通用。6.3 天线组合与数据量权衡Intel 5300 支持最多三根天线。天线数越多每次包得到的 CSI 矩阵维度越大数据里包含的空间信息越丰富但数据和存储开销也会成倍增长。实际采集时可以用iw phy相关命令查看天线配置。并不是所有主板上三根天线都能正常工作有些转接卡只接了 2 根或者天线没有正确插入挡板。一个务实的建议是初始验证阶段先只开一根天线确保链路通顺正式实验时再开启三根天线采集因为研究行为识别时常需要利用空间分集和多径信息。天线数量在 MATLAB 解析时看到矩阵行数如果始终只有 1 行检查网卡天线接口和驱动配置。7. 写在最后把这次安装变成可复现资产CSI Tools 这套环境最大的问题是“装完容易重装难”。当你换电脑、换系统或者帮同组同学搭环境时往往会因为忘了某个补丁版本或固件名重新折腾一个星期。所以我强烈建议在安装成功后立刻做一次环境归档。7.1 保存内核、补丁、固件的版本清单记录以下信息并保存到一个文本文件里Ubuntu 具体版本号例如 14.04.6当前内核版本号uname -r两个 git 仓库的 commit idgit rev-parse HEAD使用的补丁文件名固件文件名和 MD5 值同时把csi.dat采集文件和一个最小 MATLAB 解析脚本打包起来。这样即使多年后再来搭建也能快速还原到相同状态。我自己的习惯是在实验目录下放一份ENV_NOTES.md每次调整参数就更新后来再没有因为环境问题浪费时间。7.2 从 CSI Tools 迁移到新平台的时间点也有不少人装到一半会问既然老环境这么麻烦能不能换用更新的 CSI 工具这里给出我个人的判断如果只是复现经典论文里的某个方法Intel 5300 加 CSI Tools 仍然是性价比最高的选择论文里的实验数据大多是这套工具产出的直接复用可以减少变量。但如果研究重点本身就是新物理层特性比如 802.11ax/802.11ac 下的 CSI或者需要更高带宽和更多子载波那确实应该早点迁移到新平台没必要在一套古董环境上死磕。最后分享一个小技巧采集用的机器最好准备一个专门的“工作目录”把内核源码、两个 git 仓库、固件备份、采集脚本都放在同一级目录里使用绝对路径写进笔记。CSI 实验通常会反复修改信道和天线配置完整的版本记录比任何记忆都可靠。环境一旦稳定下来把实验数据采集和数据处理分开采集端保持最小化系统服务数据处理放在另一台日常机器上能省下大量不必要的干扰排查。