Como posso ouvir a comunicação entre um processo e uma porta serial?

5

Em uma máquina Gentoo Linux, um processo está se comunicando com outro computador via porta serial ( /dev/ttyS1 ). Eu quero ouvir essa comunicação (ou seja, o que está sendo enviado / recebido pelo processo) sem interferir mais.

Como posso conseguir isso apenas com ferramentas básicas do Linux? Eu ainda posso mudar a porta serial com a qual o processo está se comunicando, então talvez eu possa 'atalhar' dois dispositivos ( /dev/ttyS1 e /dev/xxx ) para ouvir toda a comunicação, quando todas as saídas para /dev/ttyS1 são encaminhadas para /dev/xxx e vice-versa. Mas como eu faço isso? Algo com socat ?

    
por Alex 24.02.2014 / 14:25

2 respostas

3

Uma abordagem (não necessariamente a melhor ...) seria anexar strace ao processo (ou, para lidar com a condição de corrida, a um script de wrapper que exec s para esse processo), definido strace para o tamanho máximo da string e, em seguida, capture todos os read() se write() s (ou seja qual for o seu processo). Depois disso, você grep as linhas com o descritor de arquivo certo (que deve sempre ser o mesmo; se não, então você tem que pegar o open() s, também).

    
por 24.02.2014 / 14:36
9

interceptação parece com o que você quer.

Descobri que desta página do Ubuntu

interceptty - Intercepte o tráfego de e para uma porta serial.

Exemplo

If you want to use interceptty as an external serial monitor [connected to two serial ports on your machine and relaying between them, while recording the output]

you can use one device as the backend, and use the -p option to tell the frontend not to create it's own tty, but just use the one you tell it:

interceptty -s 'ispeed 19200 ospeed 19200' /dev/ttyS0 -p /dev/ttyS1 -

Resultado

interceptty prints its output in a fairly unattractive, painful to look at format. However, it is very easy for other programs to parse. For an example of how to post-process this output into something appropriate to whatever you are intercepting, see the included Perl script interceptty-nicedump.

Output lines are in this general format:

< 0x54 (T)

  0x4b (K)  ^ Direction    ^^^^ Hex code (to real device)
    ^^^ ASCII character (to real device)
     ^^^^ Hex code (from real device)
          ^^^ ASCII character (from real device) The direction marker is a '<' if this character was sent to the backend device, and

'>' if it was received from the backend device. It is always followed by a single space. If the character was received from the real device, a tab will appear next (this makes the output easier to follow). After that is the hex code for the character, and the ASCII representation of the character if it is an ASCII character.

    
por 24.02.2014 / 15:05