1

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

我希望有人可以帮助我了解我应该实施哪些模块来做到这一点。我对该主题进行了一些研究,发现这些过去的问题具有一定的相关性(如何使用 python 的 telnetlib 在固定的时间段内从设备获取数据?如何保存 telnet 命令的输出使用python无限时间[关闭])。

我已经开始尝试使用 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() 不返回任何内容。

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

tn.read_until('C')

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

我也尝试过使用

tn.write('发送')

tn.read_until('C')

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

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

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

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

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

问候

阿曼

ps,对不起,它不允许我附上我所有的链接

4

2 回答 2

1

谢谢吉姆,

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

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

对于其他可能在谷歌上搜索到与他们的 Vaisala 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)

打印数据

于 2013-02-14T22:19:35.487 回答
0

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

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

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

希望对一些人有所帮助。

于 2013-02-13T19:48:11.017 回答