Wie kann ich den Datenverkehr über die serielle Schnittstelle überwachen?

40

Gibt es ein Portüberwachungstool, um die auf dem Port geschriebenen Pakete zu überwachen? Ich möchte vor allem prüfen, ob mein in Java geschriebenes Programm funktioniert. Daher benötige ich ein Tool, um festzustellen, ob meine kleine Anwendung die Nachrichten an den Port schreibt. Wie mache ich das?

Deepak
quelle
5
Pakete sind nicht auf den Port geschrieben. Charaktere sind. Es ist überhaupt nicht wie Ethernet.
LawrenceC
1
Ähnliche Fragen von SE-Websites für Geschwister: stackoverflow.com/q/940374/12892 und serverfault.com/q/112957/4276
Cristian Ciupitu

Antworten:

17

Ich habe Projekte namens Linux Serial Sniffer , jpnevulator und Moni gefunden . Die ersten beiden machen genau das, was Sie wollen. Der letzte nennt sich Monitor, sieht aber aus wie ein Standardprogramm für serielle Kommunikation.

Shawn J. Goff
quelle
1
Dank dafür !! Ich werde es versuchen. Übrigens habe ich das Problem von meiner Java-Seite aus gelöst. Mir fehlte ein \ r, so dass meine Nachricht nicht an den Port geschrieben werden konnte. trotzdem danke dafür !!
Deepak
3
Der «LInux Serial Sniffer» ist fehlerhaft, er nimmt absolut eingehende Daten heraus, somit sieht eine andere Anwendung, die eigentlich seriell zuhört, nichts. Aber zumindest die Daten, die nach draußen gehen, scheinen problemlos zu gehen.
Hi-Angel
3
Aus der FAQ zu jpnevulator : "Jpnevulator wurde nie so erstellt, dass es zwischen dem Kernel und Ihrer Anwendung liegt."
Shelvacu
1
Der Link zu Moni ist tot.
Yaron
1
-1 wegen 3 Kommentaren: LInux Serial Sniffer ist fehlerhaft , dann wurde Jpnevulator nie gebaut, um zwischen Kernel und App zu sitzen und schließlich ist Moni tot ... Diese Antwort zeigt nur auf 3 externe Links und gibt keine echte Lösung. (3 Fehler auf 3 Link, nichts übrig!)
F. Hauri
30

ist ein Werkzeug, um (fast) alles mit (fast) allem zu verbinden, und kann Streams duplizieren.
In Ihrem Anwendungsfall können Sie Ihren seriellen Anschluss /dev/ttyS0mit einem PTY verbinden /tmp/ttyV0, dann Ihre Anwendung auf den PTY richten teeund die Ein- und Ausgänge an einer für Sie beobachtbaren Stelle ausgeben .

Wenn Sie "socat serial port pty tee debug" googeln, werden Sie auf einige Beispiele hingewiesen, von denen eines ist:

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

Die Dateien in.txtund out.txtenthalten dann die erfassten Daten.

Dies wurde von Kommentatoren (@ogurets) als funktionierend bestätigt.

Alex Stragies
quelle
1
Habe es einfach ausprobiert und habe sowohl Input als auch Output aufgezeichnet. Socat-Version "1.7.2.4 + sigfix" aus Debian Jessie-Paketen.
Ogurets
Die Idee ist gut, aber nicht einmal socatProxy-ioctl-Aufrufe können.
Peter sagt, Monica
17

Ich glaube nicht, dass der serielle Treiber über Tracing-Funktionen verfügt, mit denen Sie Pakete überwachen können. Sie können verwenden strace, um alle Lese- und Schreibvorgänge in Ihrer Anwendung zu beobachten:

