目录

1 硬件部分

2 操作系统

3 CSI TOOL 安装

4 CSI TOOL 运行

AP模式及可视化

Monitor模式

接受端

发射端

运行过程中

Monitor模式的实时可视化

5 Matlab解析数据

6 实验心得

经过半个月的坎坷安装过程,连Windows系统都没装过的本人终于颤颤巍巍把CSI TOOL装好了,下面记录一下适于我所使用设备的安装过程。

设备:一台THINKPAD X201,一台师兄借的华硕主板的台式机

首先,如果你和我一样对linux其实一窍不通的话,建议先反复看教程里的安装代码,照猫画虎很难一步实现的,中途一定会有这或那的问题需要解决,所以该了解的基础linux指令还是要了解,起码安装过程中的那些指令可以去查一查。

1 硬件部分

我所购买的材料如下,来自淘宝店深圳市卓越网络,半高是笔记本用的,全高是台式用的,强烈建议就买下图第二种这种配好了的,打开机箱接上去就行。网卡只能是Intel 5300,因为接下来我们要装的CSI TOOL只支持这个型号,Atheros CSI Tool支持Atheros网卡,同时收集到的子载波数量也更多,但是这方面的中文教程太少,最后还是用的5300。

由于我想做的是monitor模式下的人行为识别,所以使用的设备为一台Thinkpad X201,一台华硕主板的台式,两个都要装5300(一台发射信号,一台接受信号)(AP模式只需要一台电脑和一台路由器)。如果你的研究不需要考虑便携性,建议还是上台式,装起来方便很多,性能也吊打X201这种古早电脑,到时候收到数可以直接在机器上分析。

安装过程中,我主要参考的这几位大佬的博客,他们都讲到了硬件安装部分的东西,特别是第一篇:

Linux CSI Tool 完整使用说明(一发一收,monitor模式)(权威版 已成功测试)_ZJU_SLM的博客-CSDN博客_csi tools

CSI Tools 工具的安装 Intel 5300 + Ubuntu14.04_硕子鸽的博客-CSDN博客

[原创]Linux 802.11n CSI tool安装教程(亲测可用)_魂灵序曲的博客-CSDN博客_csitool安装

ThinkPad X201:买电脑的时候内存别太小,起码100G以上,不然后面装系统装工具内存不够就麻烦了(所以最后为了内存足够我直接装的单系统,删掉了window),这电脑挺便宜的,我在咸鱼买的花了400块。拆机,对于X201来说,先要把背面的螺丝全部卸下来,它的壳是从正面卸的,如果卸不下来基本就是背面螺丝没卸完,拆键盘时小心点不要像我一样用力猛把键盘排线扯坏了。另外在换网卡之前,需要先升级一下BIOS,不然开机就会报错主板不识别该网卡,因为X201其实并不支持intel 5300,具体参考上述第一篇教程。

这是换好网卡的样子,右下角有一个网线接口,我直接把天线延长线从那里伸出去了,这样就不需要拆声卡让位置。

最后成品就是这样子,随便找了个东西固定天线

华硕主板的台式:台式装起来很快,装好如下图所示,外置天线在机箱背部。

2 操作系统

如果你的电脑开机顺畅,并且5300可以顺利接到无线网(如果有多张网卡,记得确保是intel 5300在起作用),那么硬件部分就配置好了。

操作系统关系到后续CSI TOOL能否顺利安装,非常重要,我参考的这篇教程,装的是Ubuntu 14.04,版本下载链接里面有:

CSI Tools 工具的安装 Intel 5300 + Ubuntu14.04_硕子鸽的博客-CSDN博客

具体安装过程可以看这篇,安装系统本身并不难:

新手安装 Ubuntu 操作系统步骤教程_.ed的博客-CSDN博客_ubuntu安装教程

由于我装的不是双系统是单系统,又另外参考了这篇,单系统需要多设置一个启动引导分区,不然开不了机(这里额外说下,CSI TOOL不小,再加上后续何种文件、数据,home分区内存最好50G以上):

