Проверка баланса GPRS-модема через USSD-запрос

Создадим скрипт на языке python, который будет выводить баланс в окне терминала.

С задачей справиться достаточно просто при помощи модуля pyserial – устанавливаем его:
sudo apt-get install python-serial

Создадим файл, например, ussdbal.py
gedit ussdbal.py

Код скрипта:

?View Code PYTHON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/usr/bin/env python
# coding: UTF-8
import sys
import serial
import string
 
S_PORT='/dev/ttyACM0'
S_REQ = '"#102#"' # Результат запроса латиницей, оператор билайн.
S_SPEED=115200
if len(sys.argv)>1: # Если есть аргументы в командной строке
	S_PORT=sys.argv[1] # предполагаем, что это имя устройства (модема)
try:
	sp = serial.Serial(S_PORT, S_SPEED, timeout=3) # Пытаемся открыть порт
except: # Открыть не удалось
	print 'Error: Устройство \"%s\" занято или не существует!' % S_PORT
	sys.exit() # Завершаем работу
if __name__ == '__main__':
	print 'Запрос баланса. Ожидайте...'
	s_query = 'AT+CUSD=1,'+S_REQ+',15 \015' # Формируем запрос
	sp.write(s_query) # Отправляем запрос
	str = ""
	while not(str.startswith('+CUSD:')):
		str=sp.readline() # читаем пока не получим ответ
	s=string.replace(str.split(',')[1],'"','')
	print(s) # выводим результат
	sp.close() # закрываем порт
	sys.exit() # выход

Делаем файл исполняемым:
chmod 755 ussdbal.py
Скрипт готов к запуску. Запускаем из терминала:
./ussdbal.py
можно указать устройство:
./ussdbal.py /dev/ttyUSB0
Обратите внимание на то, что корректность переданного в командной строке аргумента не проверяется.

Похожие посты:

Comments (2)

nonameФевраль 23rd, 2010 at 16:50

пробую ваш скрипт подкрутить для своих нужд….
есть жсм шлюз, отправляю запрос, порт занят, просто идет ожидание……
и все…. шлюз никак не отвечает, хотя даже на не правильный запрос выдает, Input error, но система M$

если есть минутка, мой жаббер: noname@unstable.nl

АдминистраторФевраль 24th, 2010 at 21:49

Если шлюз, на момент подачи запроса, подключен к сети – возможно тут проблема (занят порт)? На би и мтс, у меня данный скрипт прекрасно работал в одном регионе (я его в отпуске писал), а после приезда домой, отказался работать на всех доступных мне операторах – мтс, би и меге. Это и остановило его дальнейшее развитие (хотелось апплет для гнома написать). Вот доработанная версия скрипта, работоспособная, но, работает не во всех регионах :(

?View Code PYTHON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/usr/bin/env python
# coding: UTF-8
import sys
import serial
import string
S_PORT='/dev/ttyUSB2' # Девайс
S_REQ = '*101#' # Номер
S_SPEED=115200
def byte2bin(num):
	result=""
	for i in range(0,7):
		result=result+str(num>>i & 1)
	return result
def revbin(str):
	result=""
	for i in range(0,8):
		result=str[i]+result
	return result
def packnum(num):
	a=list(num)
	adjbyte=line=""
	for i in range(len(a)):
		line += byte2bin(ord(a[i]))
		adjbyte += "0"
	line += adjbyte # Выравнивание байта
	a=""
	for i in range(0,len(line),8):
		b = hex(int(revbin(line[i:i+8]),2))[2:]
		if len(b)<2: a+="0"
		a+=b
	a=string.upper(a)
	return a
# ===================================================
#print packnum(S_REQ)
#sys.exit()
if len(sys.argv)>1: # Если есть аргументы в командной строке
	S_PORT=sys.argv[1] # предполагаем, что это имя устройства (модема)
try:
	sp = serial.Serial(S_PORT, S_SPEED, timeout=3) # Пытаемся открыть порт
except: # Открыть не удалось
	print 'Error: Устройство \"%s\" занято или не существует!' % S_PORT
	sys.exit(1) # Завершаем работу
if __name__ == '__main__':
	print 'Запрос баланса. Ожидайте...'
#	s_query = 'AT+CUSD=1,"'+S_REQ+'",15\015' # Запрос без упаковки (х.з. раньше работало так)
	s_query = 'AT+CUSD=1,"'+packnum(S_REQ)+'",15\015' # Упакованный запрос (позднее, только так, теперь у меня не работают оба)
	sp.write(s_query) # Отправляем запрос
	rst = ""
	c = 0
	while not(rst.startswith('+CUSD:') or rst.startswith('+CME ERROR:')):
		rst=sp.readline() # читаем пока не получим ответ
		c+=1
		print(c,rst)
		if c>10: break
	try:
		s=string.replace(rst.split(',')[1],'"','')
	except IndexError:
		s="Ответа не дождались..."
	print(s) # выводим результат
	sp.close() # закрываем порт
	sys.exit(0) # выход

Оставить комментарий

Ваш комментарий