Как я могу использовать telnetlib Python для получения данных с устройства в течение фиксированного периода времени? - PullRequest
2 голосов
/ 10 марта 2009

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

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

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

(я использую Python 2.5 под Cygwin, кстати).

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

Ответы [ 4 ]

5 голосов
/ 10 марта 2009

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

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

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

2 голосов
/ 10 марта 2009

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

lines_to_read = 10
for i in range(lines_to_read):
    line = tel.read_until("\n")
2 голосов
/ 10 марта 2009

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

Telnet.read_until(expected[, timeout])

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

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

Telnet.read_very_eager()

Читать все, что может быть без блокировки в I / O (с нетерпением).

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

1 голос
/ 10 марта 2009

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

...