Возникла на днях такая задача: прикрутить сотовый модем Huawei E160G к нетбуку под Убунтой. Собственно соединение настроилось штатными средствами, но вот посмотреть баланс не под виндой - никак. Личный кабинет на этом тарифе, похоже, не полагается, на штатный запрос USSD - ноль эмоций (как оказалось - из-за того, что с кодировками разработчик модема обошелся весьма вольно, и на вход принимается только 7-битный PDU-encoded, а на выходе - UTD-16 в шестнадцатиричном представлении).
В общем, дальше подробности рассказывать не буду, но после поиска по сети (не очень успешного) пришлось вспоминать, как писать на Питоне. В итоге все написалось :)
Тут берем пакет для работы с PDU-кодированными текстами.
А сам скриптик - ниже.
На входе принимает команды USSD-меню, если ничего не передано - запрашивает баланс (*102#).
В общем, дальше подробности рассказывать не буду, но после поиска по сети (не очень успешного) пришлось вспоминать, как писать на Питоне. В итоге все написалось :)
Тут берем пакет для работы с PDU-кодированными текстами.
А сам скриптик - ниже.
На входе принимает команды USSD-меню, если ничего не передано - запрашивает баланс (*102#).
#!/usr/bin/env python
#
# This script sends USSD requests to the Beeline
# via Huawei E160G USB-GPRS/3G modem.
#
# written by rvb, 2009
# feel free to use this code under GPL licence
#
import serial
import string
import os
import pdu
import sys
#
# Definitions
#
KDIALOG='/usr/bin/kdialog'
USBPORT='/dev/ttyUSB1'
USBSPEED=460800
MAXSTRINGLENGTH=300
n = 0
command = ''
for param in sys.argv:
n = n+1;
if n>1:
if command <> '':
command = command+' ';
command=command+param;
if n==1:
print 'No commands specified, requesting balance\n'
command="*102#"
gsmcommand = pdu.encodeText7Bit(command)
#print "Wait a USSD request ... "
try:
s=serial.Serial(USBPORT,USBSPEED,timeout=5)
s.write('ATZ \015')
s.write('AT+CUSD=1,'+gsmcommand+',15 \015')
line=''
while line[0:6] != '+CUSD:':
line=s.readline(MAXSTRINGLENGTH)
s.close()
line2=line.split(',')[1]
line3=string.replace(line2,'"','')
result=unicode(line3.decode("hex"),"utf-16-be")
print result
except:
print "Error when requesting 3G/GPRS modem"