it-swarm-ru.tech

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

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

45
Deepak

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

17
Shawn J. Goff

socat - это инструмент для соединения (почти) всего со (почти) всем, а tee может дублировать потоки.
В вашем случае вы можете подключить ваш последовательный порт /dev/ttyS0 к PTY /tmp/ttyV0, затем направьте ваше приложение в PTY и попросите socat tee out ввести и вывести куда-нибудь, чтобы вы могли наблюдать.

Погуглив "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).

31
Alex Stragies

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

strace -s9999 -o myapp.strace -eread,write,ioctl ./myapp
18
Gilles 'SO- stop being evil'

Это путь, который я, наконец, выбрал

Благодаря ответ Жиля !

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

Извините, я объясню ...

#!/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 вместо lsof ttyUSB0 потому что я видел их когда-то медленно.
  • Так что strace будет отслеживать текущую программу, используя ttyUSB0
  • Синтаксис: tty${1:-USB0} позволит, в качестве скрипта или функции, запускать их с последовательным именем устройства в качестве аргумента: ttySniff USB0 или ttySniff S0 и так далее.
  • Скрипт Perl будет unbackslash строк, зарегистрированных strace -s 9999.
  • Вы можете заменить strace -e read по strace -e read,write или strace -e write в зависимости от ваших потребностей.

Примечание: Я запускаю их, используя синтаксис:

 script -t ttySniff.log 2>ttySniff.tm -c "./ttySniff.sh USB0"

чтобы я мог воспроизвести всю операцию и отследить время выполнения.

5
F. Hauri

interceptty выполняет эту работу:

interceptty /dev/ttyACM0 /dev/ttyDUMMY

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

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

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

5
Golar Ramblar

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

3
Renat Zaripov

Попробуй это:

screen /dev/tty.usbserial-blahblah 9600

работает для меня.

3
Mike

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

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

2
B.Kocis

Посмотрите на ttyUSBSpy . Это находится на стадии альфы, но это работает.

1
user37414
0
Antonio Petricca