尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

openwifi 的 CSI 采集指南:从 FPGA 信道状态信息到 Chip State Information 的实战解析

openwifi 的 CSI 采集指南:从 FPGA 信道状态信息到 Chip State Information 的实战解析 通信网络硬件开发嵌入式【免费下载链接】openwifiopen-source IEEE 802.11 WiFi baseband FPGA (chip) design: driver, software项目地址https://gitcode.com/gh_mirrors/op/openwifi点击查看免费下载openwifi 在传统 CSIChannel State Information信道状态信息概念之上做了巧妙的语义扩展将其延伸为Chip State Information芯片状态信息通过 FPGA 内置的side channel侧信道基础设施把 WiFi OFDM 接收机在解码每个数据包时产生的频率偏移、信道响应Channel State/Response与均衡器输出实时导流到上位机。本文基于 doc/app_notes/csi.md 应用笔记结合 driver/side_ch/ 内核驱动与 user_space/side_ch_ctl_src/ 用户态工具源码完整讲解 CSI 的快速上手、数据格式、条件捕获配置、均衡器输出数量num_eq配置、编译部署以及如何借助 TSF 时间戳把 CSI 精确定位到每一个 WiFi 数据包。读完本文你可以独立完成一次从 SDR 板到上位机的端到端 CSI 采集并掌握离线分析 CSI 数据的完整工作流。本文聚焦“通用 CSI 采集”。若希望利用 openwifi 全双工能力采集**自身发送self-Tx**信号的 CSI 实现类似雷达的感知功能请参考姊妹篇 WiFi CSI radar via self CSI capturing。快速开始5 步拿到第一份 CSICSI 采集的全流程分成“板上采集”和“电脑显示”两段二者通过以太网连接。前提条件如下SDR 板已上电并通过网线直连一台电脑电脑配置静态 IP192.168.10.1该地址同时是 side_ch_ctl.c 中默认的远端服务器地址见其server_ip 192.168.10.1定义板上已按 openwifi 常规流程加载 FPGA 镜像、内核模块与无线驱动。第 1 步登录 SDR 板并启动通信栈。ssh root192.168.10.122 (password: openwifi) cd openwifi ./wgd.sh (Wait for the script completed)wgd.sh完成 WiFi 驱动sdr.ko 等与 FPGA 镜像的加载初始化是后续一切操作的前提。第 2 步进入监控模式并监听一个繁忙信道。./monitor_ch.sh sdr0 11 (Monitor on channel 11. You can change 11 to other channel that is busy)monitor_ch.sh 把网卡sdr0设为 monitor 模式并切换到指定信道如 11 号信道同时调用./agc_settings.sh 1打开自动增益控制保证接收机以合适的增益捕获环境中的 WiFi 信号。第 3 步加载侧信道内核模块并开始采集。insmod side_ch.ko ./side_ch_ctl gside_ch.ko是 CSI 数据从 FPGA 到 Linux 用户态的桥梁源码见 driver/side_ch/side_ch.cside_ch_ctl g则以默认100ms周期反复向内核请求“侧信息”side info。板上终端会出现类似输出loop 64 side info count 61 loop 128 side info count 99 ...其中每行第一个数字是请求循环次数每 64 次打印一次第二个数字是累计收到的有效侧信息条数。只要第二个数字非零且持续增长就说明 CSI 数据正在顺畅地从板卡流向电脑——因为side_ch_ctl每收到一批有效数据就会通过 UDP 4000 端口把它们推送到电脑端对应sendto()逻辑见 side_ch_ctl.c。第 4 步在电脑端注意不是在 ssh 会话里启动实时显示。cd openwifi/user_space/side_ch_ctl_src python3 side_info_display.py首次运行前可能需要安装依赖sudo apt install python3-numpy python3-matplotlib python3-tk。脚本启动后监听本机192.168.10.1:4000见 side_info_display.py实时绘制3 张图频率偏移freq offset随数据包索引变化的频偏单位 Hz信道状态/响应channel state/responseCSI 的幅值与相位随子载波索引的变化曲线均衡器输出星座图constellation from equalizer均衡后 I/Q 符号的星座分布。同时脚本在终端持续打印每条侧信息携带的timestampTSF 时间戳并把所有原始数据追加写入side_info.txt文件。第 5 步离线分析。采集过程中产生的side_info.txt可用仓库自带的 MATLAB 脚本 test_side_info_file_display.m 做离线解析与绘图便于对 Chip State Information 做深入分析如逐包观察 CSI 相位、频率偏移的时序变化。理解 CSI 特性side channel 的架构与数据格式架构从 FPGA 到电脑的完整数据链路CSI 信息是通过 openwifi 的side channel 基础设施提取出来的。整条链路可以概括为FPGA 侧WiFi OFDM 接收机openwifi 基带 IP在解码每个数据包时把解码副产品频率偏移、信道响应、均衡器输出连同 TSF 时间戳打包成“侧信息”交给 FPGA 中的side_ch逻辑模块DMA 传输侧信息通过 DMA 从可编程逻辑PL搬运到处理系统PS的内存。在 side_ch.c 的get_side_info()中驱动先读取 FPGA 的SIDE_CH_REG_M_AXIS_DATA_COUNT_ADDR得到待搬运数据量再通过 DMA 通道tx_dma_s2mm一次性拉取每次搬运最多MAX_NUM_DMA_SYMBOL8192个 64bit DMA symbol内核侧side_ch.kodriver/side_ch/side_ch.c是平台驱动负责 FPGA 寄存器读写、DMA 搬运并通过NetlinkNETLINK_USERSOCK与用户态程序交互——收到ACTION_SIDE_INFO_GET请求即执行一次采集并回传数据用户态 网络板上side_ch_ctl把收到的侧信息通过 UDP目标端口 4000发送到电脑上位机side_info_display.py接收 UDP 数据包并解析、绘图、落盘side_info.txtMATLAB 脚本test_side_info_file_display.m负责离线分析。驱动侧与 FPGA 侧的所有寄存器地址都在 driver/side_ch/side_ch.h 中定义例如配置寄存器SIDE_CH_REG_CONFIG_ADDR索引 1、num_eq 寄存器SIDE_CH_REG_NUM_EQ_ADDR索引 4、FC 匹配目标SIDE_CH_REG_FC_TARGET_ADDR索引 5、addr1/addr2 匹配目标索引 6/7等——这些正是下文side_ch_ctl whXhY命令操作的硬件寄存器。数据格式每条侧信息的 64bit 元素结构每条侧信息的布局与长度定义在源码中以宏的形式统一维护side_ch.h 与 side_info_display.py 保持一致HEADER_LEN 2timestamp 与频率偏移CSI_LEN 56单条 CSI 的长度EQUALIZER_LEN 56 - 4 52单组均衡器输出长度其中非 HT802.11a/g模式只有 48 个子载波有效末尾 4 个用{32767, 32767}填充补齐到 52每组“传输单元”一次采集携带的一条侧信息总长为HEADER_LEN CSI_LEN num_eq*EQUALIZER_LEN个 DMA symbol每个 DMA symbol 实际大小为64bit。具体到每个字段每元素 64bit字段占用说明含义timestamp64bit TSF 定时器值与 tcpdump、wireshark、dmesg 中 openwifi 打印的时间戳是同一个值是 CSI 与 WiFi 数据包匹配的唯一身份标识freq_offset仅使用低 16bit频率偏移估计值csi信道状态/响应仅使用前两个 16bitI/Q56 个子载波上的信道响应剩余两个 16bit 为未来多天线场景预留equalizer仅使用前两个 16bitI/Q均衡器输出剩余两个 16bit 预留关于子载波有效性802.11n 下 56 个子载波全部有效802.11a/g 下仅 52 个子载波有效均衡器输出仅 48 个子载波有效其余以填充值补足 52。理解数据包格式最精确的方式是阅读并运行附带的 Python 与 MATLAB 脚本side_info_display.py 中的parse_side_info()逐条解析出 timestamp由 4 个 16bit 拼成 64bit TSF、freq_offset、csi 与 equalizer 数组MATLAB 侧test_side_info_file_display.m的b reshape(a, [4, length(a)/4])同理完成解析。配置捕获条件只采集你关心的数据包快速开始默认采集 OFDM 接收机解码的所有数据包的 CSI。如果只想采集满足特定条件的数据包需要在执行./side_ch_ctl g之前下发配置命令。配置通过向side_ch_ctl传入不同参数实现参数格式为whXhY其中w写入writeh硬件寄存器hardware registerX寄存器索引h十六进制hexY十六进制格式的寄存器值。其余字符保持原样。这套语法由 side_ch_ctl.c 中的parse_para_string()解析命令最终经 Netlink 到达内核驱动由side_ch_nl_recv_msg()执行reg_write(reg_idx*4, reg_val)写入 FPGA 寄存器见 side_ch.c。对应关系寄存器索引在 side_ch.h 中定义寄存器索引 X含义用途1CONFIG 配置寄存器开关条件匹配bit12FC 匹配开关、bit13addr1 匹配开关、bit14addr2 匹配开关bit11~bit0 应保持0015FC 匹配目标寄存器指定 FCFrame Control匹配值6addr1 匹配目标寄存器指定目标 MACaddr1匹配值7addr2 匹配目标寄存器指定源 MACaddr2匹配值打开/关闭条件捕获寄存器 1Y的 bit 含义bit11~bit0应为001十六进制bit12FC 匹配开关1开bit13addr1 匹配开关1开bit14addr2 匹配开关1开。# 仅匹配 FC ./side_ch_ctl wh1h1001 # (1001 为十六进制值) # 仅匹配 addr2源地址 ./side_ch_ctl wh1h4001 # 同时匹配 FC 和 addr1目标地址 ./side_ch_ctl wh1h3001 # 关闭条件捕获采集所有数据包 ./side_ch_ctl wh1h0001指定匹配目标寄存器 5/6/7当某种匹配被上面的命令打开后用下列命令指定匹配目标# 指定 FC 匹配目标 ./side_ch_ctl wh5hY # (Y 为十六进制 FC 值) # 指定 addr1目标地址匹配目标 ./side_ch_ctl wh6hY # 指定 addr2源地址匹配目标 ./side_ch_ctl wh7hY # (Y 为十六进制 MAC 地址只需 MAC 的后 32 位。 # 例对 56:5b:01:ec:e2:8f应输入 01ece28f)完整示例只采集 MAC 地址为56:5b:01:ec:e2:8f的设备发出的数据包的 CSI./side_ch_ctl wh1h4001 ./side_ch_ctl wh7h01ece28f (01ece28f are the last 32 bits of MAC address 56:5b:01:ec:e2:8f) ./side_ch_ctl g说明驱动dev_probe()初始化时会把 CONFIG 寄存器写为0x7001同时打开 FC/addr1/addr2 匹配这一“最严格条件”以在启动阶段抑制侧信道动作随后再写回0x0001允许所有数据包见 side_ch.c因此用户在下发g之前的配置命令会按顺序覆盖该寄存器。自定义采集周期side_ch_ctl g默认每100ms采集一次直到按CtrlC退出。如需其他周期side_ch_ctl gN周期即为N*1ms例如g400表示每 400ms 采集一次g0表示尽可能连续采集雷达自 CSI 场景即使用此参数。解析逻辑见 side_ch_ctl.c未带参数时默认 100ms非法输入也会回退到 100ms。配置 num_eq按需裁剪均衡器输出num_eq均衡器输出组数决定每条侧信息携带多少组均衡器输出每组 52 个。如果不需要这么多均衡器信息可以调小以降低单条数据量与网络/存储开销。合法取值范围是0~8。关键约束num_eq必须在三处保持一致——内核模块side_ch.ko、Python 脚本side_info_display.py、MATLAB 脚本test_side_info_file_display.m否则解析会错位。加载内核模块时insmod side_ch.ko num_eq_init3可把 3 换成 0~8 中的任意数。8 是默认值快速开始一节无需显式指定。该参数对应驱动中的模块参数num_eq_init默认 8声明见 side_ch.cdev_probe()会把它写入 FPGA 的SIDE_CH_REG_NUM_EQ_ADDR寄存器并在每次get_side_info()中用它计算单次传输所需 DMA symbol 数HEADER_LEN CSI_LEN num_eq*EQUALIZER_LEN见 side_ch.c。启动 Python 脚本时side_info_display.py 3脚本第一个位置参数即 num_eq默认 8见 side_info_display.py 的参数解析。使用 MATLAB 脚本时修改 test_side_info_file_display.m 中的num_eq变量默认 8为对应值3 仅为例。编译 side channel 驱动与用户态程序CSI 功能需要自行编译两个组件1. 内核模块side_ch.ko$OPENWIFI_DIR/driver/side_ch/make_driver.sh $OPENWIFI_DIR $XILINX_DIR ARCH_BIT其中$OPENWIFI_DIR是 openwifi 仓库根目录$XILINX_DIR是 Xilinx 安装目录ARCH_BIT取 32 或 64Zynq 7000 平台填 32Zynq MPSoC 平台填 64。脚本内部会设置内核源码目录KDIR并调用 driver/side_ch/Makefile 完成模块编译。2. 用户态程序side_ch_ctlside_ch_ctl需要在 SDR 板上编译源码为 user_space/side_ch_ctl_src/side_ch_ctl.cgcc -o side_ch_ctl side_ch_ctl.c在 monitor 之外的模式下运行 CSICSI 功能并不局限于 monitor 模式。openwifi 的 CSI 采集可以与AP-ClientAP/STA模式、ad-hoc 模式等正常通信模式同时运行先把通信功能在相应模式下完全建立起来然后照常执行板上两步——insmod side_ch.ko与./side_ch_ctl g——即可在正常收发数据的同时把 CSI 提取到电脑端。这为“联合通信与感知”joint radar and communication类应用提供了便利例如在 AP 模式下为某个关联站点持续采集其数据包的信道响应。将 CSI 映射到具体的 WiFi 数据包CSI 与 WiFi 数据包的对应关系是分析如信道探测、感知时最常遇到的问题。如果要在采集 CSI 的同时关联到具体 WiFi 数据包需要用tcpdump / wireshark 等工具同步抓包然后以timestampTSF 定时器值作为唯一关联键把 WiFi 数据包与 CSI 信息匹配起来——因为 TSF 时间戳是同一个 WiFi 数据包与其对应 CSI 信息的唯一共同身份标识具体逐包提取 CSI 的方法请学习 Python 脚本 side_info_display.py 的parse_side_info()与 MATLAB 脚本 test_side_info_file_display.m后者的idx_to_check参数即可用于查看指定索引单包的 CSI 曲线按需定制自己的解析逻辑。关于该映射机制的更详细讨论可参考 openwifi 社区讨论串docs/discussions 中亦有引用详见 doc/app_notes/csi.md 原文。小结与延伸通过本文你应该已经掌握openwifi 如何以 side channel 为骨架把 FPGA 解码过程中的频率偏移、信道响应与均衡器输出实时搬运到上位机64bit 元素的 CSI 数据格式与side_ch.h/脚本中的长度宏如何一一对应如何用whXhY参数串完成 FC/addr1/addr2 条件捕获与gN周期配置如何用num_eq_init裁剪数据量并在三处工具间保持一致性以及如何借助 TSF 时间戳把 CSI 关联到具体 WiFi 包。仓库中的 doc/app_notes/csi.md、driver/side_ch/side_ch.c、user_space/side_ch_ctl_src/side_ch_ctl.c 与两个解析脚本是进一步深挖的第一手资料。若想利用本平台的全双工自收自发能力把 self-Tx CSI 用于雷达感知请继续阅读 WiFi CSI radar via self CSI capturing。赞分享通信网络硬件开发嵌入式【免费下载链接】openwifiopen-source IEEE 802.11 WiFi baseband FPGA (chip) design: driver, software项目地址https://gitcode.com/gh_mirrors/op/openwifi点击查看免费下载相关推荐openwifi CSI技术实战信道状态信息采集与雷达感知应用终极指南openwifi CSI技术实战信道状态信息采集与雷达感知应用终极指南 在无线通信领域 信道状态信息CSI 已成为WiFi感知和雷达应用的关键技术。op通信网络硬件开发嵌入式MicroPython ESP32 Wi-Fi CSI 实战指南从固件配置到信道状态信息采集与湍流监测MicroPython ESP32 Wi Fi CSI 实战指南从固件配置到信道状态信息采集与湍流监测 本篇指南以 MicroPython 仓库中 examp嵌入式语言运行时编程语言解释器编译器物联网系统编程Loop5 分钟用径向菜单搞定 macOS 窗口管理的完整指南Loop5 分钟用径向菜单搞定 macOS 窗口管理的完整指南 1. 30 秒看懂 Loop 是什么、适合谁 一句话说清楚Loop 是一款免费开源的 mac桌面应用上一篇IoT-For-Beginners 硬件实战Wio Terminal 开发板入门与 PlatformIO Hello World 完整指南下一篇StarRocks Shared-nothing 与 Shared-data 两种部署架构的功能差异全解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表