史上最全Ubuntu18.04单系统安装教程_威士忌燕麦拿铁的博客-CSDN博客_安装ubuntu18.04单系统

最后装好了可以核实一下版本号:

ubuntu 查询内核版本命令大全_麦子·熟了的博客-CSDN博客_ubuntu查看内核版本

3 CSI TOOL 安装

到了最关键部分,前面做了那么多准备工作就是为了装它,我所参考的教程是:

[原创]Linux 802.11n CSI tool安装教程(亲测可用)_魂灵序曲的博客-CSDN博客_csitool安装

它可能不是最精简最适合小白的,但是这篇教程中,博主对每一步安装操作都给出了自己的解释说明,可以更好的理解这个安装过程,报错的时候心里多少有点数,而不是硬生生的copy代码。(提醒一下在根据这篇博客修改驱动时,不需要下Sublime text,根据文中说明改了对应文件就行,博主都已经把哪个文件第几行怎么改代码都写出来了)。

4 CSI TOOL 运行

AP模式及可视化

还是参考魂灵序曲的教程,修改了驱动,可以跳过27、28,这个时候如果你发现电脑连不上网,或者连上又马上断开反复循环的话,可以参考这个博主的教程:

CSI-tools安装_他们都叫我奇奇的博客-CSDN博客_csi tools

也就是在29步之前执行这行代码

sudo killall wpa_supplicant

就可以连上不加密码的无线网

注:如果学校场地的路由器不方便更改的话,没有密码的路由器,可以用你闲置的一台可以正常上网的笔记本,通过网线连接路由器实现,具体参考:

将笔记本无线网卡链接wifi通过有线网卡共享给路由器 - Rainful - 博客园 (cnblogs.com)

然后继续参考魂灵序曲的那篇教程,AP模式就基本完成了,可视化可以继续参考他的:

[原创]Linux 802.11n CSI Tool下csi数据的实时可视化_魂灵序曲的博客-CSDN博客

Monitor模式

参考魂灵序曲博主的另一篇教程:

[原创]Linux 802.11n CSI tool Monitor模式_魂灵序曲的博客-CSDN博客_csitool monitor模式

如果是第一次执行,需要在接受设备和发射设备上共同安装lorcon并执行程序,即进行上述博客的1-7步,接下来就可以在设备上运行程序了。

由于CSI TOOL本身就有些问题,非常容易发生数组栓塞的现象,直观来看就是接收端设备的终端页面中,滚动的接受提示会停下来,且不会再自然恢复,我设置的发包频率是1000Hz,每次时间时长时短,断则数秒,长则几分钟(不会超过4分钟)。

Linux CSI Tool 完整使用说明(一发一收,monitor模式)(权威版 已成功测试)_ZJU_SLM的博客-CSDN博客_csi monitor 模式

这位博主根据这个问题对netlink文件中的原始log_to_file.c文件进行了修改,编写了一个可以收包n秒以后自动停止的,但是由于代码设置原因这个n不能超过两位数,也就是最大9秒。除此之外他也删除了没必要的接受提示,从原来的每1个包一行提示代码变成100个一行,据我观察这样是可以稍微延长一下程序稳定运行的时间,也更好在终端上观察。由于我需要的实验时长久一些,所以删除了这个时间控制功能(但是输入的时候还是要带个数字,这里还没优化)。

修改后的log_to_file.c代码如下:

