您的位置:首页 > 运维架构

OpenWrt Wireless STA连接AP脚本

2016-07-21 17:19 453 查看

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的内容

NoneWEPWEP shareWPA-PSKWPA2-PSKWPA-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”
}
因此思路是

1. 修改wpa_supplicant-ath01.conf文件;

2. 重启wpa_supplicant进程;

3. 重启对应接口的udhcpc进程;

4. 修改写入/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


96e7
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: