結局私はこのように選んだ

結局私はこのように選んだ

ポートに記録されたパケットを監視できるポート監視ツールはありますか?特にJavaで書かれたプログラムが有効であることを確認したいので、私の小さなアプリケーションがポートにメッセージを書き込んでいることを確認するためのツールが必要です。どうすればいいですか?

答え1

(ほぼ)すべてを(ほぼ)すべてに接続するツールです。ストリームをコピーできます。ユースケースでは、シリアルポートを/dev/ttyS0 PTY​​に接続し/tmp/ttyV0、アプリケーションをPTYとして指定してtee観察できるどこかにsocatの入出力を配置できます。

Google検索「socatシリアルポートptyティーデバッグ」は、いくつかの「標準プログラム」の例を示します。そのうちの1つは次のとおりです。

socat  /dev/ttyS0,raw,echo=0  \
    SYSTEM:'tee in.txt | socat - "PTY,link=/tmp/ttyV0,raw,echo=0,waitslave" | tee out.txt'

これらのファイルにはキャプチャされたデータが含まれin.txtます。out.txt

コメント後の更新:

  • socat一見すると構文が混乱しているように見えますが、実際には2つの入れ子になったドアだけです。
    このように強力で汎用性の高いツールに支払うのは小さな価格です。
  • シリアルポートを設定したり別のioctlを送信する必要がある場合は、socatがそれをプロキシできないため、socatを呼び出す前にこれを実行してください。
  • 2006年の単一目的ツールはinterceptty少し簡単な構文を持っていますが、TTY(ioctlsをプロキシしている間)だけを傍受することができ、パッケージマネージャにはないかもしれません。 (ほとんどのLinuxディストリビューションは追加したことがない彼らの倉庫に。 )

答え2

シリアルドライバには、パケットを監視できるトレース機能がないようです。これを使用して、straceアプリケーションのすべての読み取りと書き込みを観察できます。

strace -s9999 -o myapp.strace -eread,write,ioctl ./myapp

答え3

というファイルが見つかりました。Linuxシリアルスニファー和風人工呼吸器モニー(編集:更新されたリンク)。最初の2つは欲しいようです。最後はモニターと呼ばれますが、実際には標準シリアル通信プログラムのように見えます。

答え4

結局私はこのように選んだ

ありがとうザイルズの答え

strace -s 9999 -e read -ffp $(sed '/ttyUSB0/s/^.*proc.\([0-9]\+\).fd.*/\1/p;d' <(ls -l /proc/[1-9]*/fd/* 2>/dev/null)) |& perl -e '$|=1;my %qa=(a=>7,b=>10,e=>33,f=>14,n=>12,r=>15,t=>11);sub cnv { my $ch=$_[0];$ch=$qa{$1} if $ch=~/([abefnrt])/;return chr(oct($ch));  };while (<>) { /^read.\d+,\s+"(.*)",\s\d+.*$/ && do { $_=$1;s/\\(\d+|[abefnrt])/cnv($1)/eg;print; };};'

すみません、説明します...

#!/bin/bash

strace -s 9999 -e read -ffp $(
    sed "/tty${1:-USB0}/s/^.*proc.\([0-9]\+\).fd.*/\1/p;d" <(
        ls -l /proc/[1-9]*/fd/* 2>/dev/null
    )
) 2>&1 |
    perl -e '
        $|=1;
        my %qa=(a=>7,b=>10,e=>33,f=>14,n=>12,r=>15,t=>11);
        sub cnv {
            my $ch=$_[0];
            $ch=$qa{$1} if $ch=~/([abefnrt])/;
            return chr(oct($ch));
        };
        while (<>) {
            /^read.\d+,\s+"(.*)",\s\d+.*$/ && do {
                $_=$1;
                s/\\(\d+|[abefnrt])/cnv($1)/eg;
                print;
            };
        };
    '
  • 時々スピードが遅くなるのを見るのでls -l /proc/[0-9]*/fd/* | grep ttyUSB0代わりに使います。lsof ttyUSB0
  • したがって、straceは次のようにして現在のプログラムを追跡します。ttyUSB0
  • 構文:tty${1:-USB0}スクリプトまたは関数として使用でき、シリアルデバイス名を引数として使用して実行できますttySniff USB0ttySniff S0
  • Perlスクリプトはunbackslashによって記録された文字列ですstrace -s 9999
  • strace -e read必要に応じてまたはに置き換えることができますstrace -e read,writestrace -e write

メモ:次の構文を使用して実行します。

 script -t ttySniff.log 2>ttySniff.tm -c "./ttySniff.sh USB0"

これにより、ジョブ全体を再生し、タイミングの実行を追跡できます。

関連情報