Формирователь USSD-запросов

для модемов
 
+
-
edit
 

HolyBoy

аксакал

Приобрёл на днях 3g модем Huawei E352 от Мегафон. Разумеется, сразу же сильно захотелось как-то узнавать состояние счёта и, возможно, не только его. Гугление привело меня к нескольким скриптам на Perl (http://betment-6.livejournal.com/6002.html), PHP (посеял ссылку, в недрах ЖЖ где-то), Python (Форум - General - вменяемый скрипт или программа для USSD Выполнение USSD запросов под Linux / Телекомы / Хабрахабр)


PHP-скрипт не заработал, не заработали и Python'овые скрипты, кроме того, мне не очень понравился стиль, в котором они были написаны и я решил сделать свой вариант:
code python
  1. #!/usr/bin/env python3
  2.  
  3. import io, tty, base64, sys
  4.  
  5.  
  6. def main():
  7.     fd=None
  8.  
  9.     try:
  10.         fn=str(sys.argv[1])
  11.         ussd=str(sys.argv[2])
  12.  
  13.         fd=io.open(fn, 'w+b', buffering=0)
  14.         if fd.isatty():
  15.             print("Opened tty device")
  16.             tty.setraw(fd)
  17.             requssd(fd, 'AT+CUSD=1,' + to7bit(ussd) + ',15')
  18.             ans=getanswer(fd)
  19.             if ans is not None:
  20.                 print(base64.b16decode(ans.encode()).decode("utf-16-be"))
  21.         else:
  22.             print("It is non-tty device")
  23.  
  24.     except IOError as err:
  25.         print(err)
  26.  
  27.     except IndexError:
  28.         print("Usage: ussd.py /path/to/tty/modem *ussd*request#")
  29.  
  30.     finally:
  31.         if fd is not None:
  32.             fd.close()
  33.  
  34. # gets answer st as a String from file descriptor fd
  35. def getanswer(fd):
  36.     print("Waiting answer... You can break it with ^C")
  37.     while True:
  38.         try:
  39.             st=fd.readline().decode("latin1")
  40.             if st.startswith('+CUSD'):
  41.                 return st[st.index('"')+1:st.rfind('"')]
  42.         except KeyboardInterrupt:
  43.             break
  44.  
  45. # sends request req in file descriptor fd
  46. def requssd(fd, req):
  47.     try:
  48.         print("Send request")
  49.         # Uncomment when you starts this script
  50.         # in Python3 enviroment
  51.         fd.write(bytes(req + '\r\n', 'utf-8'))
  52.         # in Python2 enviroment
  53.         #fd.write(req + '\r\n')
  54.  
  55.     except IOError as err:
  56.         print(err)
  57.  
  58.     except TypeError:
  59.         fd.close()
  60.         exit("Python version problems: look at requssd function.")
  61.  
  62. # encoding function
  63. def to7bit(src):
  64.     result, count, last = [], 0, 0
  65.     for c in src:
  66.         this = ord(c) << (8 - count)
  67.         if count:
  68.             result.append('%02X' % ((last >> 8) | (this & 0xFF)))
  69.         count = (count + 1) % 8
  70.         last = this
  71.     result.append('%02x' % (last >> 8))
  72.     return ''.join(result)
  73.  
  74.  
  75. main()


По сути, моя программа является переработанной и причёсанной версией той, что на LOR, но она, вдобавок, ещё и работает.

Может принимать любые верные для данного оператора USSD-запросы и отправлять их на указанный порт.
 
Это сообщение редактировалось 17.01.2012 в 13:13

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru