Jak mogę monitorować ruch na porcie szeregowym?


40

Czy jest jakieś narzędzie do monitorowania portu do oglądania pakietów zapisanych na porcie? W szczególności chcę sprawdzić, czy mój program napisany w Javie działa, więc potrzebuję jakiegoś narzędzia, aby sprawdzić, czy moja mała aplikacja pisze wiadomości do portu. Jak mam to zrobic?


5
Pakiety nie są zapisywane w porcie. Znaki są. To wcale nie jest jak Ethernet.
— LawrenceC

Odpowiedzi:


17

Znalazłem projekty o nazwach Linux Serial Sniffer , jpnevulator i Moni . Pierwsze dwa wyglądają, jakby robiły dokładnie to, co chcesz. Ten ostatni nazywa się monitorem, ale tak naprawdę wygląda jak standardowy program do komunikacji szeregowej.


1
Dziękuję za to !! spróbuję. przy okazji, rozwiązałem problem ze strony java. brakowało a, więc uniemożliwiło to napisanie mojej wiadomości do portu. dzięki za to i tak !!
— Deepak

3
«LInux Serial Sniffer» jest błędny, absolutnie usuwa przychodzące dane, dlatego inna aplikacja, która w rzeczywistości nasłuchuje numeru seryjnego, nic nie widzi. Ale przynajmniej dane wychodzące na zewnątrz wydają się przebiegać bez problemu.
— Cześć Anioł

3
Z często zadawanych pytań dotyczących jpnevulatora : „Nigdy nie zbudowano Jpnevulatora do umieszczania go między jądrem a aplikacją”.
— Shelvacu

1
Link odnoszący się do Moni jest martwy.
— Yaron,

1
-1 z powodu 3 komentarzy: LInux Serial Sniffer jest błędny , wtedy Jpnevulator nigdy nie został zbudowany, aby siedzieć pomiędzy jądrem a aplikacją i ostatecznie Moni nie żyje ... Ta odpowiedź wskazuje tylko 3 zewnętrzne linki i nie daje prawdziwego rozwiązania. (3 nieudane na 3 łączu, nic nie pozostało!)
— F. Hauri

30

to narzędzie do łączenia (prawie) wszystkiego z (prawie) wszystkim, a może powielać strumienie.
W twoim przypadku możesz podłączyć swój port szeregowy /dev/ttyS0do PTY /tmp/ttyV0, a następnie skierować swoją aplikację do PTY i mieć teegdzieś wejście i wyjście, gdzie możesz je obserwować.

Googling „Socat serial port szeregowy pty tee debugowanie” wskaże Ci kilka przykładów, z których jeden to:

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

Pliki, in.txta out.txtnastępnie będą zawierać przechwycone dane.

Zostało to potwierdzone przez komentujących (@ogurets).


1
Po prostu wypróbowałem i nagrałem zarówno wejście, jak i wyjście. Wersja Socat „1.7.2.4 + sigfix” z pakietów Debian Jessie.
— ogurets

Pomysł jest dobry, ale nawet nie socatmoże proxy połączeń ioctl.
— Peter mówi, że przywróć Monikę

17

Nie sądzę, aby sterownik szeregowy miał jakąkolwiek funkcję śledzenia, która pozwalałaby na oglądanie pakietów. Możesz użyć, straceaby obserwować wszystkie odczyty i zapisy z Twojej aplikacji:

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

1
czy można wysyłać pakiety do portu, jeśli nie jest podłączony unhign?
— Deepak

strace powie ci, czy próbował wysłać znaki do portu, i co zareagowało jądro, gdy próbowało. w zależności od ustawień kontroli przepływu znaki mogą dotrzeć do rozłączonego styku TXD lub nie.
— Jasen

Dzięki, spójrz na moją dynamiczną ścieżkę opartą na tej odpowiedzi!
— F. Hauri

4

interceptty wykonuje tę pracę:

interceptty /dev/ttyACM0 /dev/ttyDUMMY

lub z ładnym formatem wyjściowym i konfiguracją urządzenia zaplecza oraz z buforowaniem linii:

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

a następnie połącz się z programem do /dev/ttyDUMMY.


@AlexStragies: Mam go w moim systemie Linux. Strona AUR: aur.archlinux.org/packages/interceptty , kopia źródeł: repo.j5lx.eu/archive/interceptty/interceptty-0.6.tar.gz
— Golar Ramblar

Musiałem go pobrać (za pomocą wgetponieważ kliknięcie na .tar.gzplik wydawała się jakoś uszkodzony), zainstalować gcci make, a następnie uruchomić ./configurei make install. Robi dokładnie to, czego OP i ja chcemy.
— Graeme Moss

Twoja odpowiedź jest zdecydowanie najlepsza.
— Peter mówi, że przywróć Monikę


3

Spróbuj tego:

screen /dev/tty.usbserial-blahblah 9600

pracuje dla mnie.


25
To otwiera port i przejmuje nad nim kontrolę, więc nic innego nie może z niego korzystać. To nie „monitoruje” ani nie „wącha” ruchu.
— Ian M

3

Tak właśnie wybrałem

Dzięki odpowiedzi Gillesa !

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

Przepraszam, wyjaśnię ...

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;
            };
        };
    '
  • Używam ls -l /proc/[0-9]*/fd/* | grep ttyUSB0zamiast, lsof ttyUSB0ponieważ widziałem je kiedyś powolne.
  • Tak więc strace będzie śledzić bieżący program za pomocą ttyUSB0
  • Składnia: tty${1:-USB0}pozwoli, używane jako skrypt, aby uruchomić następnie z seryjnym nazwy urządzenia jako argument: ttySniff USB0czy ttySniff S0i tak dalej.
  • Skrypt Perla będzie unbackslashrejestrował ciągi znaków strace.

Nota: Uruchamiam je za pomocą, script -taby móc odtworzyć całość i śledzić wykonania czasowe.


Nie ma kwestii bezpieczeństwa dotyczących tego, co może pochodzić z portu szeregowego !
— F. Hauri

Świetnie, działaj dobrze, dzięki!
— techno

1

Spójrz na ttyUSBSpy . Jest na etapie alfa, ale działa.


2
Nie ma Jest napisany w pythonie, a kod importuje niektóre import pcopy, co nawet Google zrezygnował z szukania.
— Cześć Angel

2
Oprogramowanie / strona główna wygląda na opuszczoną. Nie ma go w menedżerach pakietów.
— Alex Stragies

1

minicombrakuje na liście narzędzi do monitorowania portów szeregowych. Użyj go na przykład do słuchania urządzenia arduino:

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


OP napisał „monitor”, ale oznaczał „sniffer” (= jest w stanie odczytać ruch w tranzycie), podczas gdy minicom jest „klientem” portu szeregowego i jako taki nie jest odpowiedzią na to pytanie. Poniższa odpowiedź od Mike'a popełniła ten sam błąd, a komentarz tam wyjaśnia również problem terminologiczny.
— Alex Stragies
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.