openwrt脚本实现客户端无缝链接wifi

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenWrt 是一个基于 Linux 的嵌入式操作系统,它提供了一个灵活的平台,可以在各种路由器和嵌入式设备上运行。您可以使用启动脚本来配置和定制 OpenWrt 的启动过程。 OpenWrt 使用的启动脚本是 `/etc/init.d` 目录下的脚本文件。这些脚本文件使用了类似于传统的 SysVinit 启动脚本的语法。 要创建一个启动脚本,请按照以下步骤操作: 1. 在 `/etc/init.d` 目录下创建一个新的脚本文件,例如 `myscript`。 ``` root@OpenWrt:~# cd /etc/init.d root@OpenWrt:/etc/init.d# touch myscript ``` 2. 编辑这个脚本文件并添加所需的配置和命令。您可以使用任何文本编辑器来编辑脚本文件。 ``` root@OpenWrt:/etc/init.d# vi myscript ``` 在脚本文件中,您可以编写启动、停止和重启服务、加载模块、设置环境变量等操作。 3. 添加可执行权限到脚本文件。 ``` root@OpenWrt:/etc/init.d# chmod +x myscript ``` 4. 在 `/etc/rc.d` 目录下创建一个符号链接,将脚本文件链接到适当的运行级别。 ``` root@OpenWrt:/etc/init.d# cd /etc/rc.d root@OpenWrt:/etc/rc.d# ln -s ../init.d/myscript S99myscript ``` 这将在启动时执行脚本文件。 5. 最后,您可以使用以下命令来启动、停止或重启脚本。 ``` root@OpenWrt:~# /etc/init.d/myscript start root@OpenWrt:~# /etc/init.d/myscript stop root@OpenWrt:~# /etc/init.d/myscript restart ``` 请注意,这只是一个简单的示例,您可以根据自己的需求编写更复杂的启动脚本。另外,建议您在编辑和测试脚本之前先备份相关文件,以免出现意外情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值