Как я могу отслеживать трафик через последовательный порт?


40

Существует ли какой-либо инструмент мониторинга портов для наблюдения за пакетами, записанными на порт? Я особенно хочу проверить, работает ли моя программа, написанная на Java, поэтому мне нужен какой-то инструмент, чтобы увидеть, пишет ли мое маленькое приложение сообщения в порт. Как мне это сделать?


5
Пакеты не пишутся в порту. Персонажи есть. Это совсем не похоже на Ethernet.
— LawrenceC

1
Аналогичные вопросы с сайтов-братьев SE: stackoverflow.com/q/940374/12892 и serverfault.com/q/112957/4276
— Кристиан Чиупиту

Ответы:


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
Только что попробовал и записал и вход, и выход. Сокат версия "1.7.2.4 + sigfix" из пакетов Debian Jessie.
— огурец

Идея хорошая, но даже socatпрокси-вызовы ioctl не могут.
— Петер говорит восстановить Монику

17

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

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

1
можно ли отправлять пакеты в порт, если подключено nothign?
— Дипак

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

Спасибо, взгляните на мою динамическую связь , основываясь на этом ответе!
— Ф. Хаури

4

interceptty делает эту работу:

interceptty /dev/ttyACM0 /dev/ttyDUMMY

или, с хорошим форматом вывода и с настройкой внутреннего устройства, и с буферизацией строки:

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

а затем подключиться с вашей программой к /dev/ttyDUMMY.


@AlexStragies: У меня есть это в моей системе Arch Linux. Страница AUR: aur.archlinux.org/packages/interceptty , копия источников: repo.j5lx.eu/archive/interceptty/interceptty-0.6.tar.gz
— Голар Рамблар,

Мне пришлось скачать его (используя, wgetтак как щелчок по .tar.gzфайлу как-то повредил его), установить gccи makeзатем запустить ./configureи make install. Делает именно то, что ОП и я хочу, хотя.
— Грэм Мосс,

Ваш ответ - далеко не лучший.
— Петер говорит восстановить Монику


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
Программное обеспечение / домашняя страница выглядит заброшенной. Нет в пакетных менеджерах.
— Алекс Страги

1

minicomотсутствует в списке инструментов для мониторинга последовательных портов. Используйте его, например, для прослушивания устройства Arduino:

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


OP написал «monitor», но имел в виду «sniffer» (= способен считывать трафик при передаче), в то время как minicom является «клиентом» последовательного порта, и как таковой не является ответом на этот вопрос. Ответ ниже от микрофона сделал ту же ошибку, и комментарий там объясняет проблему терминологии , а также.
— Алекс Страгес
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.