如何使用高通手机作为WiFi对比机
时间:2022年11月05日 人气:...

有些朋友在做芯片研发时经常说能作为wifi对比机的芯片不多,一直都拿esp32/8266做为标杆去追。最近我看着手里的小米11寻思,这不是用的高通的方案吗,wifi用的Qualcomm-WCN6851-WiFi6/BT芯片,那么如果把这个利用起来,那不就是个现成的对比机吗?所以有必要探索一下,看看能不能深入干点啥。

一.root手机

首先linux类系统得拥有权限,才能做一些设置。之前曾听到过某些人说拿高通机做比对要刷userdebug版本才能行,其实这是完全不必要的,root了手机一样就行。不然从哪去索要userdebug版本,这可真是个问题,不是每个人都能有那资源。

各厂家手机root方法都不一样,而且就算同一款手机的root方法也不一样,这个自行选择就好,本文不深入研究怎么root手机。

我之前用过线刷第三方recovery方式来root,操作繁琐还要自己改一条刷机线,所以这里以我的小米11为例,说一种我觉得比较简单易操作的方法,大致步骤如下:

1. 解锁bootloader

   在手机开发者选项(点击MIUI版本五次)中点击设备解锁状态,然后按照页面提示输入小米账号绑定设备,申请解锁bootloader;

   找着下载小米的bootloader解锁工具miflash_unlock,按照程序提示操作解锁bootloader;   

2. 下载当前版本对应的刷机包

   在手机我的设备选择全部参数,就可以看到当前miui版本号,然后找着下载对应的完整线刷包;

3. 解压刷机包提取boot.img

   找着下载一个叫做payload_dumper的工具,可以解压线刷包,解压后的文件会在一个目录中,在里面就可以找到boot.img

4. 手机上安装magisk app

   magisk是当前最流行的root权限管理器,找着下载一个安装好。

5. 对boot.img打补丁

   打开magisk app,没有root的手机,首页就会提示要安装magisk的;

   点击安装magisk,安装方式选择 安装并修复一个文件,这个文件就是选boot.img,选择之后magisk就会对其打补丁生成一个新的magisk_patched-boot.img文件;

6. 刷入新的boot.img

   在解锁bootloader后我们就可以随意刷机了,所以这里用fastboot刷入boot即可;

   找着下好fastboot工具,将手机进入fastboot模式(音量下键+电源键),然后输入

   fastboot flash boot x:your_pathmagisk_patched-boot.img
   fastboot reboot

   手机重启后,打开magisk app,你就会看到首页显示不太一样了,这就完成了root。

二.运行Wpa_supplicant

 先找着下载好adb工具,把手机和电脑用数据线相连,在手机的开发者选项里面打开usb调试,然后在手机提示授权连接时要点下同意。

之后就执行adb shell就可以进入shell界面进行各种操作了,可以发现小米11内部也叫自己venus,哈哈哈。

需要注意,userdebug版本可以输入adb root,但是这user版本即使root了也不能这样做,想以root身份运行就在shell中用su root切换。

这时各项准备都已经完成了,然后在手机界面上把wifi开关和热点开关都关掉,接下来就可以开始我们的自定义操作之旅了。

执行ifconfig,发现wlan0接口已经创建,再观察lsmod,发现确实wifi驱动已经加载,那么加载驱动这一步已经省了。

接下来新开个cmd用来抓取wpa_supplicant的运行log,先执行

adb logcat -c

清除旧log,再执行

adb logcat | findstr wpa_supplicant

启动抓log。

这时在另一个cmd窗口shell中执行

/vendor/bin/hw/wpa_supplicant -O /data/vendor/wifi/wpa/sockets3 -p use_p2p_group_interface=1 -dd -i wlan0 -c /data/vendor/wifi/wpa/wpa_supplicant.conf -B

之所以用socket3这个名字,是为了和系统默认的区分开来,免得被系统后台所操作了造成影响,当然也可以自己改成其他名字,这个无所谓。

运行成功启动的话,log窗口就会输出大量log。

三.运行wpa_cli

在shell中执行

wpa_cli -i wlan0 -p /data/vendor/wifi/wpa/sockets3

这里的socket3要和上面wpa_supplicant指定的控制接口一致,不然连不上。

成功之后就可以执行一系列指令操作wifi了,如扫描scan,查询扫描结果scan_results。

更多的指令可以输入help查看,或者自行参阅wpa_supplicant的源码和百度。


测试完成,要记得杀掉wpa_supplicant进程,不然影响wfi开关(通过ps和kill)。

当然也可以启动hostapd和hostapd_cli来控制softap流程,这里不在细述。

四.iw系列工具

高通了为了开发方便,提供了一些命令行工具专门用来操作wifi的,如

经过测试,我发现只有iw和iwpriv这两条命令被适配了可以正常使用。

iw工具支持这些

Usage:  iw [options] command
Options:
        --debug         enable netlink debugging
        --version       show version (4.1)
