결국 나는 이렇게 선택했다

결국 나는 이렇게 선택했다

포트에 기록된 패킷을 관찰할 수 있는 포트 모니터링 도구가 있습니까? 특히 Java로 작성된 프로그램이 유효한지 확인하고 싶으므로 내 작은 응용 프로그램이 포트에 메시지를 쓰고 있는지 확인하는 도구가 필요합니다. 어떻게 해야 하나요?

답변1

(거의) 모든 것을 (거의) 모든 것에 연결하는 도구입니다.스트림을 복사할 수 있습니다. 사용 사례에서는 직렬 포트를 /dev/ttyS0 PTY에 연결한 /tmp/ttyV0다음 애플리케이션을 PTY로 지정하고 tee관찰할 수 있는 어딘가에 socat 입력 및 출력을 둘 수 있습니다.

구글 검색"socat 직렬 포트 pty 티 디버깅"은 여러 "표준 프로그램" 예제를 알려줍니다. 그 중 하나는 다음과 같습니다.

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언뜻 보면 구문이 혼란스러워 보이지만 실제로는 두 개의 중첩된 문일 뿐입니다.
    이처럼 강력하고 다재다능한 도구에 대해 지불하는 것은 작은 가격입니다.
  • 직렬 포트를 설정하거나 다른 ioctl을 보내야 하는 경우 socat가 이를 프록시할 수 없으므로 socat를 호출하기 전에 이 작업을 수행하십시오.
  • 2006년의 단일 목적 도구는 interceptty약간 더 간단한 구문을 가지고 있지만 TTY(ioctls를 프록시하는 동안)만 가로챌 수 있으며 패키지 관리자에 없을 수도 있습니다. (대부분의 Linux 배포판은추가한 적 없음그들의 창고로. )

답변2

직렬 드라이버에는 패킷을 모니터링할 수 있는 추적 기능이 없는 것 같습니다. 이를 사용하여 strace애플리케이션의 모든 읽기 및 쓰기를 관찰할 수 있습니다.

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

답변3

라는 파일을 찾았습니다.리눅스 시리얼 스니퍼,일본식 인공호흡기, 그리고모니(편집: 업데이트된 링크). 처음 두 개는 원하는 것 같습니다. 마지막 것은 모니터라고 부르지만 실제로는 표준 직렬 통신 프로그램처럼 보입니다.

답변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"

이렇게 하면 전체 작업을 재생하고 타이밍 실행을 추적할 수 있습니다.

관련 정보