ptyを作成し、シリアルポート/ dev / ttyUSB0に接続します。

ptyを作成し、シリアルポート/ dev / ttyUSB0に接続します。

質問:

シリアルインタフェースを介して2つのLinuxシステムが接続されています。私はそれら間の通信にpppを使用します(プロジェクトの要件であるため、これを行う必要があります)。通信速度は9600ビット/秒です。リアルタイムで使用される帯域幅(ビット/秒)、つまりシステムの実行中の帯域幅を測定する必要があります。最初はifstat -btwTWS -i ppp0このツールを使用するように設計されていたので、使用すると思いました。ただし、表示された値は9600ビット/秒をはるかに超えています。約12.09Kbits/sを振り回しています。私は尋ねた。なぜこれが起こるのですか?、応答は圧縮によるものかもしれません。これは意味があります。しかし、私にとって必要なのは、圧縮後と解凍が発生する前の実際のビット/秒です。

この問題に対する私の最初の解決策は次のとおりです。

最初は、データレートを表示できる一種のシリアルトラフィックスニファを使用したかったのです。いくつか試しましたが、接続を試みるたびに/dev/ttyUSB0リソースの使用中にエラーが発生します。これは、PPP がデバイスを引き継ぐために発生します。

この問題を解決する2番目の方法は次のとおりです。

擬似シリアルポートを作成して実際のシリアルポートに接続したいと思います。その後、PPPは偽のシリアルポートを引き継ぎ、実際のシリアルポートのトラフィックをスニッフィングします。チャートは次のとおりです。

--------------------         -------------------------  
|                  |         |                       |
|      PPP         |         |        sniffer        |
|  -------------   |         |   ------------------  |              
|  | /dev/pty0 |---|---------|---|  /dev/ttyUSB0  |  |
|  -------------   |         |   ------------------  |
|                  |         |                       |
--------------------         -------------------------

私の理解はsocatこれが可能であるということです。この記事を読んでいますが、これを行うためのオプションが見つかりませんでした。

私の質問は次のとおりです。

socatを使用して疑似端末を作成し、実際のシリアルポートに接続する方法は?可能ですか?

ベストアンサー1

socat次の簡単なコマンドを使用できるはずです。

socat pty,link=$HOME/myserial,rawer /dev/ttyUSB0,rawer 2>&1

~/myserialこれにより、ptyへのシンボリックリンクが作成され、ptyへのすべてのi / oがシリアルポートにコピーされるか、シリアルポートからコピーされます。さらにステップを進め、-vI/O を stderr にコピーし、次の-x形式のヘッダー行を使用して 16 進数で印刷するオプションを追加できます。

< 2019/01/12 18:16:36.528942  length=12 from=310 to=321

ここで、最初の文字は方向<で、>長さはコピーされたバイト数です。 16進数を使用すると、ヘッダー行は元のデータと混同されません。以下は、これを解析できるawkスクリプトです。約10秒ごとに1方向に1秒あたりの現在のバイト数を記録します。

socat -v -x pty,link=$HOME/myserial,rawer /dev/ttyUSB0,rawer 2>&1  |
awk '
 /^[><]/{ split($3,x,":"); tod = (x[1]*60+x[2])*60+x[3]; 
          split($4,x,"="); len = x[2]+0; 
          dir = $1=="<" ? "rx" : "tx";
          if(tod-lasttod[dir]>=10){
            printf "%s %f\n",dir,(len+tot[dir])/(tod-lasttod[dir])
            lasttod[dir] = tod
            tot[dir] = 0
          }else tot[dir] += len
}'

簡単にするために、各方向は別々に処理され、時間を真夜中に固定する必要があります。一般的な出力は次のとおりです。

tx 2.398754
rx 0.000425
tx 2.398772
rx 61.768501

おすすめ記事