如何监视串行端口流量?


40

是否有任何端口监视工具来监视写在端口上的数据包?我特别想检查用Java编写的程序是否正常工作,因此我需要某种工具来查看我的小应用程序是否正在将消息写入端口。我该怎么做呢?


5
数据包未写入端口。人物是。根本不像以太网。
LawrenceC

Answers:


17

我发现了名为Linux Serial SnifferjpnevulatorMoni的项目。前两个看起来像它们确实可以满足您的要求。最后一个自称监视器,但实际上看起来像是一个标准的串行通信程序。


1
感谢那 !!我会试试看。顺便说一下,我从Java方面解决了这个问题。我缺少\ r,因此无法将我的消息写到端口上。还是谢谢你!!
迪帕克

3
“ LInux串行嗅探器”有问题,它绝对会取出传入的数据,因此实际上正在监听串行的另一个应用程序什么也看不见。但是,至少,传到外部的数据似乎没有问题。
Hi-Angel

3
来自jpnevulator常见问题解答:“ Jpnevulator从未构建为位于内核和应用程序之间。”
Shelvacu

1
指向Moni的链接已死。
Yaron

1
-1,因为为3条:Linux的串行Sniffer是越野车,然后Jpnevulator从未建立在内核和应用程序之间坐下和finaly 莫尼已经死了 ......这样的回答只是点到3个的外部链接,不给一个真正的解决方案。(3个链接上的3个失败,什么都不留!)
F. Hauri

30

是一种将(几乎)所有内容连接到(几乎)所有内容的工具,并且可以复制流。
在用例中,您可以将串行端口连接/dev/ttyS0到PTY /tmp/ttyV0,然后将应用程序指向PTY,并在tee某处放置输入和输出以供观察。

仔细搜索“ socat串行端口pty tee调试”将为您提供几个示例,其中一个是:

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

文件in.txtout.txt然后将包含捕获的数据。

评论者(@ogurets)确认可以正常工作。


1
刚刚尝试过,并记录了输入和输出。Debian Jessie软件包中的Socat版本“ 1.7.2.4 + sigfix”。
ogurets

这个想法很好,但是甚至socat不能代理ioctl调用。
彼得说恢复莫妮卡

17

我认为串行驱动程序没有任何跟踪功能可让您查看数据包。您可以strace用来观察来自应用程序的所有读取和写入:

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

1
如果nothign已连接,可以将数据包发送到端口吗?
迪帕克

strace会告诉您是否尝试将字符发送到端口,以及内核尝试时响应的内容。根据您的流控制设置,字符可能到达断开的TXD引脚,也可能不到达。
Jasen

谢谢,基于此答案,看看我的动态strace
F.豪里

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
Golar Ramblar

我不得不下载(使用wget自点击.tar.gz似乎损坏它在某种程度上文件),安装gccmake,然后运行./configuremake install。确实可以执行OP和我想要的操作。
Graeme Moss

您的答案是最好的。
彼得说恢复莫妮卡


3

尝试这个:

screen /dev/tty.usbserial-blahblah 9600

为我工作。


25
这将打开端口并承担对该端口的控制,因此其他任何人都无法使用它。这不会“监视”或“嗅探”流量。
伊恩·M

3

这就是我最终选择的方式

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

对不起,我会解释...

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 USB0ttySniff S0等等。
  • Perl脚本会将unbackslash字符串记录为strace

注意:我使用来运行它们,script -t以便可以重播整个过程并跟踪计时执行。


没有安全考虑,关于串行端口可能发生的事情!
F.豪里

太好了,工作顺利,谢谢!
techno

1

看看ttyUSBSpy。它处于alpha阶段,但是可以工作。


2
没有。它是用python编写的,并且代码确实导入了some import pcopy,甚至Google也放弃了查找。
Hi-Angel

2
软件/主页看起来已废弃。不在包管理器中。
Alex Stragies

1

minicom监视串行端口的工具列表中缺少。例如,使用它来收听arduino设备:

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


OP编写了“监视器”,但意为“嗅探器”(=能够读取传输中的流量),而minicom是串行端口“客户端”,因此这不是此问题的答案。迈克(Mike)下面回答也犯了同样的错误,那里的评论也解释了术语问题。
Alex Stragies
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.