/** (c) 2008-2011 Daniel Halperin <dhalperi@cs.washington.edu>*/
#include "iwl_connector.h"#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <linux/netlink.h>#define MAX_PAYLOAD 2048
#define SLOW_MSG_CNT 100int sock_fd = -1; // the socket
FILE *out = NULL;void check_usage(int argc, char **argv);FILE *open_file(char *filename, char *spec);void caught_signal(int sig);void exit_program(int code);
void exit_program_err(int code, char *func);int main(int argc, char **argv)
{/* Local variables */struct sockaddr_nl proc_addr, kern_addr; // addrs for recv, send, bindstruct cn_msg *cmsg;char buf[4096];int ret;unsigned short l, l2;int count = 0;/* Make sure usage is correct */check_usage(argc, argv);/* Open and check log file */out = open_file(argv[1], "w");/* Setup the socket */sock_fd = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_CONNECTOR);if (sock_fd == -1)exit_program_err(-1, "socket");/* Initialize the address structs */memset(&proc_addr, 0, sizeof(struct sockaddr_nl));proc_addr.nl_family = AF_NETLINK;proc_addr.nl_pid = getpid(); // this process' PIDproc_addr.nl_groups = CN_IDX_IWLAGN;memset(&kern_addr, 0, sizeof(struct sockaddr_nl));kern_addr.nl_family = AF_NETLINK;kern_addr.nl_pid = 0; // kernelkern_addr.nl_groups = CN_IDX_IWLAGN;/* Now bind the socket */if (bind(sock_fd, (struct sockaddr *)&proc_addr, sizeof(struct sockaddr_nl)) == -1)exit_program_err(-1, "bind");/* And subscribe to netlink group */{int on = proc_addr.nl_groups;ret = setsockopt(sock_fd, 270, NETLINK_ADD_MEMBERSHIP, &on, sizeof(on));if (ret)exit_program_err(-1, "setsockopt");}/* Set up the "caught_signal" function as this program's sig handler */signal(SIGINT, caught_signal);/* Poll socket forever waiting for a message */while (1){/* Receive from socket with infinite timeout */ret = recv(sock_fd, buf, sizeof(buf), 0);if (ret == -1)exit_program_err(-1, "recv");/* Pull out the message portion and print some stats */cmsg = NLMSG_DATA(buf);if (count % SLOW_MSG_CNT == 0)printf("received %d bytes: counts: %d id: %d val: %d seq: %d clen: %d\n", cmsg->len, count, cmsg->id.idx, cmsg->id.val, cmsg->seq, cmsg->len);/* Log the data to file */l = (unsigned short)cmsg->len;l2 = htons(l);fwrite(&l2, 1, sizeof(unsigned short), out);ret = fwrite(cmsg->data, 1, l, out);++count;if (ret != l)exit_program_err(1, "fwrite");}exit_program(0);return 0;
}void check_usage(int argc, char **argv)
{if (argc != 3){fprintf(stderr, "Usage: %s <output_file> <time>\n", argv[0]);exit_program(1);}
}FILE *open_file(char *filename, char *spec)
{FILE *fp = fopen(filename, spec);if (!fp){perror("fopen");exit_program(1);}return fp;
}void caught_signal(int sig)
{fprintf(stderr, "Caught signal %d\n", sig);exit_program(0);
}void exit_program(int code)
{if (out){fclose(out);out = NULL;}if (sock_fd != -1){close(sock_fd);sock_fd = -1;}exit(code);
}void exit_program_err(int code, char *func)
{perror(func);exit_program(code);
}

(PS.修改好的代码需要执行一下以形成程序文件)

接受端

首先把setup_monitor_csi.sh这个文件放在接收端设备injection文件夹下,其代码如下:

#!/usr/bin/sudo /bin/bash
service network-manager stop
SLEEP_TIME=2
WLAN_INTERFACE=$1
if [ "$#" -ne 3 ]; thenecho "Going to use default settings!"chn=64bw=HT20
elsechn=$2bw=$3
fi
echo "Bringing $WLAN_INTERFACE down....."
ifconfig $WLAN_INTERFACE down
while [ $? -ne 0 ]
doifconfig $WLAN_INTERFACE down
done
sleep $SLEEP_TIME
echo "Set $WLAN_INTERFACE into monitor mode....."
iwconfig $WLAN_INTERFACE mode monitor
while [ $? -ne 0 ]
doiwconfig $WLAN_INTERFACE mode monitor
done
sleep $SLEEP_TIME
echo "Bringing $WLAN_INTERFACE up....."
ifconfig $WLAN_INTERFACE up
while [ $? -ne 0 ]
doifconfig $WLAN_INTERFACE up
done
sleep $SLEEP_TIME
echo "Set channel $chn $bw....."
iw $WLAN_INTERFACE set channel $chn $bw

