Найти - Пользователи
Полная версия: Ussd запрос по COM порту
Начало » Python для новичков » Ussd запрос по COM порту
1 2 3
pyxap
Привет, есть 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$
igor.kaist
Откуда твой терминал знает что ты закончил отправлять запрос?
Отправь ему после запроса символы перевода строки \n или \r\n. В гипертерминале ты же нажимаешь клавишу enter!
P.S.
1.Не хорошо называть переменную str :)
2.Модуль string давно устарел, теперь его методы доступны у строк.
'some string'.replace('s','1')
pyuser
pyxap
получить ответ шлюза? так как после запрос ничего не получается считать…
можно подробнее, что значит не получается и какая ОС?
pyxap
на счет /r уже нагуглил, но без объяснения )
подскажите куда смотреть для вывода не одной строки а 2-3-4-всех ?
igor.kaist
pyxap
подскажите куда смотреть для вывода не одной строки а 2-3-4-всех ?
Вывода чего и куда? Четче сформулируйте вопрос пожалуйста :)
pyuser
pyxap
подскажите куда смотреть для вывода не одной строки а 2-3-4-всех ?
Очевидно в исходники pyserial ;-) метод readlines, только нужно таймаут задавать
pyxap
рабочий код, но иногда не выполняется…
# -*- 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#"
вследствии чего это может быть?
корявый обрубок кода, или проблема в девайсе ?
Griffon
Я так понимаю что надо ждать не “пожалуйста подождите”, а “выполнено”. А вот уже в процессе обработки ответа, если “подождите” то просто игнорировать, если “ошибка” то выходим из цикла, если что-то другое то добавляем к результату.

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

ред. str+=…

ред.2 вполне возможно что может приниматься пустая строка между копией вашей команды и телом ответа.
pyuser
pyxap
вследствии чего это может быть?
возможно оператор пытается проинформировать Вас о чем-то ;-), может есть смысл дочитать сообщение до конца?
pyuser
Griffon
ред. str+=…
:) получим бесконечный цикл
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB