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?


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.


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.


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

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.


@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

Versuche dies:

screen /dev/tty.usbserial-blahblah 9600

funktioniert bei mir.


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.


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.


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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.