LinuxForum.Fans
Тема

Составление скрипта о балансе USB-модема

Автор: Otten 26 сообщений 15991 просмотров
#122500

Приветствую форумчан. Снова погуглил на предмет возможности проверки баланса USB-модема под линуксом, и раньше и сейчас попалось несколько вариантов и для разных модемов/операторов, но то ли модем у меня такой, то ли руки, в общем ничего не выходило, и я решил составлять его сам. Немножко разобрался, рассматривая те скрипты. Остановился на таком моменте. Не знаю как передать команде содержимое текстового файла на обработку. Добился от миникома, чтобы он, опросив модем, длинный ответ вида "041C043E04310438043B044C043D044B04390020043F043B043004420......" положил в файл. Ответ в таком виде, потому что он закодирован, и это неудобно. Текст файла надо передать дальше на раскодировку, знаю что можно как-то, но какой командой вытащить его из файла? В скриптах я только начинаю разбираться, и нужна ваша помощь ))

Вот скрипт:

text
#!/bin/bash
#
#
SCR=/home/otten/balans/balans
LINE=/home/otten/balans/line
(
echo 'send "ATZ"'>$SCR
echo 'send ""' >>$SCR
echo "send \"AT+CUSD=1,*102#,15\"">>$SCR
echo 'expect {'>>$SCR
echo '"\"," ! killall -9 minicom'>>/$SCR
echo '   }'>>$SCR
echo '! killall -9 minicom'>>$SCR
minicom -w -S $SCR -C $LINE >/dev/null 2>&1
) >/dev/null 2>&1
reset

echo 'ТЕКСТ ФАЙЛА' | perl -ne '@a = m/([0-9A-F]{4})/g; map { eval "print \"\\x{$_}\""; } @a;' 2>/dev/null

unlink $SCR unlink $LINE

Когда сработает скрипт, в терминале должно остаться примерно следующее: Баланс 115.00р. Трафик 37800 Кб.
В этом и весь смысл, что хочется получить от модема USSD-ответ и раскодировать его одной командой-скриптом.

#122512

Покурил маны и понял, что все гораздо проще. Использовать надо совсем другую команду. Не echo, a cat.
И тогда готовый скрипт выглядит таким образом:

text
#!/bin/bash
#
#
SCR=/home/otten/balans/balans
LINE=/home/otten/balans/line
(
echo 'send "ATZ"'>$SCR
echo 'send ""' >>$SCR
echo "send \"AT+CUSD=1,*102#,15\"">>$SCR
echo 'expect {'>>$SCR
echo '"\"," ! killall -9 minicom'>>/$SCR
echo '   }'>>$SCR
echo '! killall -9 minicom'>>$SCR
minicom -w -S $SCR -C $LINE >/dev/null 2>&1
) >/dev/null 2>&1
reset

cat /home/otten/balans/line | perl -ne '@a = m/([0-9A-F]{4})/g; map { eval "print \"\\x{$_}\""; } @a;' 2>/dev/null

unlink $SCR unlink $LINE

Удалять пост не буду, может кому пригодится.
Скрипт делался для билайна и модема Связной, он же Alcatel x080s (определяется у меня как 1bbb:0000 T & A Mobile Phones).
Всем удачи!

#122816

А как этим пользоваться?

#122818
Otten написал:
но какой командой вытащить его из файла?

sed

Otten написал:
Удалять пост не буду, может кому пригодится.
Скрипт делался для билайна и модема Связной, он же Alcatel x080s (определяется у меня как 1bbb:0000 T & A Mobile Phones).
Всем удачи!
Otten написал:
perl -ne '@a = m/([0-9A-F]{4})/g; map { eval "print \"\\x{$_}\""; } @a;' 2>/dev/null

ну можно и перловку.

#122826
Dykus написал:
А как этим пользоваться?

копируешь в файл через свой любимы текстовый редактор(gedit, kate, nano, vim)
делаешь исполняемым
вызываешь в консоли
/полный/путь/имя/файла

#123013

Это подошло для моего модема и оператора. Нет гарантий, что будет работать на других, и я отметил, что этот скрипт составной с разных примеров (часть примеров попадалась на форуме убунту, часть в других форумах). Есть нюансы в виде того, что запрос *100# можно еще отправить как AA180C3602, у кого-то срабатывало именно так. Нужно перед составлением пробивать и проверять команды в миникоме, предварительно определив в настройках отзывающееся устройство (модем определяется как три устройства, а именно ttyUSB0, ttyUSB1, ttyUSB2). У меня USSD-запросы миникома в скрипте идут только на /dev/ttyUSB1, а wvdial звонит для инета на ttyUSB2, проверялось опытным путем. К тому же встречались случаи, когда ответ приходил не закодированным, а вполне нормальным. На форуме убунту еще выложен пример вот такой, цитирую:

Можно так:
[console]sudo apt-get install gsm-ussd[/console]

[console]alexei@Aspire ~ $ gsm-ussd -m /dev/ttyUSB2 *100#
Баланс:5,3р [/console]
[console]alexei@Aspire ~ $ gsm-ussd -m /dev/ttyUSB2 *100*1#
Остаток: 183,9Мб.[/console]

#123783

Проверил у себя пакет gsm-ussd, работает отлично. Вывод такой же как у скрипта.
UPD: кстати поддерживает работу в режиме сессии. Например передвижение по меню внутри сессии. Дальше не тестил.

