Як я можу контролювати трафік послідовного порту?


40

Чи є інструмент моніторингу портів для перегляду пакетів, написаних на порту? Я особливо хочу перевірити, чи працює моя програма, написана на Java, тому мені потрібен якийсь інструмент, щоб побачити, чи моє маленьке додаток пише повідомлення на порт. Як це зробити?


5
Пакети не записуються на порт. Персонажі є. Це зовсім не так, як Ethernet.
LawrenceC

1
Подібні питання з двійників сайтів SE: stackoverflow.com/q/940374/12892 і serverfault.com/q/112957/4276
Cristian Ciupitu

Відповіді:


17

Я знайшов проекти під назвою Linux Serial Sniffer , jpnevulator та Moni . Перші два виглядають так, що вони роблять саме те, що ви хочете. Останній називає себе монітором, але він насправді виглядає як стандартна програма послідовного зв'язку.


1
Дякую за це !! я спробую це. до речі, я вирішив питання з мого боку Java. мені не вистачало \ r, так що заважало моє повідомлення писати на порт. спасибі за це все одно !!
Діпак

3
«LInux Serial Sniffer» є помилковим, він абсолютно виймає вхідні дані, тому інша програма, яка насправді слухає серійний, нічого не бачить. Але, принаймні, дані, що виходять назовні, схоже, йдуть без проблем.
Привіт-Ангел

3
З питань FAQ jpnevulator : "Jpnevulator ніколи не був побудований, щоб сидіти між ядром та вашим додатком."
Шельваку

1
Посилання, що стосується Моні, мертва.
Ярон

1
-1 через 3 коментарі: LInux Serial Sniffer є помилковим , тоді Jpnevulator ніколи не будувався, щоб сидіти між ядром та додатком, і нарешті Моні мертва ... Ця відповідь просто вказує на 3 зовнішніх посилання та не дає справжнього рішення. (3 помилки на 3 посиланні, нічого не залишилося!)
Ф. Хаурі

30

- це інструмент для підключення (майже) до всього (майже) всього, і може дублювати потоки.
У вашому скриньці ви можете підключити свій послідовний порт /dev/ttyS0до PTY /tmp/ttyV0, а потім направити свою заявку на PTY, а потім прописати teeвхід і вихід десь для того, щоб ви спостерігали.

Гуглінг "socat serial port pty tee debug" вкаже на кілька прикладів, один із них:

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

Файли in.txtі out.txtбудуть містити захоплені дані.

Це підтвердили роботу коментатори (@ogurets).


1
Просто спробував і записати і вхід, і вихід. Версія Socat "1.7.2.4 + sigfix" з пакунків Debian Jessie.
огурець

Ідея хороша, але навіть не socatможе проксі-йоктль викликати.
Peterh каже відновити Моніку

17

Я не думаю, що серійний драйвер не має функцій відстеження, які б дозволяли вам переглядати пакети. Ви можете використовувати straceдля спостереження за всіма прочитаними та записаними з вашої програми:

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

1
Чи можна надіслати пакети до порту, якщо не підключений номер?
Діпак

strace скаже вам, чи намагався він надсилати символів до порту, і на що ядро ​​відповіло, коли воно намагалось. залежно від параметрів регулювання потоку символи можуть надходити на відключений штифт TXD або не можуть.
Ясен

Дякую, погляньте на мою динамічну схему , грунтуючись на цій відповіді!
Ф. Хаурі

4

interceptty виконує цю роботу:

interceptty /dev/ttyACM0 /dev/ttyDUMMY

або, з приємним вихідним форматом і з налаштуванням пристрою резервного копіювання, а також з буферизацією рядків:

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

а потім підключіться до своєї програми до /dev/ttyDUMMY.


@AlexStragies: У мене це є в моїй системі арки Linux. Сторінка AUR: aur.archlinux.org/packages/interceptty , копія джерел: repo.j5lx.eu/archive/interceptty/interceptty-0.6.tar.gz
Golar Ramblar

Мені довелося завантажити його (використовуючи, wgetоскільки натискання на .tar.gzфайл здавалося, що якимось чином його пошкодило), встановити gccі make, а потім запустити ./configureі make install. Робить саме те, що OP, і я хочу, хоча.
Graeme Moss

Ваша відповідь - далеко найкраща.
Peterh каже відновити Моніку


3

Спробуйте це:

screen /dev/tty.usbserial-blahblah 9600

працює для мене.


25
Це відкриває порт і бере на себе контроль над ним, тому більше нічого не може використовувати його. Це не "контролює" і не "нюхає" трафік.
Ян М

3

Це я нарешті обираю

Дякую за відповідь Жилла !

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

Вибачте, поясню ...

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замість того, lsof ttyUSB0що бачив їх колись повільно.
  • Таким чином, strace буде відслідковувати поточну програму, використовуючи ttyUSB0
  • Синтаксис: tty${1:-USB0}дозволить, використовувати в якості сценарію для запуску потім з ім'ям послідовного пристрою в якості аргументу: ttySniff USB0або ttySniff S0і так далі.
  • Сценарій Perl буде unbackslashрядками, в яких увійшов strace.

Нота: Я запускаю їх за допомогою, script -tщоб я міг повторити цілі та простежити виконання часу.


Немає жодних питань щодо безпеки щодо того, що може відбуватися через послідовний порт !
Ф. Хаурі

Дивовижно, добре працюйте, дякую!
техно

1

Погляньте на ttyUSBSpy . Це на альфа-сцені, але це працює.


2
Це не так. Він написаний python, і код імпортує деякі import pcopy, які навіть Google відмовився від пошуку.
Привіт-Ангел

2
Програмне забезпечення / домашня сторінка виглядає покинутим. Не в менеджерах пакунків.
Alex Stragies

1

minicomвідсутній у списку інструментів для моніторингу послідовних портів. Використовуйте його як, наприклад, для прослуховування пристрою arduino:

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


OP написав "монітор", але означав "sniffer" (= вміє читати трафік під час транзиту), в той час як minicom є послідовним портом "клієнт", і як такий не є відповіддю на це питання. Відповідь нижче від мікрофона зробив ту ж помилку, і коментар там пояснює проблему термінології , а також.
Alex Stragies
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.