前言
记录使用Nexus5手机采集CSI配置过程和遇到的问题。
一、实验设备和环境
- Nexus5手机:Android 6.0.1系统,M4B30Z固件,已ROOT。具体操作过程可以参考 Nexus 5刷机(Android 6.0.1,M4B30Z 固件)和ROOT教程
可以在购买手机时让商家配好系统和安装固件。
参考链接教程ROOT即可。 - TP-Link路由器:TL-WDR5610(路由器不要设置密码)
- 环境:电脑安装双系统,Win10 + Ubuntu 18.04/22.04(虚拟机也能采集到数据,但是用MATLAB处理带不动)
二、操作步骤
- 进入Ubuntu系统,打开终端后获取超级用户权限,切换目录,安装dependencies;
sudo su //获取超级用户权限
cd /home //需要保证该目录下有10G+空间安装其他内容
apt-get install git gawk qpdf adb flex bison //安装dependcies
- 64位系统需要安装i386库;
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
- 从github获取nexmon项目;
git clone git://github.com/seemoo-lab/nexmon.git
注:Linux系统中执行git clone时可能会出现报错 fatal: unable to access… 连接不上,可以执行
git clone https://ghproxy.com/https://github.com/seemoo-lab/nexmon.git
或者执行
git clone https://github.com/seemoo-lab/nexmon.git
- 切换到目录/opt下,新建ndk文件夹,下载安装Android NDK r11c并解压,
cd /opt //切换到opt下
mkdir ndk //新建ndk文件夹
cd ./ndk //切换到/opt/ndk下
wget -c https://dl.google.com/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 //解压文件
- 配置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
- 检验权限
chmod a+x -R android-ndk-r11c //赋予权限
ndk-build -v //任意路径下执行
这里如果报错 ndk-build 命令未找到,只需要将android-ndk-r11c文件移动到/opt/ndk即可。
- 这里要安装gcc,g++,python,为后边安装补丁做准备;
apt install gcc
apt install g++
apt install python
- 进入nexmon文件夹,配置环境变量;
cd /home/nexmon
source setup_env.sh
make
cd utilities //进入utilies文件夹
make
- 将配置好的手机与电脑连接,执行:
make install
cd ../patches/bcm4339/6_37_34_43 //进入该目录
git clone https://github.com/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
-
路由器联网,进入 http://tplogin.cn/ 页面设置157信道下带宽80并保存设置;
-
另打开一个终端,进入手机端;
adb shell //执行后记得打开手机确认连接
su
ifconfig wlan0 up //打开wlan0
ifconfig //可查看wlan0是否已打开
- 回到第一个终端,获取路由器MAC地址,调用makecsiparams执行命令生成参数字符串;
# 这里路由器地址非常重要,会影响后期能否获取数据,必须是路由器设置在157信道80带宽时的MAC地址
iwlist wlan0 scan | grep -C 5 "AAAAA" //AAAAA为路由器名称,执行后会出现路由各信道和带宽下的MAC地址,我是把这部分结果保存成了txt文件,便于后续切换信道和带宽时寻找
# -c后的参数表示信道和带宽,这里是157信道,80带宽,00:11:22:33:44:55表示路由器MAC地址
# -C和-N分别表示Rx和Tx天线数,用二进制表示使用几根天线后再转为十进制(如Rx两根天线则为二进制11对应的十进制数3)
./makecsiparams -c 157/80 -C 1 -N 1 -m 00:11:22:33:44:55
# ./makecsiparams -c 157/80 -C 3 -N 1 -m 00:11:22:33:44:55
# 1Tx*2Rx的设置;nexus5是单天线,nexus6p为双天线
执行后会生成一段代码m+ABCDEFGHIJKLMNOPQAAAAA==(举例),复制以便后续使用。
- 返回第二个终端(手机端);
nexutil -Iwlan0 -s500 -b -l34 -vm+ABCDEFGHIJKLMNOPQAAAAA== //设置nexutil参数,-v后是上一步生成的代码
nexutil -k //可以查看是否是157信道80带宽
nexutil -Iwlan0 -m1 //设置为monitor模式
- 采集数据;
tcpdump -i wlan0 -v dst port 5500 -w /sdcard/csi.pcap -c 1000 //采集1000个数据包放在手机的sdcard中
运行后会显示got0,got100…, got1000后会自动结束。
- 在新终端新建文件存储csi数据,将数据从手机中提取到Ubuntu的文件夹中;
cd /home/
mkdir csidata
cd csidata
adb pull /sdcard/csi.pcap
- 使用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可视化的运行结果:
四、常见报错及解决
- 步骤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。 - 步骤14中采集数据一直显示got0.
解决:可能是路由器MAC地址不正确。 - 配置成功后切换到/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