Comment puis-je surveiller le trafic du port série?

40

Existe-t-il un outil de surveillance de port permettant de surveiller les paquets écrits sur le port? Je veux surtout vérifier si mon programme écrit en Java fonctionne, alors j'ai besoin d'un outil pour voir si ma petite application écrit les messages sur le port. Comment puis-je faire cela?

Deepak
la source
5
Les paquets ne sont pas écrits sur le port. Les personnages sont. Ce n'est pas comme Ethernet du tout.
LawrenceC
1
Questions similaires posées sur les sites SE de frères et soeurs : stackoverflow.com/q/940374/12892 et serverfault.com/q/112957/4276
Cristian Ciupitu le

Réponses:

17

J'ai trouvé des projets appelés Linux Serial Sniffer , jpnevulator et Moni . Les deux premiers semblent faire exactement ce que vous voulez. Le dernier s'appelle un moniteur, mais il ressemble en réalité à un programme de communication série standard.

Shawn J. Goff
la source
1
Merci pour ça !! Je vais essayer. en passant, j'ai résolu le problème de mon côté java. il me manquait un \ r, ce qui a empêché mon message d’écrire sur le port. merci pour ça quand même !!
Deepak
3
Le «LInux Serial Sniffer» est un buggy, il supprime absolument les données entrantes, donc une autre application qui écoute réellement les séries ne voit rien. Mais au moins, les données qui sortent semblent aller sans problème.
Bonjour Angel
3
D'après la FAQ de jpnevulator : "Jpnevulator n'a jamais été construit pour s'interposer entre le noyau et votre application."
Shelvacu
1
Le lien faisant référence à Moni est mort.
Yaron
1
-1 à cause de 3 commentaires: LInux Serial Sniffer est un buggy , alors Jpnevulator n'a jamais été construit pour s'asseoir entre le noyau et l'application et enfin Moni est mort ... Cette réponse pointe juste vers 3 liens externes et ne donne pas une vraie solution. (3 échec sur 3 lien, rien laissé!)
F. Hauri
30

est un outil pour connecter (presque) tout à (presque) tout, et peut dupliquer des flux.
Dans votre cas d'utilisation, vous pouvez connecter votre port série /dev/ttyS0à un PTY /tmp/ttyV0, puis diriger votre application vers le PTY et faire en sorte teeque socat entre l'entrée et la sortie quelque part.

Googler "socat port série pocat tee debug" vous indiquera plusieurs exemples, l'un étant:

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

Les fichiers in.txtet out.txtcontiendront ensuite les données capturées.

Cela a été confirmé par les commentateurs (@ogurets).

Alex Stragies
la source
1
Je viens de l'essayer et de faire enregistrer les entrées et les sorties. Socat version "1.7.2.4 + sigfix" des paquets Debian Jessie.
ogurets
L'idée est bonne, mais même socatles appels ioctl par proxy ne peuvent pas être proxy.
Peter dit de réintégrer Monica le
17

Je ne pense pas que le pilote série ait une fonctionnalité de traçage qui vous permettrait de surveiller les paquets. Vous pouvez utiliser stracepour observer toutes les lectures et écritures de votre application:

strace -s9999 -o myapp.strace -eread,write,ioctl ./myapp
Gilles, arrête de faire le mal
la source
1
Puis-je envoyer des paquets au port si nothign est connecté?
Deepak
strace vous dira s'il a essayé d'envoyer des caractères sur le port et ce que le noyau a répondu quand il a essayé. En fonction de vos paramètres de contrôle de flux, les caractères peuvent arriver à la broche TXD déconnectée ou non.
Jasen
Merci, jetez un coup d'oeil à mon strace dynamique , basé sur cette réponse!
F. Hauri
4

interceptty fait ce travail:

interceptty /dev/ttyACM0 /dev/ttyDUMMY

ou, avec un format de sortie agréable et avec la configuration du périphérique dorsal, et avec la mise en mémoire tampon des lignes:

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

puis connectez-vous avec votre programme à /dev/ttyDUMMY.

Golar Ramblar
la source
@AlexStragies: Je l'ai sur mon système Linux arch. Page AUR: aur.archlinux.org/packages/interceptty , copie des sources: repo.j5lx.eu/archive/interceptty/interceptty-0.6.tar.gz
Golar Ramblar le
Je devais le télécharger (en utilisant wgetdepuis que cliquer sur le .tar.gzfichier semblait le corrompre), installer gccet makeensuite exécuter ./configureet make install. Fait exactement ce que l'OP et je veux bien.
Graeme Moss
Votre réponse est de loin la meilleure.
Peter dit de réintégrer Monica le
3

Lorsque je débogue une interaction de mon application avec un port série, j'utilise moserial .

Renat Zaripov
la source
5
De quoi parlez-vous, dans la documentation écrite, il ne s'agit que d'un terminal.
Bonjour Angel
3

Essaye ça:

screen /dev/tty.usbserial-blahblah 9600

travaille pour moi.

Mike
la source
25
Cela ouvre le port et en prend le contrôle, afin que personne d'autre ne puisse l'utiliser. Cela ne "surveille" ni "renifle" le trafic.
Ian M
3

C'est comme ça que j'ai finalement choisi

Merci à la réponse 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; };};'

Désolé, je vais expliquer ...

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;
            };
        };
    '
  • J'utilise ls -l /proc/[0-9]*/fd/* | grep ttyUSB0au lieu de lsof ttyUSB0parce que je les ai vus parfois lent.
  • Donc, strace va tracer le programme actuel en utilisant ttyUSB0
  • Syntaxe: tty${1:-USB0}permettra, utilisé en tant que script, de s'exécuter ensuite avec le nom de périphérique série en argument: ttySniff USB0ou ttySniff S0etc.
  • Le script Perl sera unbackslashenregistré par les chaînes strace.

Nota: Je les lance en utilisant script -tafin de pouvoir rejouer le tout et de suivre les exécutions de chronométrage.

F. Hauri
la source
Il n'y a aucune considération de sécurité, à propos de ce qui pourrait arriver par le port série !
F. Hauri
Génial, travaillez bien, merci!
techno
1

Jetez un oeil à ttyUSBSpy . C'est sur la scène alpha, mais ça marche.

utilisateur37414
la source
2
Ce n'est pas. Il est écrit en python, et le code en importe import pcopy, ce que même Google a abandonné pour trouver.
Hi-Angel
2
Le logiciel / la page d'accueil semble abandonné. N'est pas dans les gestionnaires de paquets.
Alex Stragies
1

minicomest manquant dans la liste des outils permettant de surveiller les ports série. Utilisez-le comme par exemple pour écouter un périphérique Arduino:

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

B.Kocis
la source
OP a écrit "moniteur", mais voulait dire "renifleur" (= est capable de lire le trafic en transit), tandis que minicom est un "client" de port série et, en tant que tel, n’est pas une réponse à cette question. La réponse ci-dessous de Mike fait la même erreur, et le commentaire explique également le problème de terminologie.
Alex Stragies