【问题标题】:Python telnet to download instrument dataPython telnet 下载仪器数据
【发布时间】:2013-01-23 07:39:05
【问题描述】:

我想编写一些 Python 代码来从我们拥有的压力传感器 (Vaisala PTU300) 下载数据。该传感器连接到我们的路由器,可以通过 telnet 会话进行联系,其中简单的命令会根据请求输出数据,或者它可以输出连续的数据流。手册的第 94 页列出了您可以发送到仪器的命令。我对 python 很陌生,但确实有一些 Fortran 编程经验,所以了解一些编程语言的结构。

我希望有人可以帮助我了解我应该实施哪些模块来做到这一点。我对该主题进行了一些研究,发现这些过去的问题具有一定的相关性(How can I use python's telnetlib to fetch data from a device for a fixed period of time?How to save the output of a telnet command by using python for an infinite time [closed])。

我已经开始尝试使用 telnetlib 通过以下命令连接到仪器

导入系统

导入 telnetlib

主机 = 'xxx.xxx.xxx.xxx'

tn=telnetlib.Telnet(主机)

tn.open

tn.write('r')

tn.read_very_eager()

这会导致读取一行数据

例如

2000-01-06 23:43:04 P= 980.0 T= -4.3 'C \r\n>r

但是随后的 tn.read_very_eager() 不返回任何内容。

我在这个读取命令上尝试了不同的[变体][4],例如

tn.read_until('C')

但任何后续读取都不会返回任何内容。我相信可能会发生一些“阻塞”?并不是说我真的知道那是什么。

我也尝试过使用

请求仅阅读一次

tn.write('发送')

tn.read_until('C')

但这只会返回一个读数,随后的读数不会返回任何内容。

[One][5] 过去的 stackoverflow 问题建议使用 [asynchat][6] 或 [socket][7] 模块来执行此类操作。我还没有尝试使用它们。人们是否认为这是更好的进攻路线?仪器无需用户名或密码即可连接。

所以我的问题是,我怎样才能最好地连接到这个仪器(哪个包,telnetlib,asynchat,socket)?

如何避免 telnet 连接被阻塞? (即只能检索一行数据)?

任何建议都将不胜感激,如果这个问题已经得到解答,我深表歉意。

问候

阿曼

ps,抱歉,它不允许我附加所有链接

【问题讨论】:

  • 我知道我有点话题,但你试过 (py)expect 吗?我发现在处理终端时使用起来更容易一些

标签: asynchronous download telnet


【解决方案1】:

谢谢吉姆,

感谢您的提示,我实际上最终选择了套接字模块进行连接,只是因为它似乎提供了更多功能(不是我需要它们)。

我发现我的问题是我没有使用“发送”命令发送回车(正如您所指出的那样。发生的情况是,当您连接到它。这将是我收到的行。但是,当我向其发送“发送”命令时,我从未将 \r 放在末尾,并且该命令未在仪器上执行。

对于其他可能在谷歌上搜索到与他们的维萨拉 PTU300 相关的代码,这里是对我有用的代码(我删去了很多循环,只保留了这个基本的)。请注意,我已将仪器置于停止模式并关闭 ECHO。我还发现检索到的前几行数据是象形文字,我将它们放入一个名为垃圾的变量中。

导入套接字 导入系统

加载配置参数 - 将来从文件中导入

ip = 'xxx.xxx.xxx.xxx'

端口 = 23

s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((ip , 端口))

垃圾 = s.recv(1024)

SMODE 设置为 STOP

s.send('发送\r')

垃圾 = s.recv(1024)

s.send('发送\r')

数据 = s.recv(128)

打印数据

【讨论】:

    【解决方案2】:

    我已经使用 telnetlib 一个多星期了,这里是我可以分享的。

    为避免调用 .read_until 阻塞,请将要等待的秒数作为第二个参数包含在内。就像tn.read_until('C',10) 将等待 10 秒让“C”出现在缓冲区中。如果它在 0.5 秒内找到它,它只会阻塞 0.5 秒。如果在那段时间内没有找到'C',它将返回到目前为止缓冲区中的任何内容,如果没有,则返回''。

    在我的情况下,我连接的设备使用 DOS 样式的换行符,即 '\r\n',所以当我需要发送带有换行符的行时,我必须使用:tn.write('request\r') .

    希望对一些人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-07
      • 2021-10-09
      • 1970-01-01
      • 2017-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多