Como posso monitorar o tráfego da porta serial?

40

Existe alguma ferramenta de monitoramento de porta para observar os pacotes gravados na porta? Quero especialmente verificar se meu programa escrito em Java funciona, então preciso de algum tipo de ferramenta para ver se meu pequeno aplicativo está gravando as mensagens na porta. Como eu faço isso?

Deepak
fonte
5
Pacotes não são gravados na porta. Personagens são. Não é como a Ethernet.
LawrenceC
11
Perguntas semelhantes de sites irmãos SE: stackoverflow.com/q/940374/12892 e serverfault.com/q/112957/4276
Cristian Ciupitu

Respostas:

17

Encontrei projetos chamados Linux Serial Sniffer , jpnevulator e Moni . Os dois primeiros parecem fazer exatamente o que você deseja. O último chama a si mesmo de monitor, mas na verdade parece um programa de comunicação serial padrão.

Shawn J. Goff
fonte
11
obrigado por isso !! eu vou tentar. pela maneira que eu resolvi o problema do meu lado java. estava faltando um \ r, o que impediu minha mensagem de gravar na porta. obrigado por isso de qualquer maneira !!
Deepak
3
O «LInux Serial Sniffer» é buggy, remove absolutamente os dados recebidos, assim outra aplicação que é realmente ouvir serial não vê nada. Mas, pelo menos, os dados que saem parecem não ter problemas.
Hi-Angel
3
Na FAQ do jpnevulator : "O Jpnevulator nunca foi criado para ficar entre o kernel e seu aplicativo."
Shelvacu
11
O link referente a Moni está morto.
Yaron
11
-1 por causa de 3 comentários: O LInux Serial Sniffer é buggy , então o Jpnevulator nunca foi criado para ficar entre o kernel e o aplicativo e, finalmente, o Moni está morto ... Essa resposta apenas aponta para 3 links externos e não fornece uma solução real. (3 falham no link 3, não deixaram nada!)
F. Hauri 20/09
30

é uma ferramenta para conectar (quase) tudo a (quase) tudo, e o pode duplicar fluxos.
No seu caso, você pode conectar sua porta serial /dev/ttyS0a um PTY /tmp/ttyV0, apontar seu aplicativo para o PTY e localizar e inserir e teesair em algum lugar para você observar.

Ao pesquisar no Google "porta serial socat pty tee debug", você encontrará vários exemplos, sendo um deles:

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

Os arquivos in.txte out.txtconterão os dados capturados.

Isto foi confirmado para funcionar por comentaristas (@ogurets).

Alex Stragies
fonte
11
Apenas tentei e tenho entrada e saída gravadas. Versão Socat "1.7.2.4 + sigfix" dos pacotes Debian Jessie.
ogurets 17/05
A ideia é boa, mas nem mesmo o socatproxy pode chamar o ioctl.
peterh diz restabelecer Monica 24/01
17

Acho que o driver serial não possui nenhuma funcionalidade de rastreamento que permita assistir pacotes. Você pode usar stracepara observar todas as leituras e gravações do seu aplicativo:

strace -s9999 -o myapp.strace -eread,write,ioctl ./myapp
Gilles 'SO- parar de ser mau'
fonte
11
pode enviar pacotes para a porta se nothign estiver conectado?
Deepak
O strace lhe dirá se ele tentou enviar caracteres para a porta e com o que o kernel respondeu quando tentou. dependendo das configurações de controle de fluxo, os caracteres podem chegar ao pino TXD desconectado ou não.
Jasen 28/06
Obrigado, dê uma olhada no meu traço dinâmico , com base nesta resposta!
F. Hauri 29/10
4

interceptty faz esse trabalho:

interceptty /dev/ttyACM0 /dev/ttyDUMMY

ou, com um bom formato de saída e com a configuração do dispositivo back-end e com buffer de linha:

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

e conecte-se ao seu programa para /dev/ttyDUMMY.

Golar Ramblar
fonte
@AlexStragies: Eu o tenho no meu sistema arch linux. AUR página: aur.archlinux.org/packages/interceptty , cópia das fontes: repo.j5lx.eu/archive/interceptty/interceptty-0.6.tar.gz
Golar Ramblar
Eu tive que baixá-lo (usar wgetdesde que clicar no .tar.gzarquivo parecia corrompê-lo de alguma forma), instalar gcce make, em seguida, executar ./configuree make install. Faz exatamente o que o OP e eu queremos.
Graeme Moss
Sua resposta é de longe a melhor.
peterh diz restabelecer Monica
3

Quando depuro a interação do meu aplicativo com uma porta serial, uso moserial .

Renat Zaripov
fonte
5
Do que você está falando, nos documentos escritos é apenas um terminal.
Hi-Angel
3

Tente o seguinte:

screen /dev/tty.usbserial-blahblah 9600

funciona para mim.

Mike
fonte
25
Isso abre a porta e assume controle sobre ela, para que nada mais possa usá-la. Isso não "monitora" ou "fareja" o tráfego.
Ian M
3

É assim que eu finalmente escolho

Graças à resposta de 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; };};'

Desculpe, eu vou explicar ...

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;
            };
        };
    '
  • Eu uso em ls -l /proc/[0-9]*/fd/* | grep ttyUSB0vez de lsof ttyUSB0porque os vi em algum momento lento.
  • Então, o strace rastreará o programa atual usando ttyUSB0
  • Sintaxe: tty${1:-USB0}permitirá, usado como um script, ser executado com o nome do dispositivo serial como argumento: ttySniff USB0ou ttySniff S0assim por diante.
  • O script Perl terá as unbackslashstrings registradas por strace.

Nota: Eu os executo usando script -tpara que eu possa reproduzir o todo e rastrear as execuções de tempo.

F. Hauri
fonte
Não há consideração de segurança sobre o que poderia estar vindo pela porta serial !
F. Hauri
Incrível, funciona bem, obrigado!
techno
1

Dê uma olhada no ttyUSBSpy . Está no estágio alfa, mas funciona.

user37414
fonte
2
Não faz. Está escrito em python, e o código importa alguns import pcopy, que até o Google desistiu de encontrar.
Hi-Angel
2
Software / Homepage parece abandonado. Não está nos gerenciadores de pacotes.
Alex Stragies
1

minicomestá faltando na lista de ferramentas para monitorar portas seriais. Use-o como, por exemplo, para ouvir o dispositivo arduino:

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

B.Kocis
fonte
O OP escreveu "monitor", mas significava "sniffer" (= é capaz de ler o tráfego em trânsito), enquanto o minicom é um "cliente" da porta serial e, como tal, não é uma resposta para esta pergunta. A resposta abaixo de Mike cometeu o mesmo erro, e o comentário também explica o problema da terminologia.
Alex Stragies 17/03