strace -s9999 -o myapp.strace -eread,write,ioctl ./myapp
Gilles 'SO - hör auf böse zu sein'
quelle
1
Kann ich Pakete an den Port senden, wenn nothign verbunden ist?
Deepak
strace teilt Ihnen mit, ob es versucht hat, Zeichen an den Port zu senden, und wie der Kernel darauf reagiert hat, als es versucht hat. Abhängig von Ihren Einstellungen für die Flusskontrolle können Zeichen am nicht verbundenen TXD-Pin ankommen oder nicht.
Jasen
Danke, schau dir meine dynamische Spannung an , basierend auf dieser Antwort!
F. Hauri
4

interceptty erledigt diese Arbeit:

interceptty /dev/ttyACM0 /dev/ttyDUMMY

oder mit einem netten Ausgabeformat und mit Konfiguration des Backend-Geräts und mit Zeilenpufferung:

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

und verbinden Sie sich dann mit Ihrem Programm zu /dev/ttyDUMMY.

Golar Ramblar
quelle
@AlexStragies: Ich habe es auf meinem Arch-Linux-System. AUR-Seite: aur.archlinux.org/packages/interceptty , Kopie der Quellen: repo.j5lx.eu/archive/interceptty/interceptty-0.6.tar.gz
Golar Ramblar
Ich musste es herunterladen (mit, wgetda das Klicken auf die .tar.gzDatei irgendwie beschädigt zu sein schien), installieren gccund makedann ausführen ./configureund make install. Tut genau das, was der OP und ich wollen.
Graeme Moss
Ihre Antwort ist bei weitem die beste.
Peterh sagt, Monica
3

Wenn ich die Interaktion meiner Anwendung mit einer seriellen Schnittstelle debugge , verwende ich moserial .

Renat Zaripov
quelle
5
Wovon redest du? In den Dokumenten ist es nur ein Terminal.
Hallo-Engel
3

Versuche dies:

screen /dev/tty.usbserial-blahblah 9600

funktioniert bei mir.

Mike
quelle
25
Dadurch wird der Port geöffnet und die Kontrolle über ihn übernommen, sodass nichts anderes darauf zugreifen kann. Dies "überwacht" oder "schnüffelt" nicht den Verkehr.
Ian M
3

Dies ist der Weg, den ich schließlich wähle

Dank Gilles Antwort !

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

Entschuldigung, ich werde erklären ...

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;
            };
        };
    '
  • Ich benutze ls -l /proc/[0-9]*/fd/* | grep ttyUSB0stattdessen, lsof ttyUSB0weil ich sie manchmal langsam gesehen habe.
  • So verfolgt strace das aktuelle Programm mit ttyUSB0
  • Syntax: tty${1:-USB0}Ermöglicht, als Skript verwendet, die Ausführung mit dem seriellen Gerätenamen als Argument: ttySniff USB0oder ttySniff S0so weiter.
  • Perl-Skript wird unbackslashZeichenfolgen von protokolliert strace.

Nota: Ich starte sie mit, script -tdamit ich das Ganze nachvollziehen und Timing-Ausführungen verfolgen kann.

F. Hauri
quelle
Es gibt keine Sicherheitsüberlegungen darüber, was über die serielle Schnittstelle kommen könnte !
F. Hauri
Super, funktioniert gut, danke!
Techno
1

Schauen Sie sich ttyUSBSpy an . Es ist auf der Alpha-Bühne, aber es funktioniert.

user37414
quelle
2
Das tut es nicht. Es ist in Python geschrieben und der Code importiert einige import pcopy, die sogar Google aufgegeben hat, um zu finden.
Hallo-Engel
2
Software / Homepage sieht verlassen aus. Ist nicht in Paketmanagern.
Alex Stragies
1

minicomfehlt in der Liste der Tools zur Überwachung der seriellen Schnittstellen. Verwenden Sie es zum Beispiel, um ein Arduino-Gerät anzuhören:

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

B.Kocis
quelle
OP schrieb "monitor", meinte aber "sniffer" (= kann Datenverkehr während der Übertragung lesen), während minicom ein "Client" für die serielle Schnittstelle ist und daher keine Antwort auf diese Frage ist. Die Antwort unten von Mike machte den gleichen Fehler, und der Kommentar dort erklärt auch das Terminologieproblem.
Alex Stragies