Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 23, 2010 13:35:54

pyxap
От:
Зарегистрирован: 2009-11-29
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

Ussd запрос по COM порту

Привет, есть gsm шлюз к которому нужно отправить ussd запрос, такого плана: ussd -k1 “*111#”, и просто вывести все то что он выдаст.
Через hyperterminal работает, а вот автоматизировать не получается…
Нашел почти то что нужно: http://linenet.org/2009/07/script-get-balanse-usb-gprs-modem/
попробовал переделать:

# -*- coding: utf8 -*-
import sys
import serial
import string

S_PORT='2'
S_REQ = '"*111#"'
S_SPEED=9600
if len(sys.argv)>1:
S_PORT=2
try:
sp = serial.Serial(2)
except: # Открыть не удалось
print 'Error: Device \"%s\" busy or die' % S_PORT
sys.exit() # Завершаем работу
if __name__ == '__main__':
print 'Wait plz...'
s_query = 'ussd -k1 '+S_REQ # Формируем запрос
sp.write(s_query) # Отправляем запрос
print (s_query)
str = ""
while not(str.startswith('Please')):
str=sp.readline() # читаем пока не получим ответ
#s=string.replace(str.split(',')[1],'"','')
print(s) # выводим результат
sp.close() # закрываем порт
sys.exit() # выход
вопрос вообщем стоит в том как отправив запрос ser.write('ussd')
получить ответ шлюза? так как после запрос ничего не получается считать…
в гипертермиле вывод такого плана:
$ ussd -k1 "*111#"

Please wait...

"Na Vashomu rahunku 49.92 grn. Bonusy: 0 grn.; "

Executed!
к сожалению реализовываю это на M$



Отредактировано (Фев. 23, 2010 13:38:37)

Офлайн

#2 Фев. 23, 2010 14:30:52

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Ussd запрос по COM порту

Откуда твой терминал знает что ты закончил отправлять запрос?
Отправь ему после запроса символы перевода строки \n или \r\n. В гипертерминале ты же нажимаешь клавишу enter!
P.S.
1.Не хорошо называть переменную str :)
2.Модуль string давно устарел, теперь его методы доступны у строк.
'some string'.replace('s','1')



Отредактировано (Фев. 23, 2010 14:36:22)

Офлайн

#3 Фев. 23, 2010 14:53:51

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Ussd запрос по COM порту

pyxap
получить ответ шлюза? так как после запрос ничего не получается считать…
можно подробнее, что значит не получается и какая ОС?



Офлайн

#4 Фев. 23, 2010 15:02:23

pyxap
От:
Зарегистрирован: 2009-11-29
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

Ussd запрос по COM порту

на счет /r уже нагуглил, но без объяснения )
подскажите куда смотреть для вывода не одной строки а 2-3-4-всех ?



Офлайн

#5 Фев. 23, 2010 15:14:36

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Ussd запрос по COM порту

pyxap
подскажите куда смотреть для вывода не одной строки а 2-3-4-всех ?
Вывода чего и куда? Четче сформулируйте вопрос пожалуйста :)



Отредактировано (Фев. 23, 2010 15:14:52)

Офлайн

#6 Фев. 23, 2010 15:22:45

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Ussd запрос по COM порту

pyxap
подскажите куда смотреть для вывода не одной строки а 2-3-4-всех ?
Очевидно в исходники pyserial ;-) метод readlines, только нужно таймаут задавать



Офлайн

#7 Фев. 23, 2010 16:07:57

pyxap
От:
Зарегистрирован: 2009-11-29
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

Ussd запрос по COM порту

рабочий код, но иногда не выполняется…

# -*- coding: cp1251 -*-
import sys
import serial
import string

S_PORT='COM3'
#S_REQ = "-print\r"
S_REQ = '-k1 "*111#"\r'
S_SPEED=9600
if len(sys.argv)>1:
S_PORT=COM3 # предполагаем, что это имя устройства (модема)
try:
sp = serial.Serial(2) # Пытаемся открыть порт
except: # Открыть не удалось
print 'Error: Device is busy'
sys.exit() # Завершаем работу
if __name__ == '__main__':
print 'Please wait...'
s_query = 'ussd ' +S_REQ
sp.write(s_query) # Отправляем запрос
str = ""
while not(len(str)>0):
str=sp.readline() # читаем пока не получим ответ
print(str) # выводим результат
sp.close() # закрываем порт
sys.exit() # выход
при правильной работе увижу:
Please wait...
"Na Vashomu rahunku 49.92 grn. Bonusy: 0 grn.; "
но иногда вылазит:
Please wait...
ussd -k1 "*111#"
вследствии чего это может быть?
корявый обрубок кода, или проблема в девайсе ?



Отредактировано (Фев. 23, 2010 16:08:40)

Офлайн

#8 Фев. 23, 2010 16:20:44

Griffon
От: Ukrain, Zaporozhie
Зарегистрирован: 2009-03-04
Сообщения: 324
Репутация: +  11  -
Профиль   Отправить e-mail  

Ussd запрос по COM порту

Я так понимаю что надо ждать не “пожалуйста подождите”, а “выполнено”. А вот уже в процессе обработки ответа, если “подождите” то просто игнорировать, если “ошибка” то выходим из цикла, если что-то другое то добавляем к результату.

Писал когда-то подобные программы. Только не на питоне.
Спасибо за пример. Надо будет попробовать.

ред. str+=…

ред.2 вполне возможно что может приниматься пустая строка между копией вашей команды и телом ответа.



Отредактировано (Фев. 23, 2010 16:28:33)

Офлайн

#9 Фев. 23, 2010 16:32:09

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Ussd запрос по COM порту

pyxap
вследствии чего это может быть?
возможно оператор пытается проинформировать Вас о чем-то ;-), может есть смысл дочитать сообщение до конца?



Офлайн

#10 Фев. 23, 2010 16:34:30

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Ussd запрос по COM порту

Griffon
ред. str+=…
:) получим бесконечный цикл



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version