我想编写一些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通过以下命令连接到乐器
导入sys
导入telnetlib
host ='xxx.xxx.xxx.xxx'
TN = telnetlib.Telnet(主机)
tn.open
tn.write( 'R')
tn.read_very_eager()
这会导致读取一行数据
e.g。
2000-01-06 23:43:04 P = 980.0 T = -4.3'C \ r \ n&n; r
然而后续的tn.read_very_eager()不会返回任何内容。
我在这个读取命令上尝试过不同的[变种] [4],例如
tn.read_until('C')
但任何后续的读取都不会返回任何内容。我相信可能会出现一些“阻塞”?不是我真的知道那是什么。
我还尝试使用
请求一次阅读tn.write( '发送')
tn.read_until( 'C')
但这只会返回一个读数,后续读取将不返回任何内容。
过去使用[asynchat] [6]或[socket] [7]模块建议过去的stackoverflow问题的[一] [5]来执行这种操作。我还没有尝试过使用它们。人们认为这是一个更好的攻击线吗?仪器不需要用户名或密码即可连接。所以我的问题是,我怎样才能最好地连接到这个乐器(哪个包,telnetlib,asynchat,socket)?
如何避免telnet连接被阻止? (即只能检索一行数据)?
任何建议都将不胜感激,如果这个问题已经得到解答,我会道歉。
此致
阿曼
ps,抱歉它不允许我附上我的所有链接
答案 0 :(得分:1)
谢谢Jim,
感谢您的提示,我实际上最终会使用socket模块进行连接,因为它似乎提供了更多功能(不是我需要它们)。
我发现我的问题是我没有发送带有“发送”命令的回车(正如你所指出的那样。发生的事情是当你连接到系统时系统会输出一行测量值这就是我收到的那条线。但是当我向它发送一个“发送”命令时,我从未将\ r \ n放在最后,并且没有在仪器上执行命令。
对于那些可能谷歌这个与他们的维萨拉PTU300相关的人来说,这里的代码对我有用(我删除了很多循环并保持这个基本)。请注意,我已将操作置于STOP模式并关闭ECHO。我还发现检索到的前几行数据是象形文字,我把它们扔进一个叫做垃圾的变量中。
导入套接字 import sys
加载配置参数 - 将来从文件中导入
ip ='xxx.xxx.xxx.xxx'
port = 23
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((ip,port))
garbage = s.recv(1024)
SMODE设置为STOP
s.send('send \ r')
garbage = s.recv(1024)
s.send( '发送\ R')
data = s.recv(128)
打印数据
答案 1 :(得分:0)
我已经使用telnetlib一个多星期了,这就是我可以分享的内容。
要避免调用.read_until阻塞,请包括作为第二个参数等待的秒数。像tn.read_until('C',10)
一样,等待10秒,'C'将显示在缓冲区中。如果它在0.5秒内找到它,它将仅阻止0.5秒。如果它在那段时间内没有找到'C',它将返回到目前为止缓冲区中的任何内容,或者''如果没有任何内容。
在我的情况下,我连接的设备使用DOS风格的换行符,即'\ r \ n',所以当我需要发送换行符时,我必须使用:{{1 }}
希望有所帮助。