多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Intel 5300+Ubuntu 14.04+CSI Tools完整安装指南

Intel 5300+Ubuntu 14.04+CSI Tools完整安装指南 搞无线感知方向的人十有八九都绕不开CSI Tools这套工具。它是目前学术界用得最多的WiFi信道状态信息CSI提取方案搭配Intel 5300网卡和Ubuntu 14.04系统几乎是当年做人体行为识别、室内定位、手势感知这些实验的标配环境。我自己刚接触这个项目时光是把环境跑通就折腾了将近一周网上资料零散官方文档又写得过于简略很多坑都是自己一点点踩出来的。这篇文章就是把我实际安装Intel 5300 Ubuntu 14.04 CSI Tools的完整过程记录下来包括每一步操作的意图、为什么这么选型、编译驱动时容易卡住的细节、以及常见报错的排查方法。不管你是刚入坑的研究生还是被导师安排去搭实验环境的本科生照着这篇文章操作基本能少走一大半弯路。1. 方案选型为什么偏偏是这套组合CSI Tools不是一套普通的软件工具它需要从底层网卡的物理层直接提取细粒度的信道状态信息。这就决定了它不是装个软件就能用而是涉及网卡驱动、固件、内核补丁和用户态工具四个层面的协同工作。1.1 CSI Tools到底是什么能拿来做什么CSI Tools最早出自MIT的无线研究组它的核心价值在于普通WiFi网卡只能给你RSSI这种粗粒度的信号强度数值而它能提供每个子载波上的幅度和相位信息。WiFi在OFDM调制下一个20MHz信道会被划分为56个子载波CSI Tools可以让你拿到其中30个子载波的详细状态。这套信息对很多应用场景非常关键。比如人体行为识别人在房间里走动、摔倒、做手势都会对WiFi信号的传播路径产生细微扰动这些扰动会体现在不同子载波的幅度和相位变化上。再比如室内定位通过CSI的多径信息可以做比RSSI精确得多的位置估计。还有呼吸检测、入侵检测、甚至唇语识别这类前沿研究都是用这套工具做数据采集底座的。当时做这类研究能选的方案并不多。商用WiFi网卡基本都不开放物理层信息能提取CSI的要么是USRP这类软件无线电平台价格动辄上万要么是Atheros网卡方案但它的CSI信息完整度不如Intel方案。Intel 5300是少有的、价格便宜还能通过修改固件和驱动来提取CSI的商用网卡所以它成了这个方向的事实标准。1.2 为什么固定搭配Ubuntu 14.04很多初学者会问为什么不能用更新的Ubuntu 18.04或者20.04原因在于CSI Tools的驱动补丁是针对特定内核版本做的。它的内核模块修改基于Linux 3.13内核而Ubuntu 14.04的默认内核恰好是3.13.x系列所以能直接打补丁编译。如果你在更高版本的内核上尝试编译CSI Tools的驱动源码几乎一定会遇到iwlwifi驱动API变化导致的编译错误。比如高版本内核把某些函数从导出符号表里移除了或者结构体成员变量改了名字这些都会让补丁代码无法通过编译。反过来如果你用Ubuntu 12.04内核版本又太旧固件加载机制和驱动框架也有差异。所以这套组合本质上是一个经过验证的完整闭环Ubuntu 14.04提供匹配的内核版本Intel 5300提供能改固件的硬件基础CSI Tools提供提取和解析数据的代码。三者缺一不可。2. 安装前的环境准备正式动手之前先确认硬件配置和软件依赖这一步能帮你排除掉很多后面才会暴露的问题。2.1 硬件清单与兼容性确认先说硬件部分。Intel 5300网卡有几种形态最常见的是mini-PCIe接口的半高卡还有少数台式机用的PCIe转接卡版本。无线感知实验一般用的是带三个天线接口的5300型号因为三根天线配合三发三收的MIMO模式最多能拿到3x39条空间流的CSI数据这对后续的数据分析非常有价值。还有一点需要特别注意Intel 5300识别的是所属的无线模块型号常见的有Intel WiFi Link 5300和Intel Ultimate-N 5300两种叫法它们的芯片方案一致都支持CSI提取但某些OEM定制版的固件锁可能不同。我建议在购买时就直接问清楚是否为原装Intel方案避免买到刷过第三方固件的版本。内存方面CSI数据采集本身对内存要求不高4GB足够。但后续要跑深度学习模型来处理CSI数据的话建议还是配备至少8GB以上内存和独立显卡。硬盘建议用固态因为CSI数据采集会持续写入大量文件机械硬盘在长时间采集中容易成为瓶颈。2.2 系统安装与基础配置要点Ubuntu 14.04的安装镜像在官方源里已经不太好找了我一般是从老版本的镜像站下载。安装时有几个细节要留意分区建议单独给根目录至少分配40GB空间因为后续编译内核模块、存放CSI数据集都需要空间文件系统用ext4即可不用上btrfs这类新文件系统避免不必要的兼容性问题。系统装完第一件事是先更新软件源并安装编译工具链。CSI Tools的编译需要gcc、make、linux-headers等基础包缺少任何一个都会在编译驱动时卡住。命令如下sudo apt-get update sudo apt-get install -y gcc make git linux-headers-$(uname -r) build-essential这里有个容易犯的错误很多人直接安装linux-headers-generic但CSI Tools的内核补丁需要精确匹配当前运行内核的headers版本所以一定要用$(uname -r)动态获取当前内核版本。另外在安装完所有依赖后可以用uname -r确认一下内核版本确实是3.13.x。还有一个很容易被忽略的点Ubuntu 14.04默认的WiFi管理工具是NetworkManager它会自动接管无线网卡这在我们后续做CSI数据采集时会造成很大干扰。建议在安装完系统后立即禁用NetworkManager管理iwlwifi网卡让它处于完全可控的状态。2.3 内核版本与无线工具的关系CSI Tools的驱动补丁包对内核版本非常敏感。官方的linux-80211n-csitool是针对3.13内核的如果你不小心升级了内核比如跑到3.16或者4.4驱动编译必然会失败。所以在系统装好后第一步就是锁定内核版本sudo apt-mark hold linux-image-$(uname -r) linux-headers-$(uname -r)这个命令会把当前内核标记为保留状态防止后续apt-get upgrade时自动升级。我有个朋友就是因为没锁内核系统自动更新后内核从3.13跳到了3.16结果所有编译好的驱动全部失效不得不回滚。另外CSI Tools还需要用到wireless-tools这个包来配置无线网卡它提供iwconfig等命令。Ubuntu 14.04默认没有安装编译用户态工具的某些脚本也会依赖它所以需要一并安装sudo apt-get install -y wireless-tools如果需要用iperf来产生网络流量以便触发CSI数据也建议顺手装上sudo apt-get install -y iperf3. 驱动与固件部署实战这是整个安装过程中最核心、最容易出错的环节。驱动补丁和固件替换能不能成功直接决定了CSI Tools能不能工作。3.1 获取CSI Tools源码与内核补丁CSI Tools的源码托管在GitHub上主要有两个仓库需要拉取git clone https://github.com/dhalperi/linux-80211n-csitool.git git clone https://github.com/dhalperi/linux-80211n-csitool-supplementary.git第一个仓库是核心驱动和固件相关内容第二个仓库包含用户态工具和示例脚本。两个仓库都要下载前者让你能够用网卡跑起来后者让你能真正提取和查看CSI数据。在拉取代码之前建议先确认一下网络环境能正常访问GitHub。有些网络环境需要用代理但这里我不展开讲代理相关的内容只说一点如果你在公司或者校内网络环境下拉取失败可以试试用镜像站或者找同学帮忙拷贝一份完整源码。两个仓库拉取完目录结构是这样的linux-80211n-csitool/ ├── driver/ ├── firmware/ ├── linux-80211n-csitool/ ├── netlink/ └── scripts/其中driver目录下是修改过的iwlwifi驱动源码firmware目录下是需要替换的固件。我们接下来的工作就是编译driver目录下的驱动并用firmware目录下的固件替换系统默认固件。3.2 编译修改版iwlwifi驱动进入到linux-80211n-csitool目录后先不要急着make。先看README确认当前分支是否适配你的内核。官方默认分支是csitool-3.13正好对应Ubuntu 14.04的内核。你可以用git branch确认当前所在分支cd linux-80211n-csitool git branch输出应该是* csitool-3.13或者类似的release分支。如果分支不对需要切换到正确分支。接下来进入driver目录编译cd driver make正常情况下make命令会编译生成iwlwifi.ko内核模块。这里的常见报错种类不少后面第5章我会专门列一个排查表。编译完成后需要将生成的新模块替换系统原有模块。首先备份原有模块然后复制新的模块过去sudo cp /lib/modules/$(uname -r)/kernel/drivers/net/wireless/iwlwifi/iwlwifi.ko /lib/modules/$(uname -r)/kernel/drivers/net/wireless/iwlwifi/iwlwifi.ko.bak sudo cp iwlwifi.ko /lib/modules/$(uname -r)/kernel/drivers/net/wireless/iwlwifi/iwlwifi.ko这里我强烈建议备份原模块哪怕你确定CSITool方案没问题备份也能让你在实验失败后快速恢复网络功能。3.3 固件部署的易错点CSI Tools要正常工作必须配套使用它自带的固件文件不能和系统自带的固件混用。原因是默认固件中的某些功能模块会阻止对CSI缓冲区的访问而修改后的固件打开了这个权限。具体操作如下cd linux-80211n-csitool/firmware sudo cp iwlwifi-5000-2.ucode.signed /lib/firmware/iwlwifi-5000-2.ucode先备份系统原有固件sudo cp /lib/firmware/iwlwifi-5000-2.ucode /lib/firmware/iwlwifi-5000-2.ucode.bak然后替换。注意固件文件名的后缀有些版本是.ucode.signed系统加载时读取的是iwlwifi-5000-2.ucode所以需要重命名而非直接拷贝。有一个坑在某些Ubuntu 14.04的更新小版本中系统自带的initscripts会在启动时把/lib/firmware下的固件重新覆盖为包管理器版本。如果你发现重启后固件被还原了可以检查一下是不是有无线网卡固件相关的包自动升级了。保险的做法是替换完固件后也执行一下sudo apt-mark hold linux-firmware锁定linux-firmware这个包防止它自动更新把固件换回去。3.4 加载模块与开机自启动驱动编译好、固件替换完成后需要重新加载iwlwifi模块使改动生效。先卸载现有模块再重新加载sudo modprobe -r iwlwifi sudo modprobe iwlwifi如果modprobe没有任何输出说明加载成功。用dmesg查看内核日志应该能看到iwlwifi相关的加载信息。如果你是远程操作的这一步要格外小心——一旦新驱动有问题可能会断网所以建议在本地终端或者有KVM等带外管理的环境下操作。为了确保每次开机都能自动加载修改后的驱动需要检查一下modprobe的配置文件。在/etc/modules-load.d/下创建一个文件让它开机加载iwlwifiecho iwlwifi | sudo tee /etc/modules-load.d/iwlwifi.conf这样重启后系统会自动加载我们的修改版驱动。4. 用户态工具与系统配置驱动和固件是底层用户态工具则是你真正和CSI数据打交道的那一层。这一层装好之后才算跑通了从硬件到数据流的完整链路。4.1 编译supplementary工具用户态工具在linux-80211n-csitool-supplementary目录里。这里有几个子目录最关键的是netlink和utils。netlink是一个与内核通信的小程序负责通知驱动上传CSI数据utils里包含一些解析和显示CSI数据的脚本。编译之前先确认wireless-tools已经正确安装因为netlink会链接到libiw库。然后执行cd linux-80211n-csitool-supplementary make编译完成后netlink目录下会生成log_to_file、log_to_net等可执行文件。这些就是我们要用的数据采集工具。4.2 调整无线网卡参数CSI数据采集对无线网卡的配置有特定要求。首先网卡需要设置为monitor模式也就是监听模式这样才能捕获无线信道上的原始帧sudo ip link set wlan0 down sudo iw dev wlan0 set type monitor sudo ip link set wlan0 up如果你用的是别的无线接口名把wlan0替换成实际接口名即可可以用iw dev命令查看。接下来设置信道和带宽。CSI Tools的官方文档建议使用20MHz带宽信道则在2.4GHz或5GHz频段中选一个空闲的。设置信道用sudo iw dev wlan0 set channel 165这里165信道是5GHz频段的一个信道具体选哪个要看你的实验环境。如果周围WiFi设备比较多建议先用sudo iw dev wlan0 scan | grep frequency扫描一下选一个相对空闲的信道避免外部信号干扰CSI数据。然后通过iwconfig命令确认配置iwconfig wlan0输出中Mode应显示为MonitorFrequency应显示为你设置的信道频率。4.3 天线与带宽的配套设置Intel 5300有三根天线CSITool支持配置每根天线的收发状态。在默认配置下三根天线都是开启状态这适合大多数场景。如果你的实验只需要单天线数据可以关闭另外两根以降低数据量。天线配置在linux-80211n-csitool-supplementary/utils/目录的脚本中有参数控制。比如setup_interface.sh脚本里可以设置天线映射具体参数根据你的网卡天线连接方式来确定。另外要注意的是如果使用40MHz带宽CSI子载波数量会翻倍但Intel 5300在这种模式下提取到的CSI数据可靠性会下降。我的经验是一开始做数据采集始终用20MHz它能提供最稳定的56个子载波中的30个足够大部分算法使用。4.4 采集第一条CSI数据到这一步理论上整个链路已经通了。我们来验证一下。在第一个终端窗口执行cd linux-80211n-csitool-supplementary/netlink sudo ./log_to_file csi_data.dat在第二个终端窗口产生一些网络流量让网卡有数据收发这样才能触发CSI上报。最简单的办法是ping网关ping 192.168.1.1或者用iperf打流iperf -c 192.168.1.100 -t 30等几秒钟然后按CtrlC停止log_to_file。用文件查看命令确认csi_data.dat的大小不为0说明驱动正在上报CSI数据。再用工具自带的脚本解析一下看数据格式是否正确cd linux-80211n-csitool-supplementary/utils python3 plot_csi.py csi_data.dat --no-gui如果能看到每条CSI记录的对数幅度值恭喜你整套环境已经跑通了。5. 常见问题与排查技巧实录我在安装过程中踩过不少坑也帮同学排查过各种稀奇古怪的问题。这部分把最常见的错误和排查思路整理成表格方便你对症下药。5.1 驱动编译失败的核心原因错误现象可能原因解决思路make时报错缺少xxx.h头文件linux-headers未安装或不匹配安装linux-headers-$(uname -r)确认版本与uname -r一致代码中有未定义的函数或结构体内核版本与补丁不匹配确认系统内核是3.13.x并锁定内核防止升级报错MODPOST相关警告后中断缺少modules_install步骤所需权限或依赖用sudo执行make modules_install或者先安装modprobe相关工具编译成功但modprobe加载失败模块与内核版本不一致或签名问题检查dmesg中的具体错误必要时使用sudo modprobe --force不推荐仅排查用我遇到过最诡异的一个情况是make完全正常iwlwifi.ko也复制过去了但modprobe加载时报Exec format error。最后发现是编译时gcc版本和编译内核时用的gcc版本不一致导致模块格式不兼容。解决方法是安装对应gcc版本或者用make clean make重新编译。5.2 固件加载失败与无线网卡不识别固件问题比驱动问题更隐蔽。常见表现是dmesg里出现iwlwifi ... firmware load failed的错误。这时候首先要确认文件路径和名称ls -l /lib/firmware/iwlwifi-5000-2.ucode如果文件不存在说明固件没有拷贝成功。注意Intel 5300的固件版本可能有多个渠道CSITool自带的固件是最适合的版本不要用Intel官网下载的最新版替代因为最新版固件可能关闭了CSI访问接口。如果固件存在但加载仍然失败检查文件权限。固件文件需要至少644权限root可写即可。有些情况下你从Windows文件系统拷贝过来的固件可能会带有奇怪的权限位需要重新chmodsudo chmod 644 /lib/firmware/iwlwifi-5000-2.ucode5.3 监听模式下收不到数据包有时候驱动和固件都正常但设置monitor模式后log_to_file就是收不到任何数据。这通常是以下三种情况之一第一种是网卡被NetworkManager抢占了。即使你设置了monitor模式NetworkManager也可能在后台把网卡重新拉回managed模式。强制禁用NetworkManager对这个网卡的管理sudo stop network-manager或者修改/etc/NetworkManager/NetworkManager.conf把wlan0加入不管理列表。第二种是没有正确设置信道。CSI数据采集需要网卡锁定在特定信道如果信道没有设置或者设置为auto网卡可能无法正常接收帧。执行iwconfig wlan0确认Frequency不是auto。第三种是网卡根本没有进入接收状态。可以先用sudo tcpdump -i wlan0看看网卡在monitor模式下能不能抓到普通WiFi帧。如果tcpdump也抓不到说明无线网卡本身就有问题可以拔插一下网卡或者重新加载驱动。5.4 数据采集中断与文件损坏长时间采集中最常见的现象是log_to_file程序突然中止或者生成的.dat文件后续解析报错。这多半是因为USB总线断连或者PCIe链路不稳定导致的内核错误。Intel 5300虽然是成熟产品但在长时间高负载下偶尔也会出问题。建议是大文件采集时不要直接写回普通硬盘先写到tmpfs或SSD的临时目录采完再移到长期存储位置。此外采集脚本应该加上异常退出后的自动重启逻辑避免半夜里采集断了第二天跑过来才发现数据没存下来。还有一个小经验CSI数据文件最好每10分钟切换一个新文件而不是不间断写入同一个文件。因为一旦文件系统出现错误最多只损失10分钟的数据而不会让整个数据集报废。6. 从数据采集到真实实验的衔接环境跑通只是一半工作另一半是从采集到的CSI数据里提取出对实验有用的内容。6.1 CSI数据的格式与常用解析思路CSI Tools的log文件默认是二进制格式每条记录由包头和数据部分组成。包头包含帧控制信息、MAC地址、序列号等数据部分包含30个子载波的幅度和相位信息每个子载波用16位有符号整数表示。官方提供的matlab和python解析脚本基本能处理大部分需求。我自己常用的是matlab版本的read_bf_file.m它会把每条CSI记录的原始字节流解析成结构体方便后续特征提取。有一点需要注意CSI数据中的相位信息受硬件时钟同步问题影响直接使用原始相位的价值不大一般需要做线性相位校正或者用相位差。幅度信息相对稳定是很多人做行为识别时的首选特征。6.2 数据质量的快速校验方法拿到一份CSI数据如何判断它是不是有效数据我的经验是看两个指标一是CSI幅度的方差不能太大也不能太小环境安静时各子载波幅度应该是平滑的曲线二是两帧之间的CSI差异不能突变过大如果连续帧的CSI形态差别很大说明可能存在干扰或采集异常。另外打开数据的频谱图看一眼。在20MHz带宽下30个子载波的幅度曲线在10MHz频带内应该是连续的如果出现剧烈跳变或者尖峰说明采集过程中网卡可能发生了信道跃迁这种数据在做实验时应该剔除。6.3 采集平台的后续扩展方向这套CSI Tools环境搭建好后还可以进一步扩展。比如配合多台机器同步采集可以做设备间的相位差分析接入到ROS机器人系统可以在移动机器人上实时采集CSI数据用于动态环境感知或者把采集到的数据做成数据集供后续深度学习模型训练。我在实际使用中发现维护一套稳定可复现的实验环境比追求新功能更重要。CSITools这套组合虽然技术栈偏老但胜在稳定、资料多、社区里踩过坑的人也多。新出的商业方案在易用性上可能更好但从可重复实验和学术透明性角度讲这套老方案仍然是当前最可靠的选择。最后分享一个提升效率的小技巧把从安装到配置的完整过程写成一个bash脚本参数化信道、带宽、天线配置和采集时长这样每次做实验前只要改几个变量就能自动开始采集不用每次手动输入命令。我就是这么做的从第二周开始每天能稳定采集超过10小时的CSI数据实验进度一下子快了起来。
返回列表