然后在终端中依次执行接收端代码:

1、sudo killall wpa_suppliment2、cd linux-80211n-csitool-supplementary/injection3、sudo bash ./setup_monitor_csi.sh wlan0 64 HT20 //执行接收端的初始化脚本4、sudo /home/znx/linux-80211n-csitool-supplementary/netlink/log_to_file name.dat 9 /执行log_to_file程序,储存为dat文件

发射端 

首先把setup_inject.sh这个文件放在发射端设备injection文件夹下,其代码如下

#!/usr/bin/sudo /bin/bash
service network-manager stop
WLAN_INTERFACE=$1
SLEEP_TIME=2
modprobe iwlwifi debug=0x40000
if [ "$#" -ne 3 ]; thenecho "Going to use default settings!"chn=64bw=HT20
elsechn=$2bw=$3
fi
sleep $SLEEP_TIME
ifconfig $WLAN_INTERFACE 2>/dev/null 1>/dev/null
while [ $? -ne 0 ]
doifconfig $WLAN_INTERFACE 2>/dev/null 1>/dev/null
done
sleep $SLEEP_TIME
echo "Add monitor mon0....."
iw dev $WLAN_INTERFACE interface add mon0 type monitor
sleep $SLEEP_TIME
echo "Bringing $WLAN_INTERFACE down....."
ifconfig $WLAN_INTERFACE down
while [ $? -ne 0 ]
doifconfig $WLAN_INTERFACE down
done
sleep $SLEEP_TIME
echo "Bringing mon0 up....."
ifconfig mon0 up
while [ $? -ne 0 ]
doifconfig mon0 up
done
sleep $SLEEP_TIME
echo "Set channel $chn $bw....."
iw mon0 set channel $chn $bw

然后在终端中依次执行发射端代码:

1、cd linux-80211n-csitool-supplementary/injection/2、sudo bash ./setup_inject.sh wlan0 64 HT20 3、sudo echo 0x4101 | sudo tee /sys/kernel/debug/ieee80211/phy0/iwlwifi/iwldvm/debug/monitor_tx_rate4、sudo ./random_packets 100000 100 1 1000

其中第4行代码Linux CSI Tool 完整使用说明(一发一收,monitor模式)(权威版 已成功测试)_ZJU_SLM的博客-CSDN博客_csi tools可以参考这位博主的解释,random_packets:第一个参数是累计发包数量,第二个参数是包的大小,第三个参数1代表injection MAC,用1就可以了,最后一个参数代表每隔1000微秒发一次包,即一秒发1000个包,1000Hz。(一般来说,做人行为识别,频率不要太低,我看的文献有些用的甚至是2000Hz)

运行过程中

发送端按完回车之后终端会不停地滚动小点点,每新出现一个点点意味着发送了1000个包,接受端按完回车之后,也是一行行滚动的画面,速度取决于你发包的设定。

接受端的csi数据会自动存在linux-80211n-csitool-supplementary/injection/ 中,以dat文件形式存在(如果你接收端代码里命名是XX.dat)。

Monitor模式的实时可视化

注,我是在接收端电脑直接进行数据可视化,因此需要安装Matlab,我装的是Matlab R2014b,软件包和具体安装过程可以参考:

Ubuntu16.04安装Matlab R2014b_felicx温水煮青蛙的博客-CSDN博客_matlabr2014b

与AP模式下的可视化类似,这里是把魂灵序曲博主那篇教程的步骤稍微改动一点。

第1、2步不变,运行read_bf_socket.m(记得要在linux-80211n-csitool-supplementary/matlab路径下运行,不然会报错),这是matlab的command window会显示waiting for connection on port 8090。

