1

ヴァイサラ PTU300という圧力センサーからデータをダウンロードするための Python コードを書きたいと思います。このセンサーはルーターに接続し、telnet セッションを介して接続できます。このセッションでは、単純なコマンドが要求に応じてデータを吐き出すか、連続したデータ ストリームを吐き出すことができます。マニュアルの 94 ページには、機器に送信できるコマンドがリストされています。私はPythonにはまったく慣れていませんが、Fortranでのプログラミング経験があるので、プログラミング言語の構造を理解しています。

これを行うためにどのモジュールを実装する必要があるかについて、誰かが私を助けてくれることを望んでいました。このトピックについて少し調査したところ、関連するこれらの過去の質問が見つかりました ( How can I use python's telnetlib to fetch data from a device for a fixed period of a device? , How to save the output of a telnet command by Python を無限に使用する [終了] )。

次のコマンドを使用して、telnetlib を使用して機器に接続しようと試み始めました。

システムをインポート

telnetlib をインポート

ホスト = 'xxx.xxx.xxx.xxx'

tn=telnetlib.Telnet(ホスト)

tn.open

tn.write('r')

tn.read_very_eager()

これにより、1 行のデータが読み取られます。

例えば

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')

しかし、これは 1 つの読み取り値のみを返し、その後の読み取りは何も返しません。

[1][5] 過去のスタックオーバーフローの質問で、[asynchat][6] または [socket][7] モジュールを使用してこの種のアクションを実行することが提案されました。私はまだそれらを使用してみませんでした。人々はこれがより良い攻撃方法だと思いますか? 機器に接続するためにユーザー名やパスワードは必要ありません。

だから私の質問は、どうすればこの楽器に最適に接続できますか(どのパッケージ、telnetlib、asynchat、ソケット)?

telnet 接続がブロックされないようにするにはどうすればよいですか? (つまり、1 行のデータしか取得できない)?

アドバイスをいただければ幸いです。この質問が既に回答されている場合はお詫びします。

よろしく

オマーン

ps、申し訳ありませんが、すべてのリンクを添付することはできません

4

2 に答える 2

1

ありがとうジム、

ヒントのおかげで、私は実際にソケットモジュールを接続することになりました。それは、より多くの機能を提供しているように見えたからです(私がそれらを必要としているわけではありません)。

私の問題は、「送信」コマンドでキャリッジリターンを送信していないことであることがわかりました(ご指摘のとおり。システムに接続すると、システムが1行の測定値を出力することが発生していました。これ私が受け取った行になります。しかし、「送信」コマンドを送信したとき、\ rを最後に置くことはなく、コマンドは機器で実行されませんでした。

ヴァイサラPTU300に関連してこれをグーグルで検索する可能性のある他の人のために、ここに私のために機能するコードがあります(私は多くのループを切り取り、これを基本的に保ちました)。機器をSTOPモードにして、ECHOをオフにしたことに注意してください。また、取得されたデータの最初の数行が象形文字であることがわかり、それらをガベージと呼ばれる変数に入れました。

import socket import 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('send \ r')

ごみ=s.recv(1024)

s.send('send \ r')

データ=s.recv(128)

データを印刷する

于 2013-02-14T22:19:35.487 に答える
0

私は telnetlib を 1 週間ほど使用してきました。

.read_until の呼び出しをブロックしないようにするには、待機する秒数を 2 番目の引数として含めます。Liketn.read_until('C',10)は、'C' がバッファに表示されるまで 10 秒間待機します。0.5 秒で見つかった場合、0.5 秒間だけブロックします。その時間内に 'C' が見つからない場合は、それまでにバッファーにあったものを返すか、何もない場合は '' を返します。

私の場合、接続しているデバイスは '\r\n' である DOS スタイルの改行を使用するため、改行を含む行を送信する必要がある場合は、: を使用する必要がありますtn.write('request\r')

それがいくつか役立つことを願っています。

于 2013-02-13T19:48:11.017 に答える