직렬 포트 트래픽을 어떻게 모니터링 할 수 있습니까? 쓰여진 패킷을 감시하는

포트에 쓰여진 패킷을 감시하는 포트 모니터링 도구가 있습니까? 특히 Java로 작성된 프로그램이 작동하는지 확인하고 싶습니다. 작은 응용 프로그램이 포트에 메시지를 쓰고 있는지 확인하려면 일종의 도구가 필요합니다. 어떻게해야합니까?



답변

Linux Serial Sniffer , jpnevulatorMoni 라는 프로젝트를 찾았습니다 . 처음 두 가지는 그들이 원하는 것을 정확하게하는 것처럼 보입니다. 마지막은 모니터 자체를 호출하지만 실제로는 표준 직렬 통신 프로그램처럼 보입니다.


답변

은 (거의) 모든 것을 (거의) 모든 것에 연결하는 도구이며, 는 스트림을 복제 할 수 있습니다.
유스 케이스에서 직렬 포트 /dev/ttyS0를 PTY /tmp/ttyV0에 연결 한 다음 애플리케이션을 PTY로 지정하고 tee관찰 할 수있는 입력 및 출력을 배치 할 수 있습니다.

인터넷 검색 “socat 직렬 포트 pty tee 디버그”는 다음과 같은 몇 가지 예를 보여줍니다.

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

파일은 in.txtout.txt다음 캡처 된 데이터가 포함됩니다.

이는 주석 작성자 (@ogurets)가 작동하는 것으로 확인되었습니다.


답변

직렬 드라이버에는 패킷을 볼 수있는 추적 기능이 없다고 생각합니다. strace애플리케이션에서 모든 읽기 및 쓰기를 관찰 하는 데 사용할 수 있습니다 .

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


답변

interceptty 그 일을합니까 :

interceptty /dev/ttyACM0 /dev/ttyDUMMY

또는 출력 형식이 좋고 백엔드 장치를 구성하고 라인 버퍼링을 사용하는 경우 :

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

그런 다음 프로그램과 연결하십시오 /dev/ttyDUMMY.


답변

내 응용 프로그램과 직렬 포트의 상호 작용을 디버깅 할 때 moserial을 사용 합니다 .


답변

이 시도:

screen /dev/tty.usbserial-blahblah 9600

나를 위해 작동합니다.


답변

이것이 내가 마침내 선택하는 방법입니다

Gilles의 답변에 감사합니다 !

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

죄송합니다. 설명하겠습니다.

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냅니다.

참고 : script -t전체를 재생하고 타이밍 실행을 추적 할 수 있도록 사용하여 실행합니다.