¿Cómo puedo monitorear el tráfico del puerto serie?


40

¿Existe alguna herramienta de monitoreo de puertos para ver los paquetes escritos en el puerto? Especialmente quiero verificar si mi programa escrito en Java funciona, así que necesito algún tipo de herramienta para ver si mi pequeña aplicación está escribiendo los mensajes en el puerto. ¿Cómo hago esto?


55
Los paquetes no están escritos en el puerto. Los personajes son No es como Ethernet en absoluto.
LawrenceC

1
Preguntas similares de los sitios hermanos SE: stackoverflow.com/q/940374/12892 y serverfault.com/q/112957/4276
Cristian Ciupitu

Respuestas:


17

Encontré proyectos llamados Linux Serial Sniffer , jpnevulator y Moni . Parece que los dos primeros hacen exactamente lo que quieres. El último se llama a sí mismo un monitor, pero en realidad se parece a un programa de comunicación en serie estándar.


1
gracias por eso !! Voy a darle una oportunidad. Por cierto, resolví el problema desde mi lado de Java. me faltaba un \ r, así que eso evitó que mi mensaje se escribiera en el puerto. gracias por eso de todos modos !!
Deepak

3
El «LInux Serial Sniffer» tiene errores, elimina absolutamente los datos entrantes, por lo tanto, otra aplicación que realmente escucha en serie no ve nada. Pero, al menos, los datos que salen parecen ir sin problemas.
Hola Ángel

3
De las preguntas frecuentes de jpnevulator : "Jpnevulator nunca se creó para ubicarse entre el núcleo y su aplicación".
Shelvacu

1
El enlace que se refiere a Moni está muerto.
Yaron

1
-1 debido a 3 comentarios: LInux Serial Sniffer tiene errores , entonces Jpnevulator nunca fue creado para ubicarse entre el kernel y la aplicación y finalmente Moni está muerto ... Esta respuesta solo apunta a 3 enlaces externos y no da una solución real. (3 fallan en 3 enlaces, ¡no dejó nada!)
F. Hauri

30

es una herramienta para conectar (casi) todo a (casi) todo, y puede duplicar transmisiones.
En su caso de uso, puede conectar su puerto serie /dev/ttyS0a un PTY /tmp/ttyV0, luego apuntar su aplicación al PTY y obtener teeentradas y salidas en algún lugar para que las observe.

Buscar en Google "socat serial port pty tee debug" te mostrará varios ejemplos, uno de ellos es:

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

Los archivos in.txty out.txtluego contendrán los datos capturados.

Esto ha sido confirmado para trabajar por comentaristas (@ogurets).


1
Solo lo probé y grabé tanto la entrada como la salida. Versión de Socat "1.7.2.4 + sigfix" de los paquetes de Debian Jessie.
ogurets

La idea es buena, pero ni siquiera socatpuede hacer llamadas proxy ioctl.
Peter dice reinstalar a Mónica el

17

No creo que el controlador en serie tenga ninguna funcionalidad de rastreo que le permita ver paquetes. Puede usar stracepara observar todas las lecturas y escrituras de su aplicación:

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

1
¿Se pueden enviar paquetes al puerto si no está conectado?
Deepak

strace le dirá si intentó enviar caracteres al puerto y con qué respondió el núcleo cuando lo intentó. dependiendo de la configuración de control de flujo, los caracteres pueden llegar al pin TXD desconectado o no.
Jasen

¡Gracias, eche un vistazo a mi dinámica , basada en esta respuesta!
F. Hauri

4

interceptty hace ese trabajo:

interceptty /dev/ttyACM0 /dev/ttyDUMMY

o, con un buen formato de salida y con la configuración del dispositivo de fondo, y con el almacenamiento en línea de la memoria intermedia:

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

y luego conéctese con su programa a /dev/ttyDUMMY.


@ AlexStragies: lo tengo en mi sistema Arch Linux. Página de AUR: aur.archlinux.org/packages/interceptty , copia de las fuentes: repo.j5lx.eu/archive/interceptty/interceptty-0.6.tar.gz
Golar Ramblar

Tenía que descargarlo (usando wgetya hacer clic en el .tar.gzarchivo corrupto parecía que de alguna manera), la instalación gccy make, a continuación, ejecutar ./configurey make install. Sin embargo, hace exactamente lo que el OP y yo queremos.
Graeme Moss

Tu respuesta es la mejor.
Peter dice reinstalar a Mónica el


3

Prueba esto:

screen /dev/tty.usbserial-blahblah 9600

funciona para mi.


25
Esto abre el puerto y asume el control sobre él, por lo que nada más puede usarlo. Esto no "supervisa" ni "olfatea" el tráfico.
Ian M

3

Esta es la forma en que finalmente elijo

Gracias a la respuesta de 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; };};'

Lo siento, te lo explicaré ...

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;
            };
        };
    '
  • Lo uso en ls -l /proc/[0-9]*/fd/* | grep ttyUSB0lugar de lsof ttyUSB0porque los vi en algún momento lento.
  • Entonces strace rastreará el programa actual usando ttyUSB0
  • Sintaxis: tty${1:-USB0}permitirá, utilizado como script, ejecutarse luego con el nombre del dispositivo en serie como argumento: ttySniff USB0o ttySniff S0así sucesivamente.
  • La secuencia de comandos Perl unbackslashregistrará las cadenas registradas por strace.

Nota: Los ejecuto usando script -tpara poder reproducir todo y rastrear las ejecuciones de tiempo.


¡No hay consideraciones de seguridad sobre lo que podría venir por puerto serie !
F. Hauri

Impresionante, funciona bien, gracias!
techno

1

Echa un vistazo a ttyUSBSpy . Está en fase alfa, pero funciona.


2
No lo hace. Está escrito en python, y el código importa algunos import pcopy, que incluso Google dejó de buscar.
Hola Ángel

2
El software / página de inicio parece abandonado. No está en los gestores de paquetes.
Alex Stragies

1

minicomfalta en la lista de herramientas para monitorear puertos seriales. Úselo como, por ejemplo, para escuchar el dispositivo arduino:

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


OP escribió "monitor", pero quería decir "sniffer" (= es capaz de leer el tráfico en tránsito), mientras que minicom es un "cliente" de puerto serie, y como tal no es una respuesta a esta pregunta. La siguiente respuesta de Mike cometió el mismo error, y el comentario allí también explica el problema de terminología.
Alex Stragies
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.