第3步也不变,只需要第一次拷贝就可以,之后操作可以略过。

正常运行Monitor模式的发射端和接收端,再在接收端的电脑上另开一个终端执行第4、5、7步,马上就可以看到Matlab的图框跳出来。

5 Matlab解析数据

原始data文件:dat文件(包含各个天线对的信号状态强度RSSI,时间戳,噪声等),不可直观读取,由于我设置的发射频率为1000Hz,所以每秒钟接受的数据量大概是1000*1* 3

原始CSI数据:matlab会将dat文件中的数据读取存入数组,这时可接调用便于后续分析

这里是在另外一台windows电脑上进行操作,解析数据要用到CSI TOOL中的一个read_bf_file文件,把linux-80211n-csitool-supplementary/matlab这个文件夹拷贝过来就可以。

参考这位博主的教程

CSI信号的处理_山人自有锦囊妙计的博客-CSDN博客_csi信号处理

matlab解析脚本如下,此m文件需要和read_bf_file文件储存在同一文件夹中,运行时需要添加到路径。

clc;
clear;
csi_trace = read_bf_file('name.dat');
row = size(csi_trace,1);for i=1:row %这里是取的数据包的个数csi_entry = csi_trace{i};csi = get_scaled_csi(csi_entry); %提取csi矩阵    csi = csi(1,:,:);csi1 = abs(squeeze(csi).');          %提取幅值(降维+转置)%只取一根天线的数据first_ant_csi(:,i) = csi1(:,1);           %直接取第一列数据(不需要for循环取)second_ant_csi(:,i) = csi1(:,2);third_ant_csi(:,i) = csi1(:,3);%         for j=1:30
%             csi15_end(i,:)=csi1(j,:);           %3个信道第j个子载波
%         end
end%画第一根天线的载波
%plot(first_ant_csi.')
%plot(second_ant_csi.')
plot(third_ant_csi.')

运行结果:

这个代码读取数据后存在了csi_trace这个数组中,可以在MATLAB主窗口调用查看。

根据其他博主的教程:

timestamp_low:相连两包此值差单位为微秒,通过验证发现100hz的发包频率此差值为10000,20hz的发包频率此差值为50000。

bfee_count:驱动记录并发送到用户控件的波束测量值的总数。内核和用户空间中netlink频道是有损的,可以用该变量来检测被丢弃的测量值。

Nrx:接收端使用的天线数量。

Ntx:发送端使用的天线数量。

rssi_a, rssi_b, rssi_c:由接收端NIC测量出的RSSI值(信号强度)

perm:展示NIC如何将3个接收天线的信号排列到3个RF链上,例如[1 2 3]表示天线A被发送到RF链A,天线B被发送到RF链B,天线C被发送到RF链C。

rate:发包频率。

csi:CSI值。(接收天线数量*发射天线数量*子载波数量)

6 实验心得

虽然硬件和环境配置已经够麻烦了,但是安装好了之后会发现这并不是最麻烦的地方,再怎么样都是一次性的东西,一遍很难顺利装完,但是多装几次,研究个两三周总能完事,虽然说信号的接受发送受场地环境较大,但是知道实验机器没有大变动,代码固定下来,基本都是能正常运行,装成功后做实验的时候运行了上百次,没有出现再需要重装系统,重装程序的问题。最大的问题是CSI TOOL本身,运行不稳定挺麻烦的

2022/07 CSI TOOL 安装及使用相关推荐

  1. CSI Tool的安装

    本文记录了自己安装Linux 802.11n CSI Tool的点(xue)点(lei)滴滴. 环境配置 首先,需要一个Intel WiFi Link 5300无线网卡,网上卖的该型号网卡主要有两种接 ...

  2. Atheros CSI Tool环境搭建之路由器配置记录---2022/03/22

    Atheros CSI Tool路由器配置 路由器刷入OpenWRT固件 准备工作: 刷入步骤 官网对于安装openwrt的指导 硬件准备 安装OpenWRT Install from binary ...

  3. 【2020/6/24整理版】利用csi tool获取csi数据并进行数据解析----适合初学的小白

    1.准备工作 <1> 查看自己电脑是否能安装Intel 5300网卡,不能安装的话直接看文章最后,尝试Atheros csi tool工具. <2> 安装Ubuntu系统,cs ...

  4. 【笔记】Linux 802.11n CSI Tool部分机翻

    Linux 802.11n CSI Tool 详情参照:http://dhalperi.github.io/linux-80211n-csitool/faq.html FAQ, Things to K ...

  5. 用python读取dat文件,wifi数据采集工具csi tool数据文件(.dat文件)解析

    项目地址: https://github.com/hongshixian/CSI_reader 前言 数据采集工具csi_tool采集数据并保存为后缀.dat的数据文件,在csi_tool中提供一个c ...

  6. 信奥学习规划 信息学竞赛之路(2022.07.31)

    信奥(CSP-J/S初赛)公益讲座精选系列之考试形式介绍 信奥(CSP-J/S初赛)公益讲座精选系列之考试形式介绍_哔哩哔哩_bilibili 2022年信息学奥赛学习规划讲座 2022年信息学奥赛学 ...

  7. 信奥中的数学 相关资料汇总(2022.07.08)

    信奥中的数学 数论篇 相关资料汇总(2022.07.07) 信奥中的数学 数论篇 相关资料汇总(2022.07.07)_dllglvzhenfeng的博客-CSDN博客 信奥中的数学 组合篇 相关资料 ...

  8. Virgo Tool安装及Virgo服务器配置

    说在前面的话 本人这些天做OSGI得项目实战,发现以前STS版本里面有Eclipse RT(即安装Virgo服务器的容器),以前2.9版本以前自带有,但是现在我机器上下载的是最新STS 3.5版本,v ...

  9. 会声会影2022简体中文旗舰一键安装版

    使用全新的 Corel VideoStudio 2022潜心进行创意视频编辑.VideoStudio 拓展了易用性和突破性创意这一备受称赞的组合,配置了全新的智能影片制作工具,增强了遮罩和调色,并改进 ...

最新文章

  1. jQuery获取或设置元素的宽度和高度
  2. zookeeper源码分析之三客户端发送请求流程
  3. 线程间的通信方式1--共享变量(内存)
  4. 开发者70行代码破解苹果OSX远程锁定安全功能
  5. 李炎恢的课程中心(JQUERY视频)
  6. Zookeeper C API 指南一(准备工作)
  7. Oracle 11g for Linux安装前准备工作
  8. 小天使幼儿园管理系统 免费
  9. SQL 2012企业版安装教程
  10. 2022年7月国产数据库大事记-墨天轮
  11. 用计算机如何扫描文件,打印机扫描文件到电脑方法教程
  12. npm start 端口修改(window系统环境下)
  13. CNN——残差网络实现
  14. 微信小程序第三方平台开发配置
  15. HDFS常用命令的学习
  16. antd mobile toast 数字不会换行
  17. Sublime Text:选择变量的所有实例并编辑变量名称
  18. php调用翻译,PHP调用有道词典翻译API实现翻译功能及代码
  19. OLTP与OLAP简介
  20. 《真实的幸福》 -豆瓣评分8.2

热门文章

  1. 解决Ubuntu重启后VMware Tools失效问题
  2. 让人感慨的10句英语短句
  3. 【CJOJ】为了博多
  4. uni-app 171部分小细节优化
  5. Kubernetes 常见运维技巧
  6. 安装Ubuntu之后要做的事情+美化
  7. jquery实现将注册信息保存表格中
  8. Slack 完整教學與上手心得:找到正確的團隊溝通之道
  9. python处理表格数据教程_代码详解:使用Python从不同表格中提取数据
  10. H5标签<video>安卓端兼容性问题