text
otten@debian:~$ gsm-ussd *111#
USSD session open, to cancel use "gsm-ussd -c".
1 Услуги при 0
2 Мой Билайн
3 Музыка
4 Игры
5 Знакомства
6 Обои+Видео
7 Погода+
otten@debian:~$ gsm-ussd 2
USSD session open, to cancel use "gsm-ussd -c".
1 Мои данные
2 Услуги
3 Скидки и акции
4 Тел. настройки
5 Роуминг
6 <<
otten@debian:~$ gsm-ussd 1
USSD session open, to cancel use "gsm-ussd -c".
1 Мой т/план
2 Мой номер
3 Мои услуги
4 Постоплата
5 Получить web-пароль
6 <<
otten@debian:~$ gsm-ussd -c
USSD cancel request successful
otten@debian:~$
#124083

А где для дебиана найти пакет gsm-ussd?

#124119
Otten написал:
У меня USSD-запросы миникома в скрипте идут только на /dev/ttyUSB1, а wvdial звонит для инета на ttyUSB2, проверялось опытным путем.

проверьте ещё раз, после перезагрузки. оно в первый раз определяет как USB1, а во второй как USB2. ИМХО это всё неплохо-бы выдрать из dmesg'а sed'ом, но беда в том, что для каждой комбинации модем+дистрибутив скрипт будет свой. :(

unk написал:
А где для дебиана найти пакет gsm-ussd?

здесь

#124189

С моим модемом такой прикол, что он определяется сперва как накопитель (как сд-диск для винды, где все его дрова виндовые), и никакое устройство, ни USB1 ни USB2 не принимают команды. Для таких случаев, чтобы отрубить накопитель и задействовать модем, есть специальный пакет usb-modeswitch. Но обычно у пользователей все дозванивается и без него. У меня модем не такой популярный видимо, да и юзал я его только на дебиане.

#124721

спасибо большое

#125002

А можно еще проще.

text
#!/bin/bash

n=1; #Тут задаем номер порта для запроса

F="/dev/ttyUSB$n" echo -e "AT+CUSD=1,*102#,15\r">$F head -n 4 $F | \ perl -ne '@a = m/([0-9A-F]{4})/g; map { eval "print \"\\x{$_}\""; } @a;' 2>/dev/null echo ""

#125184

А дабы не лазить в консоль, не пускать команды... Кстати есть у gsm-ussd есть некий графический интерфейс, который у меня, правда не работает, вешает ttyUSB1, пока руками не уберешь его из /var/lock, и сам вешается, мол, идет подключение... Так вот, взял я да прописал в коньках строчку вот такую вот:

text
${execi 60 gsm-ussd *102# | sed -r 's/Трафик/\n&/;s/.*Баланс([^\n]*)\n.*/\1/'}

Исключив из вывода все лишнее, и оставив только то, что между словами Баланс и Трафик, строчка эта пишет мне сама, с обновлением раз в минуту например такое "115.00р." Единственное, что в дебрях sed'а разбирался очень долго, и то мало, что понял.

#125186
Otten написал:
Единственное, что в дебрях sed'а разбирался очень долго, и то мало, что понял.

мою книжку читали?

#125189

Взял на заметку, спасибо. Читать же ж лень как всегда, хочется чтоб сразу и само :D

#125212
Otten написал:
Читать же ж лень как всегда, хочется чтоб сразу и само

так и было задумано. получилось как всегда :(
кстати, в kppp эта фича реализована (правда я не пробовал).

Otten написал:
Исключив из вывода все лишнее, и оставив только то, что между словами Баланс и Трафик,

ну всё правильно, но в данном случае можно было проще:
1) убираем всё, что перед "баланс" s/.*Баланс//
2) убираем всё, что после "Трафик" s/Трафик.*//
А ваш приём отлично работает если в ваших строчках много "Баланс" и "Трафик" (у вас наверное только по 1 разу).
ЗЫЖ или даже
s/.*Баланс(.*)Трафик.*/\1/

#125265

Действительно, так проще.

У меня еще получилось вот так, но видимо не совсем правильно и рационально, даже не смотря на работоспособность
's/.*Баланс//;s/Трафик//;s/Детали.*//' Выдает "115.00р. 7200 Кб".
А вот как разделить и перенести 7200 Кб уже на новую строку, чтобы было так

115.00р.
7200 Кб

#125427
Otten написал:
У меня еще получилось вот так, но видимо не совсем правильно и рационально, даже не смотря на работоспособность

ну я не знаю. какая исходная строчка?

Otten написал:
Выдает "115.00р. 7200 Кб".
А вот как разделить и перенести 7200 Кб уже на новую строку, чтобы было так

115.00р.
7200 Кб

это просто: меняёте пробелы на перевод строки, вот так:

text
sed -r 's/ +/\n/'

(без ключа -r плюс не работает, точнее его нужно экранировать вот так \+)

#125475

Строка такая: Баланс 115.00р. Трафик 8700 Кб.Детали: https://uslugi.beeline.ru
Точно, не догадался пробел заменить, знаю же, что \n.

#125555
Otten написал:
s/Трафик//

можно вместо этого сразу вписать замену. причём я-бы вписал так:
s/\s*Трафик\s*/\n/
тут \s означает "пробельные символы", аналог [[:space:]], туда входит пробел, табуляция, возврат каретки и перевод строки.

Войдите или зарегистрируйтесь, чтобы ответить.