使用的是飞凌RK3576的开发板,里面测试wifi功能的shell脚本如下:
function wifi_dial_up(){
# SSID="forlinx-wlan"
SSID=$1
PASSWORD=$2
ifconfig end0 down > /dev/null 2>&1
ifconfig end1 down > /dev/null 2>&1
ifconfig usb0 down > /dev/null 2>&1
ip route flush table main
#rk3576
sed -i "s/^\s*ssid=\(.*\)/\tssid=\"$SSID\"/" ./tool/wpa_supplicant.conf
sed -i "s/^\s*psk=\(.*\)/\tpsk=\"$PASSWORD\"/" ./tool/wpa_supplicant.conf
rmmod -f moal > /dev/null 2>&1;rmmod -f mlan > /dev/null 2>&1
insmod ./tool/mlan.ko 2>&1
insmod ./tool/moal.ko cal_data_cfg=none fw_name=sdiouart8987_combo_v0.bin sta_name=wlan cfg80211_wext=12
wpa_supplicant -i wlan0 -c ./tool/wpa_supplicant.conf &
sleep 40
dhclient -i wlan0 &
sleep 2
}
function wifi_connect_confirm(){
ping -I wlan0 222.222.222.222 -c 1 -s 100 -W 1 > /func/detail_log/wifi_data.tmp
times=`grep -c "time=" /func/detail_log/wifi_data.tmp`
if [ $times -eq 1 ]; then
echo -e "\033[32m Wifi test PASSED \033[0m" >> $DETAIL_LOG
echo -e "\033[32m Wifi test PASSED \033[0m"
rm /func/detail_log/wifi_data.tmp
else
echo -e "Different data \033[31m Wifi test FAILED \033[0m" >> $DETAIL_LOG
echo -e "Different data \033[31m Wifi test FAILED \033[0m"
echo "Wifi test failed" >> test_result.txt
# ifconfig wlan0 down > /dev/null 2>&1
# ifconfig uap0 down > /dev/null 2>&1
# ifconfig wfd0 down > /dev/null 2>&1
killall wpa_supplicant
rmmod -f moal > /dev/null 2>&1
rmmod -f mlan > /dev/null 2>&1
ifconfig wlan0 down > /dev/null 2>&1
fi
}
DETAIL_LOG="/func/detail_log/wifi_detail.log"
rm $DETAIL_LOG > /dev/null 2>&1
echo "************* WIFI test **********" >> $DETAIL_LOG
if ifconfig | grep -q "wlan0"; then
dhclient -i wlan0
sleep 2
ip route flush table main
ip route add 10.10.20.0/22 dev wlan0
ip route add default via 10.10.23.254 dev wlan0
wifi_connect_confirm
else
ip route flush table main
killall wpa_supplicant
rmmod -f moal > /dev/null 2>&1
rmmod -f mlan > /dev/null 2>&1
ifconfig wlan0 down > /dev/null 2>&1
wifi_dial_up $1 $2
sleep 3
wifi_connect_confirm
fi
逐条解析如下:
ifconfig end0 down
关闭名为end0的网络接口,这是一个ethernet网口。ip route flush table main
- ip:网络配置工具。
- route:指定操作对象的类型为路由表。
- flush:操作为清空。
- table main:指定操作对象的名称为main。
sed -i "s/^\s*ssid=\(.*\)/\tssid=\"$SSID\"/" ./tool/wpa_supplicant.conf
sed -i "s/^\s*psk=\(.*\)/\tpsk=\"$PASSWORD\"/" ./tool/wpa_supplicant.conf
sed是一个流编辑器,用于对文本进行搜索、替换、删除、插入等操作。这两个命令的具体功能是修改./tool/wpa_supplicant.conf文件中关于ssid(无线网络名称)和psk(无线网络密码)的配置信息。rmmod -f moal
rmmod -f mlan
- rmmod:用于从内核中移除(卸载)已经加载的内核模块。
- moal和mlan:要卸载的内核模块的名称。
insmod ./tool/mlan.ko
- insmod:用于将指定的内核模块(.ko文件)加载到内核中。
- ./tool/mlan.ko:要加载的内核模块文件的路径。
insmod ./tool/moal.ko cal_data_cfg=none fw_name=sdiouart8987_combo_v0.bin sta_name=wlan cfg80211_wext=12
- cal_data_cfg=none:指定内核模块的cal_data_cfg参数的值为none。
wpa_supplicant -i wlan0 -c./tool/wpa_supplicant.conf &
- wpa_supplicant:用于管理 WPA(Wi-Fi Protected Access)认证的客户端程序。
- -i wlan0:指定要操作的无线网卡接口名称为wlan0。
- -c ./tool/wpa_supplicant.conf:指定配置文件的路径为当前目录下tool文件夹中的wpa_supplicant.conf
- &:这个符号表示将该命令放入后台运行。
dhclient -i wlan0 &
- dhclient:一个动态主机配置协议(DHCP)客户端程序,用于从 DHCP 服务器获取 IP 地址、子网掩码、网关等网络配置信息。
- -i wlan0:指定要操作的无线网卡接口名称为wlan0。
ping -I wlan0 222.222.222.222 -c 1 -s 100 -W 1 > /func/detail_log/wifi_data.tmp的含义
- -c 1:表示只发送 1 个 ICMP 回显请求数据包。默认情况下,ping命令会持续发送数据包直到用户手动停止,使用-c选项可以指定发送数据包的数量。
- -s 100:设置发送的 ICMP 数据包的大小为 100 字节(不包括 ICMP 头)。
- -w 1:设置等待目标主机响应的超时时间为 1 秒。
-
/func/detail_log/wifi_data.tmp:这是输出重定向操作。>符号将ping命令的标准输出重定向到指定的文件/func/detail_log/wifi_data.tmp中。这意味着ping命令执行后的结果(包括发送和接收的数据包统计信息等)将不会显示在终端上,而是写入到该文件中保存。
总的步骤如下:
- 关闭除了wlan0外的其它的网口:
- 避免网络冲突:在一个网络环境中,每个设备需要有唯一的 IP 地址才能正常通信。如果多个网络接口同时启用,它们可能会尝试从 DHCP 服务器获取不同的 IP 地址,或者在某些情况下,可能会因为手动配置不当导致 IP 地址冲突。例如,一个以太网接口和 WiFi 接口同时连接到同一个局域网,若 DHCP 服务器为它们分配了相同的 IP 地址,就会导致网络通信故障,两个接口都无法正常工作。
- 配置优先级:如果多个网络接口同时处于活动状态,系统可能会优先使用其他网络接口进行网络连接,而忽略了对 WiFi 接口的配置更改。
- 统一网络设置:在某些情况下,用户可能希望整个系统只通过 WiFi 进行网络连接。关闭其他网络接口可以确保所有的网络流量都通过 WiFi 接口进行,便于进行统一的网络设置和管理。
- 清除系统中名称为“main”的路由表。
- 避免路由冲突:“main” 路由表是 Linux 系统中默认的主要路由表,其中存储着系统的网络路由信息,即数据包在网络中传输的路径规则。在设置新的 WiFi 连接之前,如果路由表中已经存在与旧网络连接相关的路由规则,这些规则可能会干扰新的 WiFi 连接配置。
- 修改./tool/wpa_supplicant.conf内容。
- 移除moal和mlan两个内核模块并以新的参数加载:
- 没查到是啥,应该是RK3576中和wifi有关的模块。
- 通过wpa_supplicant连接wlan0。
- 通过DHCP给wlan0分配IP。