admin管理员组

文章数量:1547452

前言

记录使用Nexus5手机采集CSI配置过程和遇到的问题。


一、实验设备和环境

  1. Nexus5手机:Android 6.0.1系统,M4B30Z固件,已ROOT。具体操作过程可以参考 Nexus 5刷机(Android 6.0.1,M4B30Z 固件)和ROOT教程
    可以在购买手机时让商家配好系统和安装固件。
    参考链接教程ROOT即可。
  2. TP-Link路由器:TL-WDR5610(路由器不要设置密码
  3. 环境:电脑安装双系统,Win10 + Ubuntu 18.04/22.04(虚拟机也能采集到数据,但是用MATLAB处理带不动)

二、操作步骤

  1. 进入Ubuntu系统,打开终端后获取超级用户权限,切换目录,安装dependencies;
sudo su		//获取超级用户权限
cd /home	//需要保证该目录下有10G+空间安装其他内容
apt-get install git gawk qpdf adb flex bison	//安装dependcies
  1. 64位系统需要安装i386库;
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
  1. 从github获取nexmon项目;
git clone git://github/seemoo-lab/nexmon.git

注:Linux系统中执行git clone时可能会出现报错 fatal: unable to access… 连接不上,可以执行

git clone https://ghproxy/https://github/seemoo-lab/nexmon.git

或者执行

git clone https://github/seemoo-lab/nexmon.git
  1. 切换到目录/opt下,新建ndk文件夹,下载安装Android NDK r11c并解压,
cd /opt		//切换到opt下
mkdir ndk	//新建ndk文件夹
cd ./ndk	//切换到/opt/ndk下
wget -c https://dl.google/android/repository/android-ndk-r11c-linux-x86_64.zip	//下载Android NDK r11c
apt install fastjar		//安装jar
jar xvf android-ndk-r11c-linux-x86_64.zip	//解压文件
  1. 配置PATH路径
apt install vim		//安装vim
sudo vim /etc/profile

打开文件后,输入大写 I 在文件末尾添加

export NDK_ROOT=/opt/ndk/android-ndk-r11c
export PATH=$NDK_ROOT:$PATH

按ESC键,输入:wq保存并退出。刷新环境变量

source /etc/profile
# 在以下文件中添加环境变量
cd /home/nexmon
sudo vim setup_env.sh
# 刷新环境变量
source setup_env.sh
  1. 检验权限
chmod a+x -R android-ndk-r11c	//赋予权限
ndk-build -v	//任意路径下执行

这里如果报错 ndk-build 命令未找到,只需要将android-ndk-r11c文件移动到/opt/ndk即可。

  1. 这里要安装gcc,g++,python,为后边安装补丁做准备;
apt install gcc
apt install g++
apt install python
  1. 进入nexmon文件夹,配置环境变量;
cd /home/nexmon		
source setup_env.sh
make
cd utilities	//进入utilies文件夹
make
  1. 将配置好的手机与电脑连接,执行:
make install
cd ../patches/bcm4339/6_37_34_43	//进入该目录
git clone https://github/seemoo-lab/nexmon_csi.git	//获取nexmon_csi
cd nexmon_csi
make install-firmware	//为手机安装补丁
cd ./utils/makecsiparams
make

Ubuntu18.04自动忽略此条。
Ubuntu22.04 会在为手机安装补丁时报错:
这里是python版本问题。需要将Ubuntu22.04默认的python版本从3.10改为2.7。具体操作如下:

# 分别查看python,python2,python3的版本
python --version		
python2 --version	
python3 --version 
# 分别查看位置
which python
which python3
# 让python默认指向python2.7,python3指向python3.10
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 2
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1
# 查看python版本
python

修改完python版本后,需要重新执行make install-firmware为手机安装补丁即可。

此处参考链接:在Ubuntu 18.04上安装不同版本的python及选择默认Python

  1. 路由器联网,进入 http://tplogin/ 页面设置157信道下带宽80并保存设置;

  2. 另打开一个终端,进入手机端;

adb shell	//执行后记得打开手机确认连接
su
ifconfig wlan0 up	//打开wlan0
ifconfig 	//可查看wlan0是否已打开
  1. 回到第一个终端,获取路由器MAC地址,调用makecsiparams执行命令生成参数字符串;
# 这里路由器地址非常重要,会影响后期能否获取数据,必须是路由器设置在157信道80带宽时的MAC地址
iwlist wlan0 scan | grep -C 5 "AAAAA"	//AAAAA为路由器名称,执行后会出现路由各信道和带宽下的MAC地址,我是把这部分结果保存成了txt文件,便于后续切换信道和带宽时寻找
# 这里157表示信道,80表示带宽,00:11:22:33:44:55表示路由器MAC地址
# -C 给出的数字会告诉芯片应当提取哪些接收端/天线的CSI
./makecsiparams -c 157/80 -C 1 -N 1 -m 00:11:22:33:44:55 

执行后会生成一段代码m+ABCDEFGHIJKLMNOPQAAAAA==(举例),复制以便后续使用。

  1. 返回第二个终端(手机端);
nexutil -Iwlan0 -s500 -b -l34 -vm+ABCDEFGHIJKLMNOPQAAAAA==		//设置nexutil参数,-v后是上一步生成的代码
nexutil -k		//可以查看是否是157信道80带宽
nexutil -Iwlan0 -m1		//设置为monitor模式
  1. 采集数据;
tcpdump -i wlan0 -v dst port 5500 -w /sdcard/csi.pcap -c 1000	//采集1000个数据包放在手机的sdcard中

运行后会显示got0,got100…, got1000后会自动结束。

  1. 在新终端新建文件存储csi数据,将数据从手机中提取到Ubuntu的文件夹中;
cd /home/
mkdir csidata
cd csidata
adb pull /sdcard/csi.pcap
  1. 使用matlab可视化pcap文件;
cd ../utils		//切换目录,下载matlab并安装,这里我是在学校官网下载的,过程不做赘述

这里需要修改一下csireader.m文件

%% configuration
CHIP = '4358';          % wifi chip (possible values 4339, 4358, 43455c0, 4366c0)
BW = 80;                % bandwidth
FILE = './example.pcap';% capture file,文件位置可修改为想要可视化的pcap文件位置
NPKTS_MAX = 1000;       % max number of UDPs to process
gcc unpack_float.c unpack_float.mexw64	//编译文件
matlab ./matlab/csireader.m		//利用matlab执行csireader.m文件

三、可视化结果

example.pcap可视化的运行结果:

四、常见报错及解决

  1. 步骤9中为手机安装补丁,执行make install-firmware报错 definitions.mk: 没有那个文件或目录。
    解决:进入nexmon文件夹,重新执行 source setup_env.sh 配置环境变量。
    报错 make: [makefile: 222: gen/ucode.bin]错误1
    解决:安装gcc,g++和python后再次安装补丁;进入/home/nexmon/buildtools进行make。
  2. 步骤14中采集数据一直显示got0.
    解决:可能是路由器MAC地址不正确。
  3. 配置成功后切换到/home/nexmon/utilities路径下编译报错无法编译nexutil。
    解决:切换到对应目录下执行,git checkout nexutil。参考链接

更多报错及解决方法可以在seemoo-lab中检索。


总结

以上是使用nexus5手机和路由器采集CSI的过程,目前还在探索更多实时可视化的方法。

参考链接

seemoo-lab/nexmon
Nexus 5手机使用Nexmon工具获取CSI信息
使用nexus 6P同时获取CSI和RSSI数据(保姆级教程)
Nexus 5刷机(Android 6.0.1,M4B30Z 固件)和ROOT教程
Nexus 6P获取CSI(含刷机、root)
nexus5获取csi数据
在Ubuntu 18.04上安装不同版本的python及选择默认Python

本文标签: csi