Làm thế nào tôi có thể giám sát lưu lượng cổng nối tiếp?


40

Có công cụ giám sát cổng nào để xem các gói được ghi trên cổng không? Tôi đặc biệt muốn kiểm tra xem chương trình của tôi được viết bằng Java có hoạt động hay không vì vậy tôi cần một số loại công cụ để xem ứng dụng nhỏ của tôi có đang viết các thông báo tới cổng không. Làm thế nào để tôi làm điều này?


5
Các gói không được ghi trên cổng. Nhân vật là. Nó hoàn toàn không giống Ethernet.
LawrenceC

1
Các câu hỏi tương tự từ các trang SE anh chị em: stackoverflow.com/q/940374/12892serverfault.com/q/112957/4276
Cristian Ciupitu

Câu trả lời:


17

Tôi tìm thấy các dự án được gọi là Linux serial Sniffer , jpnevulatorMoni . Hai người đầu tiên trông giống như họ làm chính xác những gì bạn muốn. Cái cuối cùng tự gọi là màn hình, nhưng nó thực sự trông giống như một chương trình giao tiếp nối tiếp tiêu chuẩn.


1
cảm ơn vì điều đó !! tôi sẽ cho nó nó một cơ hội. bằng cách tôi đã giải quyết vấn đề từ phía java của tôi. tôi đã bị mất một cái r, do đó ngăn không cho tin nhắn của tôi viết lên cổng. cảm ơn vì dù sao đi nữa !!
Deepak

3
«LInux serial Sniffer» là lỗi, nó hoàn toàn lấy ra dữ liệu đến, do đó, một ứng dụng khác thực sự nghe nối tiếp không thấy gì. Nhưng, ít nhất, dữ liệu đi ra ngoài dường như không có vấn đề gì.
Hi-Angel

3
Từ Câu hỏi thường gặp của jpnevulator : "Jpnevulator chưa bao giờ được xây dựng để ngồi giữa kernel và ứng dụng của bạn."
Shelvacu

1
Liên kết đề cập đến Moni đã chết.
Yaron

1
-1 vì 3 bình luận: LInux serial Sniffer bị lỗi , sau đó Jpnevulator không bao giờ được xây dựng để ngồi giữa kernel và ứng dụng và cuối cùng Moni đã chết ... Câu trả lời này chỉ vào 3 liên kết bên ngoài và không đưa ra giải pháp thực sự. (3 thất bại trên 3 liên kết, không để lại gì!)
F. Hauri

30

là một công cụ để kết nối (gần) mọi thứ với (gần) mọi thứ và có thể nhân đôi luồng.
Trong usecase của bạn, bạn có thể kết nối cổng nối tiếp của mình /dev/ttyS0với PTY /tmp/ttyV0, sau đó trỏ ứng dụng của bạn đến PTY và giao tiếp với teeĐầu vào và Đầu ra ở đâu đó để bạn quan sát.

Googling "gỡ lỗi nối tiếp pty tee port" sẽ chỉ cho bạn một vài ví dụ, một ví dụ:

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

Các tập tin in.txtout.txtsau đó sẽ chứa dữ liệu bị bắt.

Điều này đã được xác nhận để làm việc bởi các nhà bình luận (@ogurets).


1
Chỉ cần thử nó và có cả đầu vào và đầu ra được ghi lại. Phiên bản Socat "1.7.2.4 + sigfix" từ các gói Debian Jessie.
ogurets

Ý tưởng là tốt, nhưng thậm chí không socatthể ủy quyền các cuộc gọi ioctl.
peterh nói phục hồi Monica

17

Tôi không nghĩ trình điều khiển nối tiếp có bất kỳ chức năng theo dõi nào cho phép bạn xem các gói. Bạn có thể sử dụng straceđể quan sát tất cả các lần đọc và ghi từ ứng dụng của bạn:

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

1
có thể gửi các gói đến cổng nếu không được kết nối?
Deepak

strace sẽ cho bạn biết nếu nó cố gửi các ký tự đến cổng và kernel đã trả lời khi nó thử. tùy thuộc vào các ký tự cài đặt điều khiển luồng của bạn, các ký tự có thể đến chân TXD bị ngắt kết nối hoặc có thể không.
Jasen

Cảm ơn, hãy xem bước đi năng động của tôi , dựa trên câu trả lời này!
F. Hauri

4

interceptty làm công việc đó:

interceptty /dev/ttyACM0 /dev/ttyDUMMY

hoặc, với định dạng đầu ra đẹp và định cấu hình thiết bị phụ trợ và với bộ đệm dòng:

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

và sau đó kết nối với chương trình của bạn /dev/ttyDUMMY.


@AlexStragies: Tôi có nó trên hệ thống linux arch của tôi. Trang AUR: aur.archlinux.org/packages/interceptty , bản sao của các nguồn: repo.j5lx.eu/archive/interceptty/interceptty-0.6.tar.gz
Golar Ramblar

Tôi đã phải tải xuống (bằng wgetcách nhấp vào .tar.gztệp dường như bị hỏng bằng cách nào đó), cài đặt gccmakesau đó chạy ./configuremake install. Có chính xác những gì OP và tôi muốn mặc dù.
Graeme Rêu

Câu trả lời của bạn là xa tốt nhất.
peterh nói phục hồi Monica

3

Khi tôi gỡ lỗi tương tác của ứng dụng của tôi với một cổng nối tiếp, tôi sử dụng moserial .


5
Bạn đang nói về cái gì, trong các tài liệu viết nó chỉ là một thiết bị đầu cuối.
Hi-Angel

3

Thử đi:

screen /dev/tty.usbserial-blahblah 9600

làm việc cho tôi


25
Điều này mở cổng và giả định kiểm soát nó, vì vậy không có gì khác có thể sử dụng nó. Điều này không "giám sát" hoặc "đánh hơi" lưu lượng.
Ian M

3

Đây là cách cuối cùng tôi chọn

Cảm ơn câu trả lời của 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; };};'

Xin lỗi, tôi sẽ giải thích ...

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;
            };
        };
    '
  • Tôi sử dụng ls -l /proc/[0-9]*/fd/* | grep ttyUSB0thay lsof ttyUSB0vì bởi vì tôi thấy chúng đôi khi chậm.
  • Vì vậy, strace sẽ theo dõi chương trình hiện tại bằng cách sử dụng ttyUSB0
  • Cú pháp: tty${1:-USB0}sẽ cho phép, được sử dụng như một tập lệnh, để chạy sau đó với tên thiết bị nối tiếp làm đối số: ttySniff USB0hoặc ttySniff S0v.v.
  • Kịch bản Perl sẽ unbackslashchuỗi đăng nhập bởi strace.

Nota: Tôi chạy chúng bằng cách sử dụng script -tđể tôi có thể phát lại toàn bộ và theo dõi các lần thực hiện thời gian.


Không có sự cân nhắc về bảo mật, về những gì có thể đến bằng cổng nối tiếp !
F. Hauri

Tuyệt vời, làm việc tốt, cảm ơn!
kỹ thuật

1

Có một cái nhìn tại ttyUSBSpy . Đó là trên giai đoạn alpha, nhưng nó hoạt động.


2
Nó không. Nó được viết bằng python và mã này nhập một số import pcopy, thậm chí Google đã từ bỏ để tìm.
Hi-Angel

2
Phần mềm / Trang chủ trông bị bỏ rơi. Không có trong quản lý gói.
Alex Stragies

1

minicombị thiếu trong danh sách các công cụ để giám sát các cổng nối tiếp. Sử dụng nó như ví dụ để nghe thiết bị arduino:

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


OP đã viết "màn hình", nhưng có nghĩa là "sniffer" (= có thể đọc lưu lượng trong quá cảnh), trong khi minicom là một "máy khách" cổng nối tiếp, và như vậy không phải là câu trả lời cho câu hỏi này. Câu trả lời dưới đây từ mike cũng mắc lỗi tương tự, và bình luận ở đó cũng giải thích vấn đề thuật ngữ.
Alex Stragies
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.