Как стать автором
Обновить

«Билайн Интернет Дома» в Ubuntu: USSD запросы и не только

Давным давно, в одной далекой далекой галактике...


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

Поехали


Не буду рассказывать как кодить на баше.
Для начала установим необходимые пакеты:
sudo apt-get install zenity libnotify-bin
Скрипт использует iconv. У меня он стоял сам. Если у вас его нету, то установите его:
sudo apt-get install libc-bin
Проверить баланс:
image
Можно еще смотреть авторепорты с модема:
image
… и выполнять AT команды:
image
GUI меню:
image
Copy Source | Copy HTML
  1. #!/bin/bash
  2. function decodeUCS2 () # декодирует UCS
  3. {
  4. bytes=$(echo -n $1 | sed "s/\(.\{2\}\)/\\\x\1/g")
  5. REPLY=$(printf $bytes | iconv -f UCS-2BE -t UTF-8)
  6. }
  7. function encodePDU () # кодирует в PDU
  8. {
  9. in=$1
  10. let "in_len=${#in}-1"
  11. for chr in $(seq  0 $in_len)
  12. do
  13. let "chr2=$chr+1"
  14. let "t=$chr%8+1"
  15. if [ "$t" -ne 8 ]; then
  16. byte=$(printf "%d" "'${in:$chr:1}")
  17. let "c=$byte>>($chr%8)"
  18. let "c2=(1<<$t)-1"
  19. byte2=$(printf "%d" "'${in:$chr2:1}")
  20. let "b=$byte2 & $c2"
  21. let "c=$b<<(8-$t) | $c"
  22. REPLY=$REPLY$(echo "obase=16; $c" | bc | sed "s/^\(.\{,1\}\)$/0\1/")
  23. fi
  24. done
  25. }
  26. function USSD () # выполняет USSD запрос
  27. {
  28. $(printf "AT+CUSD=1,$1,15\r\n" > /dev/ttyUSB$ttyID)
  29. REPLY=$(grep -m 1 "+CUSD" /dev/ttyUSB$ttyID | sed "s/.*\"\([A-F0-9]*\)\".*/\1/")
  30. decodeUCS2 $REPLY
  31. }
  32. function data_traffic () # преобразователь инфы авторепортов модема
  33. {
  34. i= 0
  35. REPLY=$1
  36. REPLY2=$1
  37. data_text=( "байт" "Кбайт" "Мбайт" "Гбайт" "Тбайт" ) #ИМХО больше никто не скачает
  38. while [ $REPLY2 -gt 1024 ]
  39. do
  40. REPLY=$(echo "scale = 2 ; $REPLY/1024" | bc)
  41. REPLY2=$(echo "$REPLY2/1024" | bc)
  42. let "i=i+1"
  43. done
  44. REPLY="$REPLY ${data_text[$i]}"
  45. }
  46. if ls /dev/ttyUSB* > /dev/null; then
  47. ttyID=$(ls /dev/ttyUSB* | xargs file -s | grep "ASCII text, with CRLF line terminators" | sed "s/.*ttyUSB\([0-9]\).*/\1/") # модем
  48. if [ -z "$*" ]; then
  49. op=$(zenity --list --text="Выберите операцию:" --column="" --column="" --height="280" --width="280" --title="Билайн Интернет Дома" --print-column=1 --hide-column=1 "balance" "Проверить баланс" "start" "Активация стартового баланса" "req" "Выполнить USSD запрос" "at" "Выполнить AT комманду" "info" "Информация о соединении")
  50. elif [ $# -gt 1 ]; then
  51. op=$(echo -n $* |sed "s/\(.*\) .*/\1/")
  52. op2=$(echo -n $* |sed "s/.* \(.*\)/\1/")
  53. else
  54. op=$*
  55. fi
  56. case $op in
  57. balance)
  58. USSD "AA184C3602"
  59. MSG=$(echo -n $REPLY | sed "s/\.Дета.*//")
  60. ;;
  61. start)
  62. USSD "AA182CA68AC562B111"
  63. MSG=$REPLY
  64. ;;
  65. req)
  66. if [ -z "$op2" ]; then
  67. number=$(zenity --entry --text="Введите номер" --title="Билайн Интернет Дома" --width=270)
  68. else
  69. number=$op2
  70. fi
  71. encodePDU $number
  72. USSD $REPLY
  73. MSG=$REPLY
  74. ;;
  75. at)
  76. if [ -z "$op2" ]; then
  77. cmd=$(zenity --entry --text="Введите AT комманду" --title="Билайн Интернет Дома" --width=270)
  78. else
  79. cmd=$op2
  80. fi
  81. cmd=$(echo -n $cmd | tr a-z A-Z)
  82. cmd2=$(echo -n $cmd | sed "s/^AT//; s/\(.[A-Za-z0-9]*\).*/\1/")
  83. $(printf "$cmd\r\n" > /dev/ttyUSB$ttyID)
  84. MSG=$(grep -m 1 "$cmd2" /dev/ttyUSB$ttyID)
  85. ;;
  86. info)
  87. DSFLOWRPT=$(grep -m 1 "SFLOWRPT" /dev/ttyUSB$ttyID | sed "s/.*://g")
  88. for i in `seq 1 5`
  89. do
  90. info_[$i]=$(echo -n "$DSFLOWRPT" | cut -f$i -d, | sed "s/./ibase=16; /" | bc)
  91. done
  92. let "time=${info_[1]}/60"
  93. let "speed_trans=${info_[2]}/1024"
  94. let "speed_rec=${info_[3]}/1024"
  95. data_traffic "${info_[4]}" ; trans_data=$REPLY
  96. data_traffic "${info_[5]}" ; rec_data=$REPLY
  97. MSG="Время соединения: $time мин.<br/>Передача данных: $speed_trans Кбит/c<br/>Получение данных: $speed_rec Кбит/с<br/>Передано данных: $trans_data<br/>Получено данных: $rec_data"
  98. ;;
  99. *)
  100. MSG="Неверная операция"
  101. esac
  102. else
  103. MSG="Модем не подключен"
  104. fi
  105. if [ -n "$MSG" ]; then
  106. $(notify-send "Билайн Интернет Дома" "$MSG")
  107. fi
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.