2022/07 CSI TOOL 安装及使用

目录

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。

2022/07 CSI TOOL 安装及使用_第1张图片

 由于我想做的是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,具体参考上述第一篇教程。

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

2022/07 CSI TOOL 安装及使用_第2张图片

 最后成品就是这样子,随便找了个东西固定天线2022/07 CSI TOOL 安装及使用_第3张图片

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

2022/07 CSI TOOL 安装及使用_第4张图片

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 
 */
#include "iwl_connector.h"

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define MAX_PAYLOAD 2048
#define SLOW_MSG_CNT 100

int 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, bind
	struct 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' PID
	proc_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; // kernel
	kern_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  

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

接受端

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

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

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

1、sudo killall wpa_suppliment

2、cd linux-80211n-csitool-supplementary/injection

3、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 ]; then
	echo "Going to use default settings!"
	chn=64
	bw=HT20
else
	chn=$2
	bw=$3
fi
sleep $SLEEP_TIME
ifconfig $WLAN_INTERFACE 2>/dev/null 1>/dev/null
while [ $? -ne 0 ]
do
	ifconfig $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 ]
do
	ifconfig $WLAN_INTERFACE down
done
sleep $SLEEP_TIME
echo "Bringing mon0 up....."
ifconfig mon0 up
while [ $? -ne 0 ]
do
	ifconfig 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_rate

4、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个包,接受端按完回车之后,也是一行行滚动的画面,速度取决于你发包的设定。

2022/07 CSI TOOL 安装及使用_第5张图片

接受端的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的图框跳出来。

2022/07 CSI TOOL 安装及使用_第6张图片

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.')

运行结果:

2022/07 CSI TOOL 安装及使用_第7张图片

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

2022/07 CSI TOOL 安装及使用_第8张图片

 2022/07 CSI TOOL 安装及使用_第9张图片

根据其他博主的教程:

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:发包频率。

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

6 实验心得

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

你可能感兴趣的:(CSI,matlab,linux)