Сайт | Скачать | Видео | Wiki

Автор Тема: Скрипт для проверки и пополнения счета для модема Huawei E1550  (Прочитано 44576 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн rodin.s

  • Почетный участник
  • Ветеран
  • *
  • Сообщений: 1179
  • Репутация: +96/-0
  • Автор темы
Написал скрипт для проверки счета оператора  Utel. Идею взял отсюда: http://wiki.ru.unix-like.info/3G%2C_EDGE%2CGPRS_%D0%9E%D0%B1%D0%BE_%D0%B2%D1%81%D0%B5%D0%BC_%D0%B2_%D0%BA%D1%80%D0%B0%D1%82%D1%86%D0%B5

Скрипт, который там был у меня не заработал и я его переделал. У меня нет большого опыта в написании скриптов. Я только учусь. Может быть, его можно усовершенствовать. Для работы нужны minicom и perl.

Код
#!/bin/sh
SCR=/tmp/m_script
SCR1=/tmp/ussdscp
OST=/tmp/lastcheck
tmp_file=/tmp/code_utel
: >  $tmp_file
#gnokii --getnetworkinfo # пишет информацию о сети при наличии пакета gnokii разкомментировать

if [  -n "$1" ] # проверка наличия параметра коммандной строки
then
echo -n "$1" > $OST
# кодирование запроса
PARCEL=$(perl -e '@a=split(//,unpack("b*",`cat /tmp/lastcheck`)); for ($i=7; $i < $#a; $i+=8) { $a[$i]="" } print uc(unpack("H*", pack("b*", join("", @a))))."\n"')
echo "send \"AT+CUSD=1,$PARCEL,15\"" > $SCR
else
#echo 'send "ATZ"' > $SCR
#echo 'send ""' >> $SCR
echo 'send "AT+CUSD=1,AA180C3602,15"' > $SCR # если параметр не задан - проверяется счет
fi

cat /dev/ttyUSB2  | grep "+CUSD:"  > $tmp_file &
minicom  -S $SCR >/dev/null 2>&1 &
sleep 10
! killall -9 cat
! killall  minicom

#exit 0

while read line
do
#echo $line
line1=${line%\"*}
#echo $line1
line2=${line1##*\"}

done < $tmp_file

echo $line2 > $SCR1
#cat /tmp/ussdscp
# декодирование полученного ответа
perl -e '@a=split(//,unpack("b*", pack("H*",`cat /tmp/ussdscp`))); for ($i=6; $i < $#a; $i+=7) {$a[$i].="0" } print pack("b*", join("",
@a))."
"'

exit 0


Minicom нужно настроить на порт /dev/ttyUSB0 (для Puppy 431). Скрипт нужно поместить в /root/my-applications/bin.  Использование:
Код
balans *121#
. Если не задать параметр, проверяет счет Utel (*100#). По идее так можно пополнять счет.  Для проверки счета модем должен быть отключен от интернета.

Доработал скрипт. Теперь не нужен minicom, используется, интегрированная в puppy команда "modem-stats -c at-команда устройство". Также скрипт переключает сети 2g/3g. Использование:
Код
balans 2g
- включение в 2G режим
Код
balans 3g
- включение в 3G режим
Код
balans p3g
- предпочитать 3G, но включено два диапазона

Код
#!/bin/sh
SCR=/tmp/m_script
SCR1=/tmp/ussdscp
OST=/tmp/lastcheck
tmp_file=/tmp/code_utel
: >  $tmp_file

#gnokii --getnetworkinfo  | grep Network | grep -v code # пишет информацию о сети при наличии пакета gnokii
modem-stats -c "AT+COPS?" /dev/ttyUSB0

if [ "$1" = "3g" ]
then modem-stats -c "AT^SYSCFG=14,2,3FFFFFFF,2,4" /dev/ttyUSB0
sleep 20
modem-stats -c "AT+COPS?" /dev/ttyUSB0
#gnokii --getnetworkinfo | grep Network | grep -v code
exit 0
fi

if [ "$1" = "p3g" ]
then modem-stats -c "AT^SYSCFG=2,2,3FFFFFFF,2,4" /dev/ttyUSB0
sleep 20
modem-stats -c "AT+COPS?" /dev/ttyUSB0
#gnokii --getnetworkinfo | grep Network | grep -v code
exit 0
fi

if [ "$1" = "2g" ]
then modem-stats -c "AT^SYSCFG=13,1,3FFFFFFF,2,4" /dev/ttyUSB0
sleep 20
#gnokii --getnetworkinfo | grep Network | grep -v code
modem-stats -c "AT+COPS?" /dev/ttyUSB0
exit 0
fi

if [  -n "$1" ] # проверка наличия параметра коммандной строки
then
echo -n "$1" > $OST
# кодирование запроса
PARCEL=$(perl -e '@a=split(//,unpack("b*",`cat /tmp/lastcheck`)); for ($i=7; $i < $#a; $i+=8) { $a[$i]="" } print uc(unpack("H*", pack("b*", join("", @a))))."\n"')
#echo "send \"AT+CUSD=1,$PARCEL,15\"" > $SCR
at="AT+CUSD=1,$PARCEL,15"
else
#echo 'send "ATZ"' > $SCR
#echo 'send ""' >> $SCR
#echo 'send "AT+CUSD=1,AA180C3602,15"' > $SCR # если параметр не задан - проверяется счет
at="AT+CUSD=1,AA180C3602,15"
fi
#echo $at
cat /dev/ttyUSB2  | grep "+CUSD:"  > $tmp_file &
#minicom  -S $SCR >/dev/null 2>&1 &
modem-stats -c "$at" /dev/ttyUSB0 >/dev/null 2>&1
sleep 10
! killall -9 cat
#! killall  minicom

#exit 0

while read line
do
#echo $line
line1=${line%\"*}
#echo $line1
line2=${line1##*\"}

done < $tmp_file

echo $line2 > $SCR1
#cat /tmp/ussdscp
# декодирование полученного ответа
perl -e '@a=split(//,unpack("b*", pack("H*",`cat /tmp/ussdscp`))); for ($i=6; $i < $#a; $i+=7) {$a[$i].="0" } print pack("b*", join("",
@a))."
"'

exit 0
« Последнее редактирование: 21 Август 2010, 23:20:00 от rodin.s »

Оффлайн rodin.s

  • Почетный участник
  • Ветеран
  • *
  • Сообщений: 1179
  • Репутация: +96/-0
  • Автор темы
Добавил в скрипт проверку на подключение к интернету (при подключении счет не проверяется), также скрипт проверяет наличие модема и регистрацию в сети. Для последнего нужен пакет gnokii, настроенный в конфигурационном  файле на модем /dev/ttyUSB0. Также можно проверять СМС, также используется gnokii. Для проверки смс нужно ввести:
Код
balans sms
.
Код
balans sms 10
покажет первые 10 сообщений.

Оффлайн rodin.s

  • Почетный участник
  • Ветеран
  • *
  • Сообщений: 1179
  • Репутация: +96/-0
  • Автор темы
Рад представить небольшую утилиту полезную пользователям мобильного интернета.
Эта штука не проверяет счет на E1550. У меня не получилось.

Оффлайн rodin.s

  • Почетный участник
  • Ветеран
  • *
  • Сообщений: 1179
  • Репутация: +96/-0
  • Автор темы
Доработал и внес несколько изменений в свой скрипт. Разделил его на два и избавил от необходимости использовать gnokii.
balans_univ -  скрипт для проверки и пополнения баланса не привязанный к какому-либо оператору. USSD-запрос вводится, как аргумент коммандной строки. Введены проверки на отсутсвие модема, подключение к интернету, отсутсвие сети,  отсутсвие пакета perl в системе. (Я устанавливал perl-tiny из менеджера пакетов)

signal - скрипт для настройки модема, при слабом сигнале, для поиска места наиболее сильного уровня сигнала.

band - скрипт в основном для переключения диапазонов 2G/3G, также в него включил скрипт signal для проверки результата переключения, также можно посмотреть доступные сети. 

Оффлайн Lexeii

  • Почетный участник
  • Постоялец
  • *
  • Сообщений: 147
  • Репутация: +24/-0
    • блог Lexeii
У нас кодеров прибавилось! Ура! Они ж на вес золота :)

3G у меня нету, но сегодня попробую эти скрипты на своем обычном 2.5G-телефоне.
Я только на днях думал, что gnokii это немножко «толсто», а вот сегодня уже есть готовое решение. Сам с полгода назад начинал и забросил скрипт для телефонов, понимающих AT-команды. Хотел сделать всё чисто в shell, тем более Perl я и ни знаю ни разу.

Dim-Kut выложил неплохую утилитку — catty, позволяет обмениваться с телефоном файлами. В общем случае — послать произвольный запрос из AT-команд и получить произвольный ответ (например, список заданий календаря или картинку из папки «Изображения»). В идеале мог бы получиться легкий и портабельный скрипт.

Рад за тебя, rodin.s, что у тебя уже есть результаты. Так держать!
Linux is user friendly... It's just picky about who it  becomes friends with.

Оффлайн rodin.s

  • Почетный участник
  • Ветеран
  • *
  • Сообщений: 1179
  • Репутация: +96/-0
  • Автор темы
Это скрипты для E1550, насчет других телефонов - не уверен, что сработает. Для других телефонов, возможно, и perl не нужен.

Оффлайн DdShurick

  • Это Риччи
  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 8636
  • Репутация: +187/-2
  • Старый чайник
 Для LupuRus (и PuppyRus2 тоже) Huawei E1550 определяется device=/dev/ttyUSB_utps_pcui , device2=/dev/ttyUSB_utps_modem
Код
# modem-stats -c "AT+CSQ" /dev/ttyUSB_utps_pcui

+CSQ: 19,99

OK
# modem-stats -c "AT+COPS?" /dev/ttyUSB_utps_pcui

+COPS: 0,0,"MegaFon RUS",2

OK
# ./signal
19,99
"MegaFon RUS"
20,99
"MegaFon RUS"
19,99
"MegaFon RUS"
20,99
/dev/ttyUSB0 соответствует /dev/ttyUSB_upts_pcui
/dev/ttyUSB2 соответствует /dev/ttyUSB_upts_modem
« Последнее редактирование: 23 Август 2010, 17:38:25 от DdShurick »
Моноблок Lenovo IdeaCentre c200 (Intel Atom D525, Intel GMA 3150, 2 Gb RAM) Richy64
Nettop Acer Aspire Revo R3610 (Atom N330, nVidia GeForce 9400, 3 Gb RAM) Richy64

Оффлайн rodin.s

  • Почетный участник
  • Ветеран
  • *
  • Сообщений: 1179
  • Репутация: +96/-0
  • Автор темы
Так он определяется, если установлен mobile partner. Но он там не нужен. Без него все прекрасно работает. Без него это - /dev/ttyUSB0, /dev/ttyUSB2.

Хотя, идея, - сделать проверку на наличие mobile partner и в зависимости от этого - менять имена устройств.
« Последнее редактирование: 24 Август 2010, 16:15:52 от rodin.s »

Оффлайн DdShurick

  • Это Риччи
  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 8636
  • Репутация: +187/-2
  • Старый чайник
Так он определяется, если установлен mobile partner. Но он там не нужен. Без него все прекрасно работает.
С этим совершенно согласен.
Цитата
Без него это - /dev/ttyUSB0, /dev/ttyUSB2.
А вот с этим - нет. Не зря я написал про Lupu. Там есть правило /etc/udev/rules.d/10-Huawei-Datacard.rules, оно и задаёт такие имена (В Ubunty-10.04 тоже).
Цитата
Хотя, идея, - сделать проверку на наличие mobile partner и в зависимости от этого - менять имена устройств.
Можно так:
Код
device=`ls /dev | grep USB | grep -E "0|pcui"`
device2=`ls /dev | grep USB | grep -E "2|modem"`
Или в вашей манере:
Код
device=$(ls /dev | grep USB | grep -E "0|pcui")
device2=$(ls /dev | grep USB | grep -E "2|modem")
Если модем запрашивает PIN-код (а мой запрашивает)
Код
echo AT+CPIN=**** > $device # где **** это 4-х значный PIN-код  
Моноблок Lenovo IdeaCentre c200 (Intel Atom D525, Intel GMA 3150, 2 Gb RAM) Richy64
Nettop Acer Aspire Revo R3610 (Atom N330, nVidia GeForce 9400, 3 Gb RAM) Richy64

Оффлайн rodin.s

  • Почетный участник
  • Ветеран
  • *
  • Сообщений: 1179
  • Репутация: +96/-0
  • Автор темы
Не зря я написал про Lupu. Там есть правило /etc/udev/rules.d/10-Huawei-Datacard.rules, оно и задаёт такие имена (В Ubunty-10.04 тоже).
У меня и в Lupu определяется ttyUSB0, ttyUSB2, наверное, потому, что я отключил zero-CD и udev rules его теперь не воспринимают.

Добавил новые строки кода для универсальности определения устройств.
« Последнее редактирование: 24 Август 2010, 23:07:11 от rodin.s »

Оффлайн DdShurick

  • Это Риччи
  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 8636
  • Репутация: +187/-2
  • Старый чайник
 Для ввода PIN-кода
Код
#!/bin/sh

device=`ls /dev | grep USB | grep -E "0|pcui"`

# Проверка наличия модема
[ "$device" = "" ] && xmessage "Нужно вставить модем."
[ $? = 0 ] && exit 0

# Проверка PIN-кода
status=`modem-stats -c "AT+CPIN?" /dev/$device | grep "READY"`
if [ "$status" = "" ]; then
pin="`Xdialog --title "Pin-код" --password --inputbox "Введите PIN" 0 0 2>&1`"
if [ $? = 0 ]; then
echo "AT+CPIN=$pin" > /dev/$device
gnome-ppp 2>/dev/null
else
exit 0
fi
else
gnome-ppp 2>/dev/null
fi

Можно и другие пимпочки добавить.
Моноблок Lenovo IdeaCentre c200 (Intel Atom D525, Intel GMA 3150, 2 Gb RAM) Richy64
Nettop Acer Aspire Revo R3610 (Atom N330, nVidia GeForce 9400, 3 Gb RAM) Richy64

Оффлайн DdShurick

  • Это Риччи
  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 8636
  • Репутация: +187/-2
  • Старый чайник
 Баланс у меня почему-то показывать не хочет :(
Моноблок Lenovo IdeaCentre c200 (Intel Atom D525, Intel GMA 3150, 2 Gb RAM) Richy64
Nettop Acer Aspire Revo R3610 (Atom N330, nVidia GeForce 9400, 3 Gb RAM) Richy64

Оффлайн DdShurick

  • Это Риччи
  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 8636
  • Репутация: +187/-2
  • Старый чайник
 Вот такой вариант. Надо допиливать, ибо работает криво.
Моноблок Lenovo IdeaCentre c200 (Intel Atom D525, Intel GMA 3150, 2 Gb RAM) Richy64
Nettop Acer Aspire Revo R3610 (Atom N330, nVidia GeForce 9400, 3 Gb RAM) Richy64

Оффлайн rodin.s

  • Почетный участник
  • Ветеран
  • *
  • Сообщений: 1179
  • Репутация: +96/-0
  • Автор темы
Интересная идея. Не знаю, что сказать. Я думал об Xdialog.  Уровень сигнала лучше смотреть в консоли. Постоянно выпрыгивающая штука с OK раздражает. Это бы хорошо подошло для проверки счета.

Я доработал скрипт signal чтобы получить больше информации об операторе и сети.  Хочу завтра проверить будет ли он отличать EDGE и HSDPA от просто GSM и UMTS.

Проверил - EDGE и HSDPA не отличает. Не та AT-команда.
« Последнее редактирование: 26 Август 2010, 21:15:38 от rodin.s »

Оффлайн rodin.s

  • Почетный участник
  • Ветеран
  • *
  • Сообщений: 1179
  • Репутация: +96/-0
  • Автор темы
Доработал скрипт проверки баланса для работы в Wary. В Quirky и Lupu также работает. Не обязательно запускать в терминале. Использует новый gtkdialog. Скрипт нужно поместить в
Код
my-applications/bin
. Перетащить на рабочий стол его копию, добавить значок по желанию. (Нажать правой кнопкой - контекстное меню - файл "Баланс" - установить значок.) Я выбрал значок флешки в
Код
/usr/local/lib/X11/pixmaps
. Потом достаточно нажать на значок и проверяется счет. Результат покажет обычный для Wary gtkdialog-splash. Исчезнет от наведения курсора мыши. Если кликнуть на значек правой кнопкой, в контекстном меню "Редактировать" можно изменить название значка на, например, "Баланс", а в строке "Аргументы для дополнительных параметров" задать свой USSD-запрос, только в кавычках, например '*121#'.  У меня сработало в одиночных кавычках. Внутри скрипта закодирован запрос *100#. Его можно поменять на другой, отредактировав скрипт. Для пополнения счета удобнее использовать терминал, нужно ввести, например:
Код
balans *111*код пополнения#
« Последнее редактирование: 20 Октябрь 2010, 01:05:00 от rodin.s »