Commands:
        help [command]
        event [-t] [-r] [-f]
        phy <phyname> info
        list
        phy
        commands
        features
        phy <phyname> interface add <name> type <type> [mesh_id <meshid>] [4addr on|off] [flags <flag>*] [addr <mac-addr>]
        dev <devname> interface add <name> type <type> [mesh_id <meshid>] [4addr on|off] [flags <flag>*] [addr <mac-addr>]
        dev <devname> del
        dev <devname> info
        dev <devname> station get <MAC address>
        dev <devname> station del <MAC address>
        dev <devname> station set <MAC address> plink_action <open|block>
        dev <devname> station set <MAC address> vlan <ifindex>
        dev <devname> station set <MAC address> mesh_power_mode <active|light|deep>
        dev <devname> station dump
        dev <devname> survey dump
        dev <devname> ocb join <freq in MHz> <5MHZ|10MHZ>
        dev <devname> ocb leave
        dev <devname> scan [-u] [freq <freq>*] [ies <hex as 00:11:..>] [meshid <meshid>] [lowpri,flush,ap-force] [randomise[=<addr>/<mask>]] [ssid <ssid>*|passive]
        dev <devname> scan dump [-u]
        dev <devname> scan trigger [freq <freq>*] [ies <hex as 00:11:..>] [meshid <meshid>] [lowpri,flush,ap-force] [randomise[=<addr>/<mask>]] [ssid <ssid>*|passive]
        dev <devname> scan sched_start interval <in_msecs> [delay <in_secs>] [freqs <freq>+] [matches [ssid <ssid>]+]] [active [ssid <ssid>]+|passive] [randomise[=<addr>/<mask>]]
        dev <devname> scan sched_stop
        reg set <ISO/IEC 3166-1 alpha2>
        reg get
        phy <phyname> reg get
        dev <devname> disconnect
        dev <devname> connect [-w] <SSID> [<freq in MHz>] [<bssid>] [key 0:abcde d:1:6162636465]
        dev <devname> auth <SSID> <bssid> <type:open|shared> <freq in MHz> [key 0:abcde d:1:6162636465]
        dev <devname> link
......

经过使用发现,iw扫描结果里面解析的信息很多啊,都可以不用看抓包了。


iwpriv支持这些

setPower         (0003) : set   1 int   & get   0
setMaxAssoc      (0004) : set   1 int   & get   0
scan_disable     (0005) : set   1 int   & get   0
...
setModDTIM       (0060) : set   1 int   & get   0
get11Dstate      (0001) : set   0       & get   1 int
getwlandbg       (0004) : set   0       & get   1 int
getMaxAssoc      (0006) : set   0       & get   1 int
getAutoChannel   (0008) : set   0       & get   1 int
getconcurrency   (0009) : set   0       & get   1 int
get_nss          (000B) : set   0       & get   1 int
get_ldpc         (000C) : set   0       & get   1 int
get_tx_stbc      (000D) : set   0       & get   1 int
get_rx_stbc      (000E) : set   0       & get   1 int
get_shortgi      (000F) : set   0       & get   1 int
get_rtscts       (0010) : set   0       & get   1 int
get_chwidth      (0011) : set   0       & get   1 int
...
getHostStates    (000A) : set   0       & get 2047 char
getConfig        (0003) : set   0       & get 2047 char
getRSSI          (0006) : set   0       & get 2047 char
getWmmStatus     (0004) : set   0       & get 2047 char
getChannelList   (0005) : set   0       & get 2047 char
...
setMonChan       (0017) : set   2 int   & get   0
hostroamdelay    (003B) : set   0       & get   1 int
set_11ax_rate    (005B) : set   1 int   & get   0
enable_dcm       (005C) : set   1 int   & get   0
range_ext        (005D) : set   1 int   & get   0
set_ft_ies       (8BF4) : set 384 char  & get   0

这下好了,还可以用set_11ax_rate指定wifi6的发送速率了。

五.修改WCNSS_qcom_cfg.ini配置文件

我发现高通的wifi固件配置文件在

/vendor/firmware/wlan/qca_cld/WCNSS_qcom_cfg.ini

这里面包含了很多的配置,具体的用法得在高通网站找文档(createpoint.qti.qualcomm.com),但是不是掏钱的企业账户是没法下载查看的,所以我在网上(source.codeaurora.org/quic/le/platform/vendor/qcom-opensource/wlan/prima)找了份不太新的高通wifi驱动代码,根据解析配置文件的代码wlan_hdd_cfg.c分析都有些啥参数。。。

配置文件里面有很多有意思的选项,如bcast_twt=1,这可以配置wifi6 twt呀。

还有些很娱乐的配置,如针对华为的EDCA参数,哈哈哈。

六.其他测试方法

其他的还可以写些脚本、写c代码、重编wpa_supplicant、改造高通驱动代码等,这些得自行研究了。


由于我对安卓系统不是很熟,所以摸索的不是很完善,如果有啥更好的处理,请不防留言指导下我。

热门评论