openwrt可以根据配置进行查找相关可用wifi,进行切换,重新进行连接,可实现无缝连接,可配置循环周期、阀值、差值:
实例 wifi.sh 10 -75 10
#!/bin/sh
#apclii0是我设置的STA模式下的网络设备,该脚本就是根据设置时间扫描一次,判断STA模式下关联路由器是否有断网,
#1、IP_VAL是当时STA模式下关联的路由器名称,IP_ADD把多余的符号去掉,判断当前STA是否有关联到热点
#2、如果STA没有关联热点,判断当前配置的热点名称是什么,STA_NAME就是热点名称
#3、iwlist就是扫描当前的热点,是否有跟当前配置关联的热点名称一样的,如果一样就切换自己信道进行关联
#wifi_switch 3 -75 10 定时进行执行脚本, 阀值 ,差值 若阈值差值无,不执行根据判断条件
#存在的缺陷1、iwpriv apclii0 set SiteSurvey=0命令会产生ping丢包现象,2、切换wifi,会出现短暂的断网现象
#循环周期时间s
STOP=$1
#阀值
INIT_VAL=$2
#差值
D_NUM_VAL=$3
# dBm to Quality:
change_quality()
{
#echo "test $INIT_VAL"
#quality =2 * (dBm + 100)
if [ $INIT_VAL -le -100 ];then
quality=0
elif [ $INIT_VAL -ge -50 ];then
quality=100
else
TMP=$((${INIT_VAL}+100))
#echo " $TMP"
quality=`expr 2 \* $TMP`
fi
#echo $quality
return $quality
}
# 差值 to Quality:
change_percent()
{
TMP_NUM=`expr 2 \* $D_NUM_VAL`
return $TMP_NUM
}
# Quality to dbm 转换后存入/etc/config/wireless文件中
change_dbm()
{
echo $1
#dBm = (quality / 2) - 100
TMP_Quality=`expr $1 / 2`
#echo "11 $TMP_Quality"
DBM=`expr $TMP_Quality - 100`
#echo "111 $DBM"
TMP_NAME=`uci get wireless.@wifi-iface[0].ifname`
if [ "$TMP_NAME" == "ra0" ];then
uci set wireless.@wifi-iface[1].ApCliThreDBM="$INIT_VAL"
uci set wireless.@wifi-iface[1].ApCliDvDBM="$D_NUM_VAL"
uci set wireless.@wifi-iface[1].ApCliCurDBM="$DBM"
else
uci set wireless.@wifi-iface[0].ApCliThreDBM="$INIT_VAL"
uci set wireless.@wifi-iface[0].ApCliDvDBM="$D_NUM_VAL"
uci set wireless.@wifi-iface[0].ApCliCurDBM="$DBM"
fi
uci commit wireless
}
scanwifi()
{
#echo "name $1"
if [ "$1" == "" ];then
echo "para is null"
return $1
else
iwpriv apclii0 set SiteSurvey=0
#sleep 1
WLAN=`iwpriv apclii0 get_site_survey | grep -w $1`
fi
if [ "$WLAN" != "" ];then
SCAN_CH=`iwpriv apclii0 get_site_survey | grep -w $1 | sort -k 5 -nr | sed -n 1p | awk '{print $1}'`
CUR_TMP_SIG=`iwpriv apclii0 get_site_survey | grep -w $1 | sort -k 5 -nr |sed -n 1p | awk '{print $5}'`
CH_VAL=`iwlist apclii0 channel | grep Channel | awk '{print $2}'`
CUR_CH=${CH_VAL#*=}
change_dbm $CUR_TMP_SIG
if [ "$CUR_CH" != "$SCAN_CH" ];then
iwpriv apclii0 set Channel=$SCAN_CH
echo "iwpriv apclii0 set Channel=$SCAN_CH"
fi
echo "channel:current is $CUR_CH scan is $SCAN_CH"
#重新链接wifi
ifconfig apclii0 down
sleep 1
ifconfig apclii0 up
echo "ifconfig apclii0 up"
else
echo "not find $1"
fi
}
scanwifi_diff_value()
{
echo "scanwifi_diff_value"
#echo "name $1"
if [ "$1" == "" ];then
echo "para is null"
return $1
else
#iwpriv apclii0 set SiteSurvey=0
#sleep 1
WLAN=`iwpriv apclii0 get_site_survey | grep -w $1`
fi
if [ "$WLAN" != "" ];then
CH_VAL=`iwlist apclii0 channel | grep Channel | awk '{print $2}'`
CUR_CH=${CH_VAL#*=}
#当前信道值
CUR_SIG=`iwpriv apclii0 get_site_survey | grep -w $1 | grep -w $CUR_CH | sed -n 1p | awk '{print $5}'`
SCAN_SIG=`iwpriv apclii0 get_site_survey | grep -w $1 | sort -k 5 -nr | sed -n 1p | awk '{print $5}'`
SCAN_CH=`iwpriv apclii0 get_site_survey | grep -w $1 | sort -k 5 -nr |sed -n 1p | awk '{print $1}'`
change_dbm $CUR_SIG
#计算差值
let TEST=$SCAN_SIG-$CUR_SIG
echo "$TEST $SCAN_SIG-$CUR_SIG"
#小于0,结束
if [ $TEST -le 0 ];then
echo "xiao yu 0"
#change_dbm $CUR_SIG
return 0
fi
#符合大于差值,切换
if [ $TEST -ge $D_VAL ];then
#信道不同切换,相同重启
if [ "$CUR_CH" != "$SCAN_CH" ];then
iwpriv apclii0 set Channel=$SCAN_CH
change_dbm $SCAN_SIG
echo "iwpriv apclii0 set Channel=$SCAN_CH"
fi
fi
echo "channel:current is $CUR_CH scan is $SCAN_CH"
#重新链接wifi
ifconfig apclii0 down
sleep 1
ifconfig apclii0 up
echo "ifconfig apclii0 up"
#sleep 1
else
echo "not find $1"
fi
}
comp_val()
{
#echo "comp_val"
CH_CUR=`iwlist apclii0 channel | grep Channel | awk '{print $2}'`
NOW_CH=${CH_CUR#*=}
iwpriv apclii0 set SiteSurvey=0
#sleep 1
SIG_VAL=`iwpriv apclii0 get_site_survey | grep -w $NOW_CH | grep -w $1 | sort -k 5 -nr | sed -n 1p | awk '{print $5}'`
change_dbm $SIG_VAL
echo "comp_val :$SIG_VAL $NOW_CH"
if [ "$SIG_VAL" == "" ];then
echo "comp_val disconnect"
#STA_NAME=`cat /etc/config/wireless | grep ApCliSsid | awk '{print $3}' | sed $'s/\'//g'`
TEST_NAME=`uci get wireless.@wifi-iface[0].ifname`
if [ "$TEST_NAME" == "ra0" ];then
STA_NAME=`uci get wireless.@wifi-iface[1].ApCliSsid`
else
STA_NAME=`uci get wireless.@wifi-iface[0].ApCliSsid`
fi
scanwifi $STA_NAME
elif [ $SIG_VAL -lt $IN_VAL ];then
echo "小于设定值,需要切换wifi $IN_VAL"
#STA_NAME=`cat /etc/config/wireless | grep ApCliSsid | awk '{print $3}' | sed $'s/\'//g'`
TEST_NAME=`uci get wireless.@wifi-iface[0].ifname`
if [ "$TEST_NAME" == "ra0" ];then
STA_NAME=`uci get wireless.@wifi-iface[1].ApCliSsid`
else
STA_NAME=`uci get wireless.@wifi-iface[0].ApCliSsid`
fi
#计算差值
if [ $D_VAL ];then
scanwifi_diff_value $STA_NAME
else
scanwifi $STA_NAME
#sleep 6
fi
fi
}
while [ 1 ]
#echo "11 $IN_VAL"
do
if [ $INIT_VAL ];then
change_quality
IN_VAL=$?
#echo $IN_VAL
fi
if [ $D_NUM_VAL ];then
change_percent
D_VAL=$?
#echo $D_VAL
#echo "11 "
fi
IP_VAL=`iwconfig apclii0 | grep apclii0 | awk '{print $4}' | sed 's/\"//g'`
IP_ADD=${IP_VAL#*:}
if [ "$IP_ADD" == "" ];then
echo "disconnect"
#STA_NAME=`cat /etc/config/wireless | grep ApCliSsid | awk '{print $3}' | sed $'s/\'//g'`
TEST_NAME=`uci get wireless.@wifi-iface[0].ifname`
if [ "$TEST_NAME" == "ra0" ];then
STA_NAME=`uci get wireless.@wifi-iface[1].ApCliSsid`
else
STA_NAME=`uci get wireless.@wifi-iface[0].ApCliSsid`
fi
#echo "qqqdisconnect $STA_NAME"
#判断是否配置ap
if [ "$STA_NAME" == "" ];then
exit 0
fi
#STA_NAME=`cat /etc/config/wireless | grep ApCliSsid | awk '{print $3}' | sed $'s/\'//g'`
scanwifi $STA_NAME
fi
#根据通道判断signal值,低于此值进行切换
echo "baifen $IN_VAL"
if [ $IN_VAL ];then
#STA_NAME=`cat /etc/config/wireless | grep ApCliSsid | awk '{print $3}' | sed $'s/\'//g'`
TEST_NAME=`uci get wireless.@wifi-iface[0].ifname`
if [ "$TEST_NAME" == "ra0" ];then
STA_NAME=`uci get wireless.@wifi-iface[1].ApCliSsid`
else
STA_NAME=`uci get wireless.@wifi-iface[0].ApCliSsid`
fi
comp_val $STA_NAME
fi
#首次配置无法获取信息,采用这种方式读取信息 iwconfig apclii0
if [ "$IP_ADD" == "" ];then
#wifi down
#wifi up
wifi reload
fi
#exit 0
sleep $STOP
done