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

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

Время на прочтение4 мин
Количество просмотров24K
Спасибо автору топика Проверка счета Киевстар модема в 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(иначе не запустится)
Теги:
Хабы:
+33
Комментарии19

Публикации

Истории

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн