web-dev-qa-db-ja.com

シリアルポートトラフィックを監視するにはどうすればよいですか?

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

45
Deepak

Linux Serial Snifferjpnevulator 、および Moni というプロジェクトが見つかりました。最初の2つは、期待どおりの動作をするように見えます。最後のものはそれ自体をモニターと呼びますが、実際には標準のシリアル通信プログラムのように見えます。

17
Shawn J. Goff

socat は(ほぼ)すべてを(ほぼ)すべてに接続するツールであり、 tee はストリームを複製できます。
ユースケースでは、シリアルポートを接続できます/dev/ttyS0からPTYへ/tmp/ttyV0、次にアプリケーションにPTYを指定し、どこかにsocat tee out入力と出力を確認してもらいます。

「socat serial port pty tee debug」をグーグルすると、いくつかの例が示されます。

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には、キャプチャされたデータが含まれます。

これはコメンター(@ogurets)によって動作することが確認されています。

31
Alex Stragies

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

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

これが最終的に選択した方法です

おかげで ギレスの答え

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

説明します...

#!/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スクリプトはstrace -s 9999によってログに記録されるunbackslash文字列です。
  • 必要に応じて、strace -e readstrace -e read,writeまたはstrace -e writeに置き換えることができます。

注:構文を使用して実行します:

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

そのため、操作全体を再生し、タイミング実行をトレースできました。

5
F. Hauri

interceptty その仕事をします:

interceptty /dev/ttyACM0 /dev/ttyDUMMY

または、Nice出力形式とバックエンドデバイスの構成、およびラインバッファリングを使用します。

interceptty -s 'ispeed 19200 ospeed 19200' -l /dev/ttyACM0 /dev/ttyDUMMY | interceptty-nicedump

次に、プログラムを使用して/dev/ttyDUMMYに接続します。

5
Golar Ramblar

アプリケーションとシリアルポートの相互作用をデバッグするときは、 moserial を使用します。

3
Renat Zaripov

これを試して:

screen /dev/tty.usbserial-blahblah 9600

私のために働く。

3
Mike

シリアルポートを監視するツールのリストにminicomがありません。たとえば、arduinoデバイスを聞くために使用します。

minicom --device /dev/ttyACM0 --baud 9600

2
B.Kocis

ttyUSBSpy をご覧ください。アルファ段階ですが、動作します。

1
user37414
0