0. 找到 FeitCSI 源码目录
方式 1:搜索文件定位
find ~ -name "FeitCSI" -type d执行后会输出类似:
/home/h/FeitCSI-iwlwifi/FeitCSI这就是源码根目录,复制这个路径。
进入源码目录(把下面路径替换成你搜索出来的真实路径):
cd /home/h/FeitCSI-iwlwifi/FeitCSI方式 2:查找 Csi.cpp
find ~ -name "Csi.cpp"输出示例:
/home/h/FeitCSI-iwlwifi/FeitCSI/src/Csi.cpp去掉/src/Csi.cpp剩下的路径就是源码根目录:/home/h/FeitCSI-iwlwifi/FeitCSI
1. 修改 src/Csi.cpp
nano src/Csi.cpp1.1 在文件最上方 #include 区域添加
#include <chrono> // 如果是直接删掉 timestamp 前面的注释“//”,则需要添加这个头 #include <sys/time.h> #include <cstdio>1.2 修改函数 1:loadFromMemory (pHeader, pRawCsiData)(读取本地 dat)
nano 内定位目标代码(任选其一)
方式 A(推荐):Ctrl+W,输入timestamp回车,直接跳转到需要修改的这一行
方式 B:Ctrl+_,输入61回车,跳转到 61 行
void Csi::loadFromMemory(uint8_t *pHeader, uint8_t *pRawCsiData) { memcpy(&this->rawHeaderData, pHeader, CSI_HEADER_LENGTH); this->rawCsiData = new uint8_t[this->rawHeaderData.csiDataSize]; memcpy(this->rawCsiData, pRawCsiData, this->rawHeaderData.csiDataSize); // 原始的代码是this->rawHeaderData.timestamp = (uint64_t)std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::system_clock::now().time_since_epoch()).count(); // 修改为下面的代码 struct timeval tv; gettimeofday(&tv, nullptr); this->rawHeaderData.timestamp = (uint64_t)tv.tv_sec * 1000000 + tv.tv_usec; // 添加调试代码,想要看这个函数修改后是否有效,可以添加以下printf代码 // printf("[DEBUG-FILE] CSI timestamp = %lu\n", this->rawHeaderData.timestamp); this->processRawCsi(); }1.3 修改函数 2:loadFromMemory (rawData)【网卡实时抓包,核心】
void Csi::loadFromMemory(uint8_t *rawData) { memcpy(&this->rawHeaderData, rawData, CSI_HEADER_LENGTH); this->rawCsiData = new uint8_t[this->rawHeaderData.csiDataSize]; memcpy(this->rawCsiData, &rawData[CSI_HEADER_LENGTH], this->rawHeaderData.csiDataSize); // 下面三句代码都是新增的 struct timeval tv; gettimeofday(&tv, nullptr); this->rawHeaderData.timestamp = (uint64_t)tv.tv_sec * 1000000 + tv.tv_usec; // 可以添加下面调试代码 // printf("[DEBUG-CAPTURE] CSI timestamp = %lu\n", this->rawHeaderData.timestamp); this->processRawCsi(); }1.4 检查 Csi::save()
找到Csi::save()。如果代码是一次性写入整个结构体:
outfile.write((char*)&rawHeaderData, CSI_HEADER_LENGTH);✅ 不需要额外修改,timestamp 会跟着 header 存入 dat。
如果是逐个字段手动写 header,则需要手动增加 timestamp 写入。
保存退出 nano:Ctrl+O→ 回车 →Ctrl+X
2. 编译(必须在源码根目录执行)
make clean make出现 fgets 警告无需处理,只要最后生成bin/app即编译成功。
3. 创建全局软链接(任意目录可执行 feitcsi)
依然在源码根目录运行:
sudo ln -s $PWD/bin/app /usr/local/bin/feitcsi验证全局命令:新开终端,随便cd到别的文件夹。
cd ~ which feitcsi有路径输出代表成功。
4. 启动 GUI
xhost +local:root sudo feitcsi --gui终端保持打开,抓包时会打印 DEBUG 时间戳。
5. 测试与判断
GUI 开始采集 CSI,观察终端输出打印一串大数:
[DEBUG-CAPTURE] CSI timestamp = 176...✅ 内存获取时间戳成功。
- 若 dat 解析仍然是 0:
save保存函数没有写入 timestamp。 - 打印一直等于 0 ❌ 赋值代码未生效,检查是否重新编译、代码位置。
- 采集全新 dat 文件测试,旧 dat 不会更新。
6. 调试完成后(正式版本)
删掉两处printf调试语句,重新编译:
make clean make快速排查清单
- 确认当前目录是 FeitCSI 源码根目录(
ls src/Csi.cpp能找到文件)。 - 修改代码后必须
make clean && make。 - 抓包看终端
printf输出,定位问题在【内存赋值】还是【文件保存】。 - 测试用新采集 dat。