ポートに記録されたパケットを監視できるポート監視ツールはありますか?特に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 USB0
。ttySniff S0
- Perlスクリプトは
unbackslash
によって記録された文字列ですstrace -s 9999
。 strace -e read
必要に応じてまたはに置き換えることができますstrace -e read,write
。strace -e write
メモ:次の構文を使用して実行します。
script -t ttySniff.log 2>ttySniff.tm -c "./ttySniff.sh USB0"
これにより、ジョブ全体を再生し、タイミングの実行を追跡できます。