有些朋友在做芯片研发时经常说能作为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呀。
还有些很娱乐的配置,如针对华为某AP的EDCA参数,哈哈哈。
六.其他测试方法
其他的还可以写些脚本、写c代码、重编wpa_supplicant、改造高通驱动代码等,这些得自行研究了。
由于我对安卓系统不是很熟,所以摸索的不是很完善,如果有啥更好的处理,请不防留言指导下我。