Pull to refresh

Выполнение USSD запросов под Linux

Lumber room
Спасибо автору топика Проверка счета Киевстар модема в Linux который помог мне понять принцип работы модемов и способ работы с ними в линуксе. Мне как раз нужно было решить задачу отображения уровня сигнала, проверки баланса, пополнения счета с использованием 3ж модема. Но так как ставить на домашние машины пхп ради такой мелочи мне не хотелось, решил переписать скрипт под себя на Python, который есть в любом десктоп-линуксе из коробки.

Работать данный скрипт будет на любых модемах/телефонах которые поддерживают USSD без PDU кодирования. Для модемов требующих PDU-кодировку команд нужно написать функции-обертки аналогично php-скрипту из указаного выше топика. У меня к сожалению нету такого модема и проверить я бы не смог — потому писать не стал.

Проверена работа на 3G модеме ZTE MF100(должно работать с mf620, mf622, mf626, mf628) и тарифе Интернет 3G от Киевстара.

Сам скрипт ussd.py
#!/usr/bin/python
import binascii
import sys
f = open("/dev/ttyUSB2", "r+")
data=''
error="Usage: python ussd.py action (code)\r\nActions: balans, popolnit, data-status, 3g-data-status, signal"
if len(sys.argv) < 2:
print error
sys.exit()

if sys.argv[1] == 'balans':
print>>f, "AT+CUSD=1,*111#,15\r\n"
while data[:5]!="+CUSD":
data=f.readline()
data = data[10:-6]
print binascii.unhexlify(data)
elif sys.argv[1] == 'signal':
print>>f, "AT+CSQ\r\n"
while data[:5]!="+CSQ:":
data=f.readline()
data = data[6:-5]
sig_str = -113+int(data)*2
sig_per = int(data)*100 / 31
print unicode(sig_str)+"dBm / "+unicode(sig_per)+"%"
elif sys.argv[1] == 'popolnit':
print>>f, "AT+CUSD=1,*123*"+sys.argv[2]+"#,15\r\n"
while data[:5]!="+CUSD":
data=f.readline()
data = data[10:-6]
print binascii.unhexlify(data)
elif sys.argv[1] == 'data-status':
print>>f, "AT+CUSD=1,*121#,15\r\n"
while data[:5]!="+CUSD":
data=f.readline()
data = data[10:-6]
print binascii.unhexlify(data)
elif sys.argv[1] == '3g-data-status':
print>>f, "AT+CUSD=1,*122#,15\r\n"
while data[:5]!="+CUSD":
data=f.readline()
data = data[10:-6]
print binascii.unhexlify(data)
else:
print error
f.close


Делаем скрипт исполняемым:
chmod +x ussd.py

Использование:
./ussd.py действие (код)
Доступные действия: balans, popolnit, data-status, 3g-data-status, signal
При выборе действия popolnit нужно вторым параметром передать скрипту код пополнения.
Пример:
./ussd.py popolnit 1234567890

Скрипт заточен под Киевстар, но думаю ни у кого не составит труда заменить короткие номера запросов на используемые вашим оператором.
Бывает скрипт «подвисает», насколько я понял это происходит когда он так и не дожидается нужного ответа от модема. Грешу на плохое покрытие в моем районе. Если у вас скрипт повиснет просто прервите его и запустите заново.Подвисания прекратились как только закрыл minicom.
Еще важный момент большинство 3ж-модемов под линуксом определяется как 3 устройства:/dev/ttyUSB0, /dev/ttyUSB1 ,/dev/ttyUSB2. Одно используется для передачи данных, другое похоже для какихто сервис команд модема, третье предоставляет стандартный COM интерфейс для управления. В скрипте нужно указать именно устройство COM интерфеса, в некоторых модемах это /dev/ttyUSB0, реже /dev/ttyUSB2.

В зависимости от возможностей модема и тарифа у оператора USSD запросами и AT командами, можно добится отправки смсок, переключения режимов(2G/3G), отключить виртуальный сд-ром итд. К сожалению для каждой модели прийдется подбирать команды вручную…

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

UPD Забыл рассказать еще одну вещь, на днях нашел какогото опсоса который предоставляет линукс софт к своим модемам. Модемы естественно стандартные китайские брендированые под опсоса. Вот тут например явно видно ZTE MF100/MF62X, но к сожалению я не смог заставить софтину работать с моим модемом. Может ктото поопытней сможет ее доколупать? Для ее работы нужен пакет libqt3-mt для архитектуры i386(иначе не запустится)
Tags:ussd3glinuxпополнениебаланскиевстар
Hubs: Lumber room
Total votes 41: ↑37 and ↓4 +33
Views13.1K

Comments 19

Only those users with full accounts are able to leave comments. Log in, please.

Popular right now

Системный администратор Linux
from 150,000 to 250,000 ₽ACTION TECHМоскваRemote job
DevOps инженер Linux (можно удаленно, Москва)
from 150,000 ₽Баланс-ПлатформаМоскваRemote job
Системный администратор Linux DevOps
from 100,000 to 150,000 ₽X-KeeperКрасногорскRemote job
Devops / Linux администратор
from 150,000 to 250,000 ₽Софт ПроектМоскваRemote job
DevOps Engineer
to 150,000 ₽InvestEngineRemote job