2013-02-07 35 views
1

我想寫一些python代碼來從我們的壓力傳感器下載數據,一個Vaisala PTU300。這個傳感器連接到我們的路由器,可以通過telnet會話聯繫,簡單的命令根據請求吐出數據,或者它可以吐出連續的數據流。本手冊的第94頁列出了您可以發送到儀器的命令。我對python很陌生,但是在Fortran中有一定的編程經驗,所以瞭解一些編程語言的結構。用Python telnet下載儀器數據

我希望有人能幫我一些關於我應該實現的模塊的一些想法。我對這個主題做了一些研究,發現了一些與以前相關的問題(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

主機=「xxx.xxx.xxx.xxx」玩

TN = telnetlib.Telnet(主機)

tn.open

tn.write( 'R')

tn.read_very_eager()

這導致數據的一行被讀

例如

2000年1月6日23時43分04秒P = 980.0 T = -4.3「C \ r \ N>ř

然而後續tn.read_very_eager()不返回任何東西。

我在這個讀取命令上嘗試了不同的[變化] [4],例如,

tn.read_until( 'C')

但任何後續讀取不會返回任何東西。我相信一些「阻塞」可能正在發生?不是我真的知道那是什麼。

我也曾嘗試使用請求

tn.write( '發送')

tn.read_until( 'C')

只是一個閱讀但這將只返回一個閱讀和後續讀取將不會返回。

[One] [5]過去使用[asynchat] [6]或[socket] [7]模塊進行這種操作的stackoverflow問題。我還沒有嘗試過使用它們。人們認爲這是一個更好的攻擊線嗎?該儀器不需要用戶名或密碼即可連接。

所以我的問題是,我怎樣才能最好地連接到這臺儀器(哪些包,telnetlib,asynchat,套接字)?

如何避免telnet連接被阻止? (即只能夠檢索一行數據)?

任何意見將不勝感激,我appologise,如果這個問題已被回答。

問候

阿曼

PS,對不起它不會讓我附上我的所有鏈接

+0

我知道我有點話題,但你有沒有試過(py)期望?在處理終端時,我發現它更容易使用 –

回答

0

我一直在使用telnetlib一個多星期了,這裏就是我可以分享。

爲避免調用.read_until阻塞,請包含等待秒數作爲秒數的秒數。像tn.read_until('C',10)將等待10秒鐘'C'出現在緩衝區中。如果它在0.5秒內發現它,它將僅阻塞0.5秒。如果在那段時間內沒有找到'C',它將返回到目前爲止緩衝區中的任何內容,如果沒有任何內容,則返回''。

在我的情況下,我連接的設備使用DOS風格的換行符'\ r \ n',所以當我需要用換行符發送一行時,我必須使用:tn.write('request\r')

希望有助於一些。

1

感謝吉姆,

感謝您的提示,我居然結束了與插座模塊要連接,只是因爲它似乎提供了更多的功能(不,我需要他們)。

我發現我的問題是我沒有用我的「發送」命令發送回車符(正如您已經指出的那樣,發生了什麼事是系統會在連接時輸出一行測量值但是當我發送一個「發送」命令給它時,我從來沒有把\ r放在最後,命令也沒有在樂器上執行過。這與他們的維薩拉PTU300有關,這裏是我工作的代碼(我剪掉了很多的循環,並保持這個基本),注意我已經把儀器置於停止模式並關閉了ECHO,我也發現前幾行檢索到的數據是象形文字,我把它們扔到一個叫垃圾的變量中。

進口插座 進口SYS

負載配置參數 - 從文件中將來導入

IP = 'xxx.xxx.xxx.xxx'

端口= 23

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

s.connect((ip,port))

垃圾= s.recv(1024)

SMODE設置爲STOP

s.send( '發送\ R')

垃圾= s.recv(1024)

小號.send('send \ r')

data = s。recv(128)

打印數據