포트에 기록된 패킷을 관찰할 수 있는 포트 모니터링 도구가 있습니까? 특히 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"
이렇게 하면 전체 작업을 재생하고 타이밍 실행을 추적할 수 있습니다.