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

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

Когда я отлаживаю взаимодействие моего приложения с последовательным портом, я использую moserial .

Ренат Зарипов
источник
5
О чем ты говоришь, в написанных документах это просто терминал.
Привет, Ангел,
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 . Это находится на стадии альфы, но это работает.

user37414
источник
2
Это не так. Он написан на python, и код действительно импортирует некоторые данные import pcopy, которые даже Google отказался найти.
Привет, Ангел,
2
Программное обеспечение / домашняя страница выглядит заброшенной. Нет в пакетных менеджерах.
Алекс Страги
1

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

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

B.Kocis
источник
OP написал «monitor», но имел в виду «sniffer» (= способен считывать трафик при передаче), в то время как minicom является «клиентом» последовательного порта, и как таковой не является ответом на этот вопрос. Ответ ниже от микрофона сделал ту же ошибку, и комментарий там объясняет проблему терминологии , а также.
Алекс Страгес