Existe-t-il un outil de surveillance de port pour regarder les paquets écrits sur le port? Je veux surtout vérifier si mon programme écrit en Java fonctionne donc j'ai besoin d'une sorte d'outil pour voir si ma petite application écrit les messages sur le port. Comment faire?
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 fait à un programme de communication série standard.
socat est un outil pour connecter (presque) tout à (presque) tout, et tee peut dupliquer des flux.
Dans votre cas d'utilisation, vous pouvez connecter votre port série /dev/ttyS0
vers un PTY /tmp/ttyV0
, puis pointez votre application vers le PTY, et demandez à socat tee
de sortir les entrées et sorties quelque part pour que vous puissiez les observer.
La recherche sur "débogage du tee pty du port série socat" vous indiquera plusieurs exemples, dont un:
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.txt
et out.txt
contiendra alors les données capturées.
Cela a été confirmé par les commentateurs (@ogurets).
Je ne pense pas que le pilote série ait une fonctionnalité de traçage qui vous permettrait de regarder des paquets. Vous pouvez utiliser strace
pour observer toutes les lectures et écritures de votre application:
strace -s9999 -o myapp.strace -eread,write,ioctl ./myapp
Merci à 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 vous expliquer ...
#!/bin/bash
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;
};
};
'
ls -l /proc/[0-9]*/fd/* | grep ttyUSB0
au lieu de lsof ttyUSB0
parce que je les ai vues parfois lentes.ttyUSB0
tty${1:-USB0}
permettra, utilisé comme script ou fonction, de les exécuter avec le nom du périphérique série comme argument: ttySniff USB0
ou ttySniff S0
etc.unbackslash
chaînes enregistrées par strace -s 9999
.strace -e read
par strace -e read,write
ou strace -e write
selon vos besoins.Remarque: Je les exécute en utilisant la syntaxe:
script -t ttySniff.log 2>ttySniff.tm -c "./ttySniff.sh USB0"
afin que je puisse rejouer toute l'opération et suivre les exécutions de synchronisation.
interceptty
fait ce travail:
interceptty /dev/ttyACM0 /dev/ttyDUMMY
ou, avec un format de sortie Nice et avec la configuration du périphérique backend, et avec la mise en mémoire tampon de ligne:
interceptty -s 'ispeed 19200 ospeed 19200' -l /dev/ttyACM0 /dev/ttyDUMMY | interceptty-nicedump
puis connectez-vous avec votre programme à /dev/ttyDUMMY
.
Lorsque je débogue l'interaction de mon application avec un port série, j'utilise moserial .
Essaye ça:
screen /dev/tty.usbserial-blahblah 9600
travaille pour moi.
minicom
est absent de la liste des outils pour surveiller les ports série. Utilisez-le comme par exemple pour écouter un périphérique Arduino:
minicom --device /dev/ttyACM0 --baud 9600
Jetez un oeil à ttyUSBSpy . C'est sur la scène alpha, mais ça marche.