使用nexus 6P同时获取CSI和RSSI数据(保姆级教程)

记录一下踩坑历史,折磨了我接近半年。
项目地址
设备要求:nexus 6P,手机系统为Android8.0.0(一般在购买二手机器时可以让卖家帮忙刷机并root),虚拟机:Ubuntu16.04 64位(下载地址)
以下将开始固件安装与数据采集

固件安装

对应项目地址中的Getting Started

step 1:在VMware下安装好Ubuntu16.04 64位虚拟机

(不需要像项目里面一样安装xubuntu16.04)

step 2:打开终端(ctrl+alt+T)并安装一些依赖

sudo apt-get install git gawk qpdf adb flex bison

step 3:安装i386库

sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386

step 4:克隆nexmon项目:

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

step 5:下载安装Android NDK r11c(仅支持此版本),并配置环境变量

  1. 在终端进入管理员模式,然后打开并创建文件夹/opt/ndk
sudo su
cd /opt/
mkdir ndk
cd ndk
  1. 下载ndk开发包
wget -c https://dl.google.com/android/repository/android-ndk-r11c-linux-x86_64.zip
  1. 解压
apt-get install fastjar
jar xvf android-ndk-r11c-linux-x86_64.zip
  1. 打开/etc/profile文件
apt-get install vim
vim /etc/profile
  1. 按i开始编辑,在文件末尾添加以下环境变量:
export NDK_ROOT=/opt/ndk/android-ndk-r11c
export PATH=$NDK_ROOT:$PATH

这里输入完后按ESC后,再依次输出":wq"就可以保存退出vim了

  1. 刷新环境变量
source /etc/profile
  1. 给文件赋予执行权:
chmod a+x -R android-ndk-r11c
  1. 此时在任意路径都可以执行:
ndk-build -v

至此ndk就配置完毕,但是建议把上述的环境变量再添加一份到/nexmon/setup_env.sh文件的末尾,如果不这样做,则需要每次打开虚拟机就手动刷新一次ndk的环境变量:source /etc/profile

step 6:刷新nexmon的环境变量

cd /home/user/nexmon
source setup_env.sh

step 7:执行make指令

make
cd utilities
make

step 8:给手机安装固件

连接手机,并允许此计算机进行调试

make install

step 9:克隆nexmon_csi项目

进入nexmon/patches/bcm4358/7_112_300_14_sta/文件夹并克隆nexmon_csi项目:

cd nexmon/patches/bcm4358/7_112_300_14_sta/
git clone https://github.com/seemoo-lab/nexmon_csi.git

step 10:给手机安装nexmon_csi固件

注意!!!这里一定要按照特定版本的固件,是2020年6月发布的,编号为7e3f9f720e1eb12ef11afd855515981d5a3b715b。我这里实测只有这个补丁可以同时获得CSI和RSSI数据,不然CSI数据就会像这样奇奇怪怪:
使用nexus 6P同时获取CSI和RSSI数据(保姆级教程)_第1张图片
血泪教训,真的,千万千万要用这个版本的固件。
以下命令第二行就是回滚到这个对应版本:

cd nexmon_csi
git checkout 7e3f9f720e1eb12ef11afd855515981d5a3b715b
make install-firmware

到这一步手机上要安装的东西都弄好了。

如果你对RSSI数据没有需求,那你可以尝试更旧的版本,不能比这个版本新,不然很有可能出现和我一样的问题。

step 11:生成makecsiparams的可执行文件

cd utils/makecsiparams
make

数据采集

step 1:获得一连串特定编码

./makecsiparams -c 157/80 -C 1 -N 1 -m 00:11:22:33:44:55

-c后面的是157信道和80MHz频率,可以在路由器的管理员界面进行设置的,-m后面的是路由器的mac地址,注意5g和2.4g的mac地址是不同的。

step 2:进入手机进行设置

adb shell

以下就进入手机的命令行了,首先输入指令进入管理员模式:

su

打开wlan:

ifconfig wlan0 up

设置nexutil的参数:

nexutil -Iwlan0 -s500 -b -l34 -vm+IBEQGIAgAAESIzRFWqu6q7qrsAAAAAAAAAAAAAAAAAAA==

上述-v后面接的编码就是之前生成的特定编码

然后设置成monitor模式就行了:

nexutil -Iwlan0 -m1

step 3:利用手机采集数据

tcpdump -i wlan0 -v dst port 5500 -w /sdcard/1.pcap -c 1000

上述指令-w后面的是指定的存储地址,你可以改成手机中的任意地址。-c后面的是采集的数据帧的个数。

采集到的数据幅度图长这样:
使用nexus 6P同时获取CSI和RSSI数据(保姆级教程)_第2张图片

如果在测量过程中进行拿起手机又放下的动作连续两次,就会得到这样的图:

使用nexus 6P同时获取CSI和RSSI数据(保姆级教程)_第3张图片

感觉还是很不错的!

总结

这玩意对我这种不怎么用Linux的人简直是折磨。安装固件的过程总是出现莫名其妙的bug。愿大家不要在这个上面踩雷了。但是nexmon固件的数据还是很不错的,比Intel 5300要好很多。

你可能感兴趣的:(android,adb)