2015-01-27 2 views
2

Я пытаюсь связаться с устройством, использующим модуль telnetlib Python. Кажется, я могу установить соединение и передать свой запрос на устройство, однако вывод не является тем, что я ожидаю.Как я могу прочитать несколько строк из запроса telnet в Python?

Вот мой упрощенный код:

import telnetlib 
import time 

HOST = "10.10.10.71" 

tn = telnetlib.Telnet(HOST, port=55555, timeout=60) 

time.sleep(5)    # Give the processor time to connect 

tn.write(b'v' + b'\r\n')  # Get the processor version, using 'v' 

print(tn.read_eager().decode('utf-8')) 

tn.close()     # Close the connection 

После выполнения этого кода, все терминал отображает это: мПа :? - а не информацию о процессоре, которую я ожидал.

Когда я использую клиент Telnet, после установления соединения, я получаю mpa :?, в котором указано, что устройство готово для моей команды. Затем я типа в «V», который должен производить вывод в следующем формате:

mpa:? v 

FIRMWARE CONFIGURATION: 
Processor Firmware Type 
Build Number 
Copyright Info 

HARDWARE CONFIGURATION: 
Line 1   - xxxx 
Line 2   - xxxx 
Line 3   - xxxx 
... 

mpa:? 

После того, как запрос, Мпа :? Появится сообщение, готовое к следующей команде.

На месте print(tn.read_eager().decode('utf-8')), я также пытался print(tn.read_all().decode('utf-8')), но этот раз с следующим сообщением об ошибке:

Traceback (most recent call last): 
File "C:/Python/Telnet_logger_1.py", line 14, in <module> 
print(tn.read_all().decode('utf-8')) 
File "C:\Python34\lib\telnetlib.py", line 335, in read_all 
self.fill_rawq() 
File "C:\Python34\lib\telnetlib.py", line 526, in fill_rawq 
buf = self.sock.recv(50) 
socket.timeout: timed out 

ли кто-нибудь сможет указать меня в правильном направлении, или дайте мне знать, что я «Неправильно?

Большое спасибо!

+0

Я подозреваю, что вам нужно прочитать 'Мпа:' приглашение, возвращенное устройством, прежде чем вы попытаетесь отправить ему команду. Вы пробовали что-то вроде 'tn.read_until (b" mpa:? ")', Что похоже на пример в [docs] (https://docs.python.org/3/library/telnetlib.html)? –

+0

@ PM2Ring - Спасибо за ваше предложение. Я попытался удалить 'time.sleep (5)' и заменил его на 'tn.read_until (b" mpa:? ")' - я все еще получаю ошибку таймаута, когда я использую tn.read_all(), и когда я использую tn.read_eager(), я не получаю никакого вывода. – skyhammer

+0

Я не уверен, что предложить. У меня только ограниченный опыт работы с telnetlib, но я успешно использовал его (в Python 2.6.) Для связи с моим ADSL-модемом. Поскольку модем всегда завершает свой вывод с помощью командной строки, я использую 'tn.read_until (prompt)' для чтения данных из него. –

ответ

2

я решил эту проблему путем добавления While-цикл для печати каждой строки после новой строки и возврата каретки были считаны:

import telnetlib 

HOST = "10.10.10.71" 

tn = telnetlib.Telnet(HOST, port=55555, timeout=60) 

tn.read_until(b"mpa:?") 

tn.write(b'v' + b'\n\r') 

while True: 
    line = tn.read_until(b"\n\r") # Check for new line and CR 
    print(line) 
    if (b"mpa:?") in line: # If last read line is the prompt, end loop 
     break 

tn.close()