OpenWrt Wireless STA连接AP脚本

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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值