这就是我最终选择的方式

这就是我最终选择的方式

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

答案1

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

谷歌搜索“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包含捕获的数据。

评论后更新:

  • 乍一看语法socat很混乱,但实际上它只是两个嵌套语句。
    购买如此强大、多功能的工具只需付出很小的代价。
  • 如果您需要设置串行端口或发送其他 ioctl,请在调用 socat 之前执行此操作,因为 socat 无法代理它们。
  • 2006 年的单一用途工具interceptty具有稍微简单的语法,但只能拦截 TTY(同时代理 ioctl),并且可能不在您的包管理器中。 (大多数 Linux 发行版从未添加过到他们的仓库。)

答案2

我不认为串行驱动程序具有任何允许您监视数据包的跟踪功能。您可以用来strace观察应用程序的所有读取和写入:

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

答案3

我找到了名为Linux 串行嗅探器,日本呼吸器, 和莫尼(编辑:更新链接)。前两个看起来就像你想要的那样。最后一个自称为监视器,但实际上它看起来像一个标准的串行通信程序。

答案4

这就是我最终选择的方式

谢谢吉尔斯的回答

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)) |& 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 USB0ttySniff S0等等。
  • Perl 脚本将unbackslash由 记录的字符串strace -s 9999
  • 您可以根据需要替换strace -e readstrace -e read,write或。strace -e write

笔记:我使用语法运行它们:

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

这样我就可以重放整个操作并跟踪计时执行情况。

相关内容