Занятость каналов WiFi

Утилита, чтобы посмотреть занятость каналов (11.09КиБ)

Что делать перед днём программиста как не программировать? Я настраивал точку доступа дома и пытался выбрать более свободный канал. Быстро найти подходящую утилиту под Mac OS X я не смог, поэтому начал её писать на bash. До конца не дописал (хотел ещё обозначить сколько устройств на одном канале висит), то что есть выкладываю — не пропадать же добру! 

#!/bin/bash
declare -a dots

TEMP=$(mktemp -t `basename "$0"`)
trap "/bin/rm -f $TEMP" EXIT

if [ -z $1 ]; then
    /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s > $TEMP
else
    /bin/cp "$1" $TEMP
fi

# Если название точки содержит пробел, у нас всё поедет, надо избавиться от названия
# для этого мы меряем с каким отступом идёт первая строка (6 — это длина слова SSID, плюс пробелы)
cutname=`awk 'NR==1 {l=length; gsub(/^ +/, ""); print l-length+6}' $TEMP`

# Название будет отрезано командой cut
while read line; do
    line=($line)

    chs=(${line[2]//,+/ })

    # Берём только каналы 2,4ГГц
    if [ ${chs[0]} -gt 13 ]; then
        continue
    fi

    # Округляем уровень сигнала
    let lvl="(100 + ${line[1]} + 9) / 10"
    # Уровень прозрачности верхней линии
    let alpha="$lvl*10 - (100 + ${line[1]})"

    # Номера каналов
    let start="${chs[0]}-2+1"
    let end="${chs[0]}+2+${chs[1]:-0}*5+1"

    # Набор точек для рисования прямоугольника wifi-точки
    for x in $(seq $start $end); do

        # Прямоугольник закрашивается сплошным…
        for y in $(seq 0 $(($lvl - 1)) ); do 
            dots[$x+$y*100]=10
        done

        # Кроме верхней границы, она закрашивается значением
        # наибольшей насыщенности
        let xy="$x+($y+1)*100"

        if  [[ -z ${dots[$xy]} || ${dots[$xy]} -lt $alpha ]]; then
            dots[$xy]=$alpha
        fi
    done
# отрезаем заголовок, отрезаем название точки, сортируем по уровню сигнала
done < <(tail -n +2 $TEMP | cut -b${cutname}- | sort -rgk2)

# Блоки по насыщенности границы
blocks=(_ ░ ░ ░ ▒ ▒ ▒ ▒ ▒ ▒ █)

# Цвета вертикальной оси
colors=(32 32 32 32 32 33 33 31 31 31 31)

# Счётчик вертикальной оси
lvl=0

declare -i alpha

# Отрисовка шкалы и данных точек
for y in {10..0}; do
    printf "\033[${colors[-$lvl/10]}m% 4d " $lvl
    let lvl="$lvl - 10"

    for x in {0..15}; do
        alpha=${dots[$x+100*$y]}

        if [ $alpha -le 0 ]; then
            echo -n '   '
        else
            b=${blocks[$alpha]}

            echo -ne "\033[37m$b$b$b"
        fi
    done

    echo
done

# Горизонтальная ось
echo -e "\033[30m     -- -- 01 02 03 04 05 06 07 08 09 10 11 12 13"

echo -e "\033[0m"
Поделиться
Отправить
21 комментарий
Stac (stacmv.ya.ru)

С днем рождения, Программист! Успехов тебе и радости от их достижения!

Евгений Степанищев (bolknote.ru)

Комментарий для stacmv.ya.ru:

Спасибо! :)

Надо написать отдельный пост, что у меня сегодня день рождения :)

Олег Горбунов

Поздравляю со всем сразу :)

Евгений Степанищев (bolknote.ru)

Комментарий для Олег Горбунов:

Спасибо! Сейчас будет пост про ДР :)

nikolay

Комментарий для Евгения Степанищева:

Привет! с днем рождения )

а какую программу под вин7 ты использовал для анализа лучшего канала для домашней сети? у меня дома в районе 15.00 появляется под 20 сетей и иногда (редко, но все же) мой асус вл500гп2 сходит с ума и зависает из-за этого. хочу поэкспериментировать с каналами.

Kildor (kildor.ya.ru)

Комментарий для Евгения Степанищева:

С новым годом!

Евгений Степанищев (bolknote.ru)

Комментарий для nikolay:

а какую программу под вин7 ты использовал для анализа лучшего канала для домашней сети?

http://bolknote.ru/all/3143/

Евгений Степанищев (bolknote.ru)

Спасибо всем!

viy (v-i-y.livejournal.com)

Женя, с днем рождения!
У меня с 5 по 8 каналы вообще пробелы, то есть нет столбца — это что значит?

http://banzalik.ru

С днем рождения!

http://www.pimley.net/projects/#airlock
оно?

Евгений Степанищев (bolknote.ru)

Комментарий для v-i-y.livejournal.com:

Не заняты эти каналы никем. Или глючит что-нибудь :))

Женя, с днем рождения!

Спасибо!

Евгений Степанищев (bolknote.ru)

Комментарий для http://banzalik.ru:

С днем рождения!

Спасибо!

http://www.pimley.net/projects/#airlock
оно?

Не, надо как у меня на скриншоте.

Евгений Степанищев (bolknote.ru)

Себе на заметку. Цикл for в bash бывает ещё такой формы: for (( c=1; c<=5; c++ ))

Дмитрий Бергштейн (dbergstein.blogspot.com)

Комментарий для Евгения Степанищева:

Охуительно. На гитхаб не выложите?

andr (andr.mp)

с прошедшим :)

Евгений Степанищев (bolknote.ru)

Комментарий для dbergstein.blogspot.com:

Охуительно. На гитхаб не выложите?

Да тут код-то небольшой. Стоит думаете?

Евгений Степанищев (bolknote.ru)

Комментарий для andr.mp:

с прошедшим :)

Спасибо! :)

Евгений Степанищев (bolknote.ru)

Комментарий для dbergstein.blogspot.com:

https://github.com/bolknote/shellgames

Дмитрий Бергштейн (dbergstein.blogspot.com)

Комментарий для Евгения Степанищева:

Конечно стоит — у меня есть к примеру папка ShellMagic, в которой мой личный репо, и некоторые другие. Такую связку репозитариев удобнее таскать между компами, ну и обновления.

Евгений Степанищев (bolknote.ru)

Комментарий для dbergstein.blogspot.com:

Я выложил, чуть выше вашего коментария — ссылка.

Дмитрий Бергштейн (dbergstein.blogspot.com)

Комментарий для Евгения Степанищева:

Заватчил )

Популярное