OpenWrt Wireless STA连接AP脚本
一、概述
OpenWrt配置成AP+STA模式了(具体方法可以参考我的文章:OpenWrt无线AP+STA配置),每次STA连接不同AP时,通常方法是需要修改配置文件/etc/config/wireless
中,对端AP的密码、SSID等,然后执行wifi up
进行无线重启,这样会让AP Mode也重启,如果有设备连接到AP,会导致他们断线重连,有没有不重启wifi就可以让STA重新连接呢?
二、思路
实际STA连接到不同AP,主要变化是SSID及加密认证,OpenWrt中也是采用wpa_spplicant来进行管理的,因此只要重启这个进程,是否就可以了?
查看一下wpa_supplicant进程,主要使用了/var/run/wpa_supplicant-ath01.conf的配置。
root@OpenWrt:/# ps |grep wpa
1568 root 1676 S wpa_supplicant -B -P /var/run/wifi-ath01.pid -D athr -i ath01 -c /var/run/wpa_supplicant-ath01.conf
2324 root 1500 S grep wpa
root@OpenWrt:/#
下面是不同加密模式/var/run/wpa_supplicant-ath01.conf的内容
None | WEP | WEP share | WPA-PSK | WPA2-PSK | WPA-PSK WPA2-PSK mixed |
---|---|---|---|---|---|
ctrl_interface=/var/run/wpa_supplicant-ath01 network={ scan_ssid=1 ssid=”XXXXXXXX” key_mgmt=NONE } | ctrl_interface=/var/run/wpa_supplicant-ath01 network={ scan_ssid=1 ssid=”XXXXXXXX” key_mgmt=NONE wep_key0=31313131313131313131313131 wep_tx_keyidx=0 auth_alg=OPEN } | ctrl_interface=/var/run/wpa_supplicant-ath01 network={ scan_ssid=1 ssid=”XXXXXXXX” key_mgmt=NONE wep_key0=31313131313131313131313131 wep_tx_keyidx=0 auth_alg=SHARED } | ctrl_interface=/var/run/wpa_supplicant-ath01 network={ scan_ssid=1 ssid=”XXXXXXXX” key_mgmt=WPA-PSK proto=WPA psk=”123456789” } | ctrl_interface=/var/run/wpa_supplicant-ath01 network={ scan_ssid=1 ssid=”XXXXXXXX” key_mgmt=WPA-PSK proto=RSN psk=”123456789” } | ctrl_interface=/var/run/wpa_supplicant-ath01 network={ scan_ssid=1 ssid=”XXXXXXXX” key_mgmt=WPA-PSK proto=RSN WPA psk=”123456789” } |
因此思路是
- 修改wpa_supplicant-ath01.conf文件;
- 重启wpa_supplicant进程;
- 重启对应接口的udhcpc进程;
- 修改写入/etc/config/wireless,防止重启后丢失。
三、制作脚本
脚本内容:
设计了三个参数SSID、密码、加密模式
。
因为WEP基本不用了,所以简单化,只支持WPA。
#!/bin/sh
wpa_supplicant_conf="/var/run/wpa_supplicant-ath01.conf"
#check input arg
if [ $# -ne 3 ];then
echo "Usage: $0 SSID PASSWORD ENCRYPTION_TYPE(WPA/WPA2/WPAMIX)"
exit 0
fi
if [ ! "$3" = "WPA" ] && [ ! "$3" = "WPA2" ] && [ ! "$3" = "WPAMIX" ]; then
echo "ENCRYPTION_TYPE=$3 is err (WPA/WPA2/WPAMIX)"
exit 0
fi
#debug:
echo "SSID=$1"
echo "PASSWORD=$2"
echo "ENCRYPTION_TYPE=$3"
SCAN_SSID=" scan_ssid=1"
SSID=" ssid=\"$1\""
KEY_MGMT=" key_mgmt=WPA-PSK"
case "$3" in
"WPA" )
PROTO=" proto=WPA"
PROTO_UCI="psk"
;;
"WPA2" )
PROTO=" proto=RSN"
PROTO_UCI="psk2"
;;
"WPAMIX" )
PROTO=" proto=RSN WPA"
PROTO_UCI="psk-mixed"
;;
esac
PSK=" psk=\"$2\""
#check file exist
if [ ! -f "$wpa_supplicant_conf" ]; then
echo "$wpa_supplicant_conf is empty"
else
#if file exist
#1)modify wpa_supplicant-ath01.conf
mv $wpa_supplicant_conf $wpa_supplicant_conf".old"
touch $wpa_supplicant_conf
echo "ctrl_interface=/var/run/wpa_supplicant-ath01" >> $wpa_supplicant_conf
echo "network={" >> $wpa_supplicant_conf
echo $SCAN_SSID >> $wpa_supplicant_conf
echo $SSID >> $wpa_supplicant_conf
echo $KEY_MGMT >> $wpa_supplicant_conf
echo $PROTO >> $wpa_supplicant_conf
echo $PSK >> $wpa_supplicant_conf
echo "}" >> $wpa_supplicant_conf
#2)restart wpa_supplicant process:wpa_supplicant -B -P /var/run/wifi-ath01.pid -D athr -i ath01 -c /var/run/wpa_supplicant-ath01.conf
if [ -n "`ps |grep 'wpa_supplicant -B -P /var/run/wifi-ath01.pid'|grep -v 'grep'|awk '{print $1}'`" ]; then
kill "$(cat "/var/run/wifi-ath01.pid")"
fi
wpa_supplicant -B -P /var/run/wifi-ath01.pid -D athr -i ath01 -c /var/run/wpa_supplicant-ath01.conf &
#3)kill the ath01 dhcp client, it will restart automatically by /lib/netifd/proto/dhcp.sh
DHCPID=`ps |grep udhcpc-ath01|grep -v 'grep'|awk '{print $1}'`
if [ ! -n "$DHCPID" ]; then
echo "No udhcpc-ath01 process."
else
kill $DHCPID
fi
#4)update /etc/config/wireless
for i in 0 1; do
STA=`uci get wireless.@wifi-iface[$i].mode`
if [ "sta" = $STA ]; then
uci set wireless.@wifi-iface[$i].ssid=$1
uci set wireless.@wifi-iface[$i].encryption=$PROTO_UCI
uci set wireless.@wifi-iface[$i].key=$2
uci commit wireless
echo "uci commit over"
fi
done
fi