Занятость каналов WiFi
Что делать перед днём программиста как не программировать? Я настраивал точку доступа дома и пытался выбрать более свободный канал. Быстро найти подходящую утилиту под 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"
С днем рождения, Программист! Успехов тебе и радости от их достижения!
Комментарий для stacmv.ya.ru:
Спасибо! :)
Надо написать отдельный пост, что у меня сегодня день рождения :)
Поздравляю со всем сразу :)
Комментарий для Олег Горбунов:
Спасибо! Сейчас будет пост про ДР :)
Комментарий для Евгения Степанищева:
Привет! с днем рождения )
а какую программу под вин7 ты использовал для анализа лучшего канала для домашней сети? у меня дома в районе 15.00 появляется под 20 сетей и иногда (редко, но все же) мой асус вл500гп2 сходит с ума и зависает из-за этого. хочу поэкспериментировать с каналами.
Комментарий для Евгения Степанищева:
С новым годом!
Комментарий для nikolay:
http://bolknote.ru/all/3143/
Спасибо всем!
Женя, с днем рождения!
У меня с 5 по 8 каналы вообще пробелы, то есть нет столбца — это что значит?
С днем рождения!
http://www.pimley.net/projects/#airlock
оно?
Комментарий для v-i-y.livejournal.com:
Не заняты эти каналы никем. Или глючит что-нибудь :))
Спасибо!
Комментарий для http://banzalik.ru:
Спасибо!
Не, надо как у меня на скриншоте.
Себе на заметку. Цикл for в bash бывает ещё такой формы: for (( c=1; c<=5; c++ ))
Комментарий для Евгения Степанищева:
Охуительно. На гитхаб не выложите?
с прошедшим :)
Комментарий для dbergstein.blogspot.com:
Да тут код-то небольшой. Стоит думаете?
Комментарий для andr.mp:
Спасибо! :)
Комментарий для dbergstein.blogspot.com:
https://github.com/bolknote/shellgames
Комментарий для Евгения Степанищева:
Конечно стоит — у меня есть к примеру папка ShellMagic, в которой мой личный репо, и некоторые другие. Такую связку репозитариев удобнее таскать между компами, ну и обновления.
Комментарий для dbergstein.blogspot.com:
Я выложил, чуть выше вашего коментария — ссылка.
Комментарий для Евгения Степанищева:
Заватчил )