Давным давно, в одной далекой далекой галактике...
Думаю не нужно говорить о том, что операторы «большой тройки» редко делают в своих продуктах совместимость с Linux. Получилось так, что я стал обладателем комплекта «Билайн Интернет Дома» с модемом Huawei E160G. Интересен тот факт, что в офисах продаж все говорят что Linux полностью поддерживается. Но на практике все бывает иначе. С подключением к интернету особых проблем у меня не возникло. А вот встроенных средств для проверки баланса и т.д. я не нашел. Немного погуглив нашел решение на PHP. Ну ладно у меня PHP есть, но не ставить же теперь PHP на домашние компы. Вот я и подумал что не плохо было бы сделать что-либо подобное на BASH'e.
Поехали
Не буду рассказывать как кодить на баше.
Для начала установим необходимые пакеты:
sudo apt-get install zenity libnotify-bin
Скрипт использует iconv. У меня он стоял сам. Если у вас его нету, то установите его:
sudo apt-get install libc-bin
Проверить баланс:

Можно еще смотреть авторепорты с модема:

… и выполнять AT команды:

GUI меню:

Copy Source | Copy HTML
- #!/bin/bash
- function decodeUCS2 () # декодирует UCS
- {
- bytes=$(echo -n $1 | sed "s/\(.\{2\}\)/\\\x\1/g")
- REPLY=$(printf $bytes | iconv -f UCS-2BE -t UTF-8)
- }
- function encodePDU () # кодирует в PDU
- {
- in=$1
- let "in_len=${#in}-1"
- for chr in $(seq 0 $in_len)
- do
- let "chr2=$chr+1"
- let "t=$chr%8+1"
- if [ "$t" -ne 8 ]; then
- byte=$(printf "%d" "'${in:$chr:1}")
- let "c=$byte>>($chr%8)"
- let "c2=(1<<$t)-1"
- byte2=$(printf "%d" "'${in:$chr2:1}")
- let "b=$byte2 & $c2"
- let "c=$b<<(8-$t) | $c"
- REPLY=$REPLY$(echo "obase=16; $c" | bc | sed "s/^\(.\{,1\}\)$/0\1/")
- fi
- done
- }
- function USSD () # выполняет USSD запрос
- {
- $(printf "AT+CUSD=1,$1,15\r\n" > /dev/ttyUSB$ttyID)
- REPLY=$(grep -m 1 "+CUSD" /dev/ttyUSB$ttyID | sed "s/.*\"\([A-F0-9]*\)\".*/\1/")
- decodeUCS2 $REPLY
- }
- function data_traffic () # преобразователь инфы авторепортов модема
- {
- i= 0
- REPLY=$1
- REPLY2=$1
- data_text=( "байт" "Кбайт" "Мбайт" "Гбайт" "Тбайт" ) #ИМХО больше никто не скачает
- while [ $REPLY2 -gt 1024 ]
- do
- REPLY=$(echo "scale = 2 ; $REPLY/1024" | bc)
- REPLY2=$(echo "$REPLY2/1024" | bc)
- let "i=i+1"
- done
- REPLY="$REPLY ${data_text[$i]}"
- }
- if ls /dev/ttyUSB* > /dev/null; then
- ttyID=$(ls /dev/ttyUSB* | xargs file -s | grep "ASCII text, with CRLF line terminators" | sed "s/.*ttyUSB\([0-9]\).*/\1/") # модем
- if [ -z "$*" ]; then
- op=$(zenity --list --text="Выберите операцию:" --column="" --column="" --height="280" --width="280" --title="Билайн Интернет Дома" --print-column=1 --hide-column=1 "balance" "Проверить баланс" "start" "Активация стартового баланса" "req" "Выполнить USSD запрос" "at" "Выполнить AT комманду" "info" "Информация о соединении")
- elif [ $# -gt 1 ]; then
- op=$(echo -n $* |sed "s/\(.*\) .*/\1/")
- op2=$(echo -n $* |sed "s/.* \(.*\)/\1/")
- else
- op=$*
- fi
- case $op in
- balance)
- USSD "AA184C3602"
- MSG=$(echo -n $REPLY | sed "s/\.Дета.*//")
- ;;
- start)
- USSD "AA182CA68AC562B111"
- MSG=$REPLY
- ;;
- req)
- if [ -z "$op2" ]; then
- number=$(zenity --entry --text="Введите номер" --title="Билайн Интернет Дома" --width=270)
- else
- number=$op2
- fi
- encodePDU $number
- USSD $REPLY
- MSG=$REPLY
- ;;
- at)
- if [ -z "$op2" ]; then
- cmd=$(zenity --entry --text="Введите AT комманду" --title="Билайн Интернет Дома" --width=270)
- else
- cmd=$op2
- fi
- cmd=$(echo -n $cmd | tr a-z A-Z)
- cmd2=$(echo -n $cmd | sed "s/^AT//; s/\(.[A-Za-z0-9]*\).*/\1/")
- $(printf "$cmd\r\n" > /dev/ttyUSB$ttyID)
- MSG=$(grep -m 1 "$cmd2" /dev/ttyUSB$ttyID)
- ;;
- info)
- DSFLOWRPT=$(grep -m 1 "SFLOWRPT" /dev/ttyUSB$ttyID | sed "s/.*://g")
- for i in `seq 1 5`
- do
- info_[$i]=$(echo -n "$DSFLOWRPT" | cut -f$i -d, | sed "s/./ibase=16; /" | bc)
- done
- let "time=${info_[1]}/60"
- let "speed_trans=${info_[2]}/1024"
- let "speed_rec=${info_[3]}/1024"
- data_traffic "${info_[4]}" ; trans_data=$REPLY
- data_traffic "${info_[5]}" ; rec_data=$REPLY
- MSG="Время соединения: $time мин.<br/>Передача данных: $speed_trans Кбит/c<br/>Получение данных: $speed_rec Кбит/с<br/>Передано данных: $trans_data<br/>Получено данных: $rec_data"
- ;;
- *)
- MSG="Неверная операция"
- esac
- else
- MSG="Модем не подключен"
- fi
- if [ -n "$MSG" ]; then
- $(notify-send "Билайн Интернет Дома" "$MSG")
- fi