Come posso monitorare il traffico della porta seriale?


40

Esiste uno strumento di monitoraggio delle porte per guardare i pacchetti scritti sulla porta? In particolare, voglio verificare se il mio programma scritto in Java funziona, quindi ho bisogno di un qualche tipo di strumento per vedere se la mia piccola applicazione sta scrivendo i messaggi sulla porta. Come faccio a fare questo?


5
I pacchetti non sono scritti sulla porta. I personaggi lo sono. Non è affatto come Ethernet.
LawrenceC,

1
Domande simili dai siti SE di pari livello: stackoverflow.com/q/940374/12892 e serverfault.com/q/112957/4276
Cristian Ciupitu

Risposte:


17

Ho trovato progetti chiamati Linux Serial Sniffer , jpnevulator e Moni . I primi due sembrano fare esattamente quello che vuoi. L'ultimo si chiama monitor, ma in realtà sembra un normale programma di comunicazione seriale.


1
grazie per quello !! lo proverò. dal modo in cui ho risolto il problema dal mio lato Java. mi mancava un \ r, quindi ciò ha impedito al mio messaggio di scrivere sulla porta. grazie comunque !!
Deepak

3
Il «LInux Serial Sniffer» è difettoso, elimina assolutamente i dati in entrata, quindi un'altra applicazione che in realtà ascolta il seriale non vede nulla. Ma, almeno, i dati che escono sembrano andare senza problemi.
Ciao Angelo

3
Dalle FAQ di jpnevulator : "Jpnevulator non è mai stato creato per stare tra il kernel e l'applicazione".
Shelvacu,

1
Il link che si riferisce a Moni è morto.
Yaron,

1
-1 a causa di 3 commenti: LInux Serial Sniffer è difettoso , quindi Jpnevulator non è mai stato costruito per stare tra kernel e app e alla fine Moni è morto ... Questa risposta indica solo 3 link esterni e non fornisce una soluzione reale. (3 falliscono su 3 link, non hanno lasciato nulla!)
F. Hauri,

30

è uno strumento per connettere (quasi) tutto a (quasi) tutto e può duplicare i flussi.
Nel tuo caso d'uso puoi connettere la tua porta seriale /dev/ttyS0a un PTY /tmp/ttyV0, quindi indirizzare la tua applicazione al PTY e far sì teeche input e output siano collegati da qualche parte per poter essere osservati.

Googling "socat serial port pty tee debug" ti indicherà diversi esempi, uno dei quali:

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

I file in.txte out.txtconterranno quindi i dati acquisiti.

Ciò è stato confermato dal funzionamento dei commentatori (@ogurets).


1
L'ho appena provato e ho registrato sia l'ingresso che l'uscita. Versione Socat "1.7.2.4 + sigfix" dai pacchetti Debian Jessie.
Ogurets,

L'idea è buona, ma non è nemmeno socatpossibile eseguire il proxy delle chiamate ioctl.
Peter dice di reintegrare Monica il

17

Non credo che il driver seriale abbia alcuna funzionalità di traccia che ti consenta di guardare i pacchetti. Puoi usare straceper osservare tutte le letture e le scritture dalla tua applicazione:

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

1
è possibile inviare pacchetti alla porta se nothign è collegato?
Deepak,

strace ti dirà se ha tentato di inviare caratteri alla porta e con cosa ha risposto il kernel quando ha provato. a seconda delle impostazioni di controllo del flusso, i caratteri potrebbero arrivare al pin TXD disconnesso oppure no.
Jasen,

Grazie, dai un'occhiata alla mia dinamica , basata su questa risposta!
F. Hauri,

4

interceptty fa quel lavoro:

interceptty /dev/ttyACM0 /dev/ttyDUMMY

oppure, con un bel formato di output e con la configurazione del dispositivo back-end, e con buffering di linea:

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

e quindi connettiti con il tuo programma a /dev/ttyDUMMY.


@AlexStragies: ce l'ho sul mio sistema Arch Linux. Pagina AUR: aur.archlinux.org/packages/interceptty , copia delle fonti: repo.j5lx.eu/archive/interceptty/interceptty-0.6.tar.gz
Golar Ramblar

Ho dovuto scaricarlo (usando wgetdal momento che il clic sul .tar.gzfile sembrava in qualche modo corromperlo), installare gcce make, quindi eseguire ./configuree make install. Fa esattamente quello che l'OP e io voglio però.
Graeme Moss,

La tua risposta è di gran lunga la migliore.
Peter dice di reintegrare Monica il


3

Prova questo:

screen /dev/tty.usbserial-blahblah 9600

per me va bene.


25
Questo apre la porta e assume il controllo su di essa, quindi nient'altro può usarla. Questo non "monitora" o "annusa" il traffico.
Ian M,

3

Questo è il modo in cui finalmente scelgo

Grazie alla risposta di Gilles !

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

Scusa, ti spiego ...

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;
            };
        };
    '
  • Uso ls -l /proc/[0-9]*/fd/* | grep ttyUSB0invece lsof ttyUSB0perché li ho visti un po 'lenti.
  • Quindi strace traccerà il programma corrente usando ttyUSB0
  • Sintassi: tty${1:-USB0}consentirà, utilizzato come script, di essere eseguito con il nome del dispositivo seriale come argomento: ttySniff USB0o ttySniff S0così via.
  • Lo script Perl eseguirà il unbackslashlog delle stringhe strace.

Nota: li eseguo usando in script -tmodo da poter riprodurre l'intero e tracciare le esecuzioni di temporizzazione.


Non ci sono considerazioni di sicurezza su ciò che potrebbe venire dalla porta seriale !
F. Hauri,

Fantastico, funziona bene, grazie!
techno

1

Dai un'occhiata a ttyUSBSpy . È in fase alfa, ma funziona.


2
Non È scritto in Python e il codice ne importa un po ' import pcopy, cosa che persino Google ha rinunciato a trovare.
Ciao Angelo

2
Software / Homepage sembra abbandonato. Non è nei gestori di pacchetti.
Alex Stragies,

1

minicommanca dall'elenco degli strumenti per monitorare le porte seriali. Usalo come ad esempio per ascoltare il dispositivo Arduino:

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


OP ha scritto "monitor", ma significa "sniffer" (= è in grado di leggere il traffico in transito), mentre minicom è un "client" della porta seriale e come tale non è una risposta a questa domanda. La risposta di seguito di Mike ha fatto lo stesso errore e il commento lì spiega anche il problema della terminologia.
Alex Stragies,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.