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.