Как я могу использовать telnetlib python для извлечения данных с устройства за фиксированный период времени?

StackOverflow https://stackoverflow.com/questions/630217

  •  08-07-2019
  •  | 
  •  

Вопрос

Я подключаюсь к аппаратному устройству через telnet.Это устройство довольно простое с точки зрения ввода-вывода.Поэтому я отправляю ему команду, и после этого устройство откачивает данные по одной строке за раз, один раз в секунду.Каждая строка просто содержит число.

Итак, мой вопрос заключается в следующем:если я подключусь к этому устройству с помощью telnetlib на python, как я могу извлекать данные за фиксированный период времени (или фиксированное количество строк данных)?

Я пробовал использовать все различные команды read_, но все они, похоже, блокируются на неопределенный срок, кроме read_until , который я не могу использовать, поскольку выходные данные не могут быть использованы для определения момента остановки.

(Кстати, я использую python 2.5 под управлением Cygwin).

Редактировать:Может быть, реальный вопрос в том, должен ли я вообще использовать telnetlib для этого, или я должен просто использовать модуль сокета?

Это было полезно?

Решение

Из вашего описания мне непонятно, используете ли вы telnetlib, потому что устройство, к которому вы подключаетесь , требует настройки терминала, предоставленной telnet , или потому что это кажется правильным.

Если устройство так просто, как вы описываете, т.е. не согласовывает параметры терминала при подключении - рассматривали ли вы модуль asynchat ? Это было бы уместно для команды «отправить, прочитать строки» своего рода шаблон ввода-вывода, который вы описываете.

В качестве альтернативы, для чего-то более низкого уровня, вы можете использовать модуль socket , чтобы открыть подключение к устройству, а затем сидеть в цикле времени и read () входящие данные. Если строки заканчиваются символом новой строки, вам будет просто определить каждый отдельный номер. Если вас беспокоит блокировка, вставьте этот цикл в собственный поток.

Другие советы

Звучит так, будто блокировка - это не ваша проблема, поскольку вы знаете, что блокируете только секунду. Почему бы не сделать что-то вроде:

lines_to_read = 10
for i in range(lines_to_read):
    line = tel.read_until("\n")

По моему опыту, большинство таких устройств используют некоторую подсказку, в этом случае Telnet.read_until() уместно:

Telnet.read_until(expected[, timeout])

Считывайте до тех пор, пока не встретится заданная ожидаемая строка или пока не истечет несколько секунд ожидания.Если совпадение не найдено, верните вместо него все, что доступно, возможно, пустую строку.Вызовите EOFError, если соединение закрыто и обработанные данные недоступны.

Если устройство не выдает полезной (повторяющейся) подсказки, попробуйте Telnet.read_very_eager(), или Telnet.read_very_lazy():

Telnet.read_very_eager()

Прочитайте все, что можно, без блокировки при вводе-выводе (нетерпеливо).

Вызовите EOFError, если соединение закрыто и подготовленные данные недоступны.Вернуть ", если в противном случае подготовленные данные недоступны.Не блокируйте, за исключением случаев, когда выполняется последовательность IAC.

Читайте строки в цикле, пока вы не прочитаете необходимое количество строк или не достигнете предела времени. Однако это не похоже на то, что вам действительно нужна библиотека telnet. Почему бы просто не использовать простой TCP сокет для подключения?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top