Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 23, 2010 16:39:40

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

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

Просто нельзя в цикле проверять наличие символов в ответе.
Ответ строго декларируется. Соответственно надо ждать конкретный ответ.
Например для АТ команд, я часто получал вид -> копия отправленной команды, пустая строка, тело, пустая строка, ОК.
Или копия отправленной команды, пустая строка, Error (но так же может быть No dialtone, если это звонок, например).
Все возможные ответы должны обрабатываться.
Тут с ussd тоже самое.



Офлайн

#2 Фев. 23, 2010 16:42:13

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

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

2 Griffon:
а можно пример как вот обработать все ?



Офлайн

#3 Фев. 23, 2010 16:54:01

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

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

Я же уже писал Вам:

pyuser
метод readlines, только нужно таймаут задавать
Модем в любом случае что-либо ответит, получите ответ полностью и анализируйте



Офлайн

#4 Фев. 23, 2010 16:59:47

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

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

Для начала надо знать какие ответы он может выдавать. Например если нет связи. Я ussd не использовал никогда. Буду дома, погуглю.

Исходя из того что я увидел.

answer = ""
while not(answer.startswith('Exe')): # maybe answer.startswith('Exe') or answer.startswith('Err') or 'something else'
if answer.startswith('ussd') or answer.startswith('Ple'):
continue
answer+=sp.readline()
где то так. А там по выводу будет видно.



Отредактировано (Фев. 23, 2010 17:00:49)

Офлайн

#5 Фев. 23, 2010 17:33:37

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

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

2 griffon
как-то проходит условия Оо, или например ничего не выводит, просто пару переводов каретки….

а где документация по readlines() ? Oo
не могу найти ничего по таймауту (



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

Офлайн

#6 Фев. 23, 2010 18:50:33

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

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

pyxap
а где документация по readlines()
модуль serialutil (pyserial-2.5-rs2)
pyxap
не могу найти ничего по таймауту
конструктор СОМ-порта
    def __init__(self,
port = None, # number of device, numbering starts at
# zero. if everything fails, the user
# can specify a device string, note
# that this isn't portable anymore
# port will be opened if one is specified
baudrate=9600, # baud rate
bytesize=EIGHTBITS, # number of data bits
parity=PARITY_NONE, # enable parity checking
stopbits=STOPBITS_ONE, # number of stop bits
timeout=None, # set a timeout value, None to wait forever
xonxoff=0, # enable software flow control
rtscts=0, # enable RTS/CTS flow control
writeTimeout=None, # set a timeout for writes
dsrdtr=None, # None: use rtscts setting, dsrdtr override if true or false
interCharTimeout=None # Inter-character timeout, None to disable
):
ЗЫ. вот код функции readlines, на тот случай, если в Вашем пакете она отсутствует:
    def readlines(self, sizehint=None, eol='\n'):
"""read a list of lines, until timeout
sizehint is ignored"""
if self.timeout is None:
raise ValueError("Serial port MUST have enabled timeout for this function!")
lines = []
while 1:
line = self.readline(eol=eol)
if line:
lines.append(line)
if line[-1] != eol: # was the line received with a timeout?
break
else:
break
return lines



Отредактировано (Фев. 23, 2010 19:01:41)

Офлайн

#7 Фев. 23, 2010 20:03:08

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

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

Подрихтовал на скорую руку под 3.1 под винду. Поэтому везде в бинарном виде.

В общем у меня вообще на сони ериксон команда ussd не существует. Зато в доках нашел AT+CUSD.

Код:

try:
sp = serial.Serial(port="COM5",timeout=10)
except:
print('Error: Device is busy')
sys.exit()
if __name__ == '__main__':
print('Please wait...')

req = b'AT+CUSD=1,"*102#",15'
sp.write(req+b"\r\n")
res = b""
ans = b""
while 1:
ans = sp.readline(eol=b"\n")
if ans == b"" or ans == b"OK\r\n" or ans == b"ERROR\r\n":
break
if ans == b"\r\n" or ans == req + b"\r\r\n":
continue
res += ans

print(res)
sp.close()
sys.exit()
Вывод:
b'+CUSD : 0,“Balans …… ”\r\n'

При работе со строками фильтровать конечно легче намного. И потом вырезать результат не проблема.


ред…

неправильно написал в прошлый раз.
answer = ""
result = ""
while not(answer.startswith('Exe')): # maybe answer.startswith('Exe') or answer.startswith('Err') or 'something else'
answer = sp.readline()
if answer.startswith('ussd') or answer.startswith('Ple'):
continue
result += answer



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

Офлайн

#8 Фев. 24, 2010 11:06:59

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

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

спасибо всем за ответ! очень помогло!
подскажите еще, хочу переменным передавать значение с командной строки, типа: <my_script> -k1 com3 *111#
то есть у меня эти 3 значения должны будут передаться 3м переменным, и потом уже использоваться в коде, как это лучше сделать, ссылки на примеры желательно )

upd: мой мозг сам допер, элементарные вещи фиг нагуглишь, позже выложу кусок костыля, что бы попинали меня )



Отредактировано (Фев. 24, 2010 16:00:55)

Офлайн

#9 Фев. 25, 2010 21:05:20

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

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

нашлась новая фичя, после перезапуска gsm шлюза, при коннекте по ком порту гипертерминалом (например) видим тонну текста который сообщает чем занят в данный момент шлюз, что бы активировать шлюзовый терминал(консоль) нужно набрать имя шлюза, после набора последней буквы (без нажатия “ввод”) появляется gsm терминал, и уже можно вводить запросы.
каким образом ввести имя шлюза в коде?
пробовал по разному:
sp.write('name')
sp.write('name\r')
sp.write('n')
sp.write('a\r')

консоль не активируется, как правильно передать нажатия клавиш, подскажите пжлста?
неужели нужно передавать сам код клавиш? Оо



Отредактировано (Фев. 25, 2010 21:08:15)

Офлайн

#10 Фев. 26, 2010 08:11:30

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

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

Ввод имитируется символом конца строки. Так что по идее надо просто записать имя шлюза. Т.е. sp.write('name') по идее должно работать.
Какое-то странное поведение. С телефонный модем всегда готов для приёма команд.
Попробуй “ATO0\r\n”. А затем вводить команды.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version