如何使用python的telnetlib在固定的时间段内从设备获取数据?

时间:2009-03-10 13:41:55

标签: python telnet

我通过telnet连接到硬件设备。就I / O而言,该设备非常简单。所以我向它提交一个命令,之后设备每次一行抽出一行数据,每秒一次。每行只包含一个数字。

所以我的问题是:如果我使用python的telnetlib连接到这个设备,我如何获取一段固定时间的数据(或固定数量的数据行)?

我已尝试使用所有各种read_命令,但它们似乎都无限期地阻塞,除了read_until,我无法使用,因为输出不能用于确定何时停止。

(我在Cygwin下运行python 2.5,顺便说一下。)

编辑:也许真正的问题是,我是否应该使用telnetlib,或者我应该只使用套接字模块?

4 个答案:

答案 0 :(得分:5)

根据您的描述,我不清楚您是否使用telnetlib,因为您连接到的设备需要telnet 提供的终端设置,或者因为它似乎是正确的事情。< / p>

如果设备如您所描述的那样简单 - 即。没有在连接上协商终端选项 - 您是否考虑过asynchat模块?它适用于您正在描述的“发送命令,读取行”类型的IO模式。

或者,对于较低级别的内容,您可以使用socket模块打开与设备的连接,然后进入定时循环并read()传入数据。如果这些行是换行终止的,那么您应该很容易识别每个单独的号码。如果您关心阻塞,请将此循环粘贴在自己的线程中。

答案 1 :(得分:2)

根据我的经验,大多数此类设备都使用一些提示,在这种情况下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序列中,否则不要阻止。

答案 2 :(得分:2)

这听起来像阻塞并不是你的问题,因为你知道你只会阻塞一秒钟。为什么不这样做:

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

答案 3 :(得分:1)

读取循环中的行,直到您已读取所需的行数或已达到时间限制。但是,它听起来并不像你真正需要一个telnet库。为什么不使用简单的TCP socket进行连接?