PoweredLocal / openwrt-auto-channel-select

Automatic Wi-Fi channel selection script for OpenWRT and supported systems
MIT License
10 stars 17 forks source link

AVG_$CHANNEL=$(( ($CURRENT_AVG + $CURRENT_VALUE + 1) / 2 )) --> that is not an average #5

Open 0xCAFEDECAF opened 1 year ago

0xCAFEDECAF commented 1 year ago

https://github.com/PoweredLocal/openwrt-auto-channel-select/blame/675477958f5c34370969903c8b4bf3bfeaaf5ecf/setAutoChannel.sh#L63

That is not an average

0xCAFEDECAF commented 1 year ago

Here is my version of this script:

#!/bin/ash

# Basic Wi-Fi auto channel selector by PoweredLocal
# (c) 2017 PoweredLocal, Melbourne, Australia
# https://www.poweredlocal.com
#
# Denis Mysenko 20/07/2017

# Config
TEST_INTERVAL=5
ITERATIONS=3
DEBUG=1

# No need to touch anything below, in most cases
if [[ -z $1 ]]; then
  echo "# Basic Wi-Fi auto channel selector by PoweredLocal"
  echo $0 [interface index]
  exit 1
fi

INTERFACE_INDEX=$1
SIGNAL=NO

scan() {
 /usr/sbin/iw wlan${INTERFACE_INDEX} scan | grep -E "primary channel|signal" | {
  while read line
  do
    FIRST=`echo "$line" | awk '{ print $1 }'`
    if [[ "$FIRST" == "signal:" ]]; then
      SIGNAL=`echo $line | awk '{ print ($2 < -60) ? "NO" : $2 }'`
    fi

    if [[ "$FIRST" == "*" && "$SIGNAL" != "NO" ]]; then
      CHANNEL=`echo "$line" | awk '{ print $4 }'`
      eval "CURRENT_VALUE=CHANNEL_$CHANNEL"
      eval "CURRENT_VALUE=$CURRENT_VALUE"
      SUM=$(( $CURRENT_VALUE + 1 ))
      eval "CHANNEL_${CHANNEL}=$SUM"
    fi
  done

  echo $CHANNEL_1 $CHANNEL_6 $CHANNEL_11
 }
}

for ITERATION in $(seq 1 1 $ITERATIONS)
do
  [[ -n "$DEBUG" ]] && echo Iteration $ITERATION
  RESULT=$(scan)
  eval "RESULT_${ITERATION}_1=`echo $RESULT | awk '{ print $1 }'`"
  eval "RESULT_${ITERATION}_6=`echo $RESULT | awk '{ print $2 }'`"
  eval "RESULT_${ITERATION}_11=`echo $RESULT | awk '{ print $3 }'`"
  [[ $ITERATION -lt $ITERATIONS ]] && sleep $TEST_INTERVAL
done

for ITERATION in $(seq 1 1 $ITERATIONS)
do
  for CHANNEL in 1 6 11
  do
    eval "CURRENT_VALUE=RESULT_${ITERATION}_${CHANNEL}"
    eval "SUM_$CHANNEL=$(( $SUM_$CHANNEL + $CURRENT_VALUE ))"

    if [[ $ITERATION -eq $ITERATIONS && -n "$DEBUG" ]]
    then
        eval "SUM=$(( SUM_${CHANNEL} ))"
        echo Channel $CHANNEL : seen $SUM / $ITERATIONS networks
    fi
  done
done

if [[ $SUM_1 -le $SUM_6 && $SUM_1 -le $SUM_11 ]]; then
  CHANNEL=1
elif [[ $SUM_6 -le $SUM_1 && $SUM_6 -le $SUM_11 ]]; then
  CHANNEL=6
elif [[ $SUM_11 -le $SUM_1 && $SUM_11 -le $SUM_6 ]]; then
  CHANNEL=11
fi

if [[ -n "$CHANNEL" ]]; then
  /sbin/uci set wireless.radio${INTERFACE_INDEX}.channel="$CHANNEL"
  /sbin/uci changes | grep -q ^wireless
  if [ $? -ne 0 ]
  then
    echo Keeping Wi-Fi channel \'$CHANNEL\'
  else
    echo Changing Wi-Fi to channel \'$CHANNEL\'
    /sbin/uci commit
    /sbin/wifi
  fi
fi