socat을 사용하여 물리적 직렬 포트에서 통신을 가로채기

socat을 사용하여 물리적 직렬 포트에서 통신을 가로채기

저는 Linux 전문가가 아니므로 안심하시기 바랍니다. ;)

좋아요, 상황은 Debian Wheezy를 실행하는 단일 보드 컴퓨터가 있다는 것입니다. 나는 그것이 오래되고 위험하다는 것을 알고 있지만 실제로는 "내" 장치가 아니므로 제어할 수 없습니다.

C#으로 작성되고 Mono를 통해 실행되는 일부 소프트웨어가 실행되고 있습니다. 다시 말하지만, 이것은 내 소프트웨어가 아니며 나는 이에 대한 통제권이 없으며 코드를 변경할 능력도 없습니다.

소프트웨어는 /dev/ttyS1물리적 직렬 포트( )를 통해 모뎀에 AT 명령을 보내고, 모뎀은 명령에 대한 적절한 응답을 반환합니다.

모뎀을 더 이상 사용할 수 없으므로 다른 대안을 개발해야 합니다. 그래서 AT 명령을 "가로채서" 적절한 응답을 C# 소프트웨어로 다시 보내는 간단한 Python 스크립트를 SBC에서 실행할 수 있다고 생각했습니다. 그런 다음 Python 스크립트를 사용하여 다른 장치와 통신할 수 있었지만 이 방법.

이를 위해서는 좋은 "Google"을 사용하는 socat것이 최선의 선택인 것 같습니다. 그러나 시도해 보았지만 얼마나 많은 조합이 필요한지 모르고 원하는 방식으로 작동하도록 할 수 없습니다.

물리적 설정은 현재 내 노트북에 직렬 포트가 연결되어 있어 파이프(ttyS1)에서 오는 AT 명령을 볼 수 있다는 것입니다. 그런 다음 SBC에 ssh로 연결하고 minicom을 시작하여 socat.

기존 설정

C# <-> ttyS1 <-> 기존 모뎀

필수 설정

C# <-> socat <-> python -> 새 모뎀

제가 시도한 두 가지 변형은 다음과 같습니다.

socat -x /dev/ttyS1,raw,echo=0,crnl PTY,link=/dev/ttyV1,raw,echo=0,crnl

...또한 내가 오해한 경우를 대비해 반대 방향으로도 시도했습니다...

socat -x PTY,link=/dev/ttyV1,raw,echo=0,crnl /dev/ttyS1,raw,echo=0,crnl

나도 시도했다많은다양한 변형, 파일로 푸시, 파일로 "티잉", 다양한 명령 스위치, stty를 사용하여 포트 구성 등

같은 문제가 발생할 때마다 실제로 AT 명령이 전송되는 것을 볼 수 없습니다~에서C# 소프트웨어? !

SBC에 minicom을 입력하면 랩톱의 직렬 포트 리더기에 나타나는 출력을 볼 수 있습니다. 마찬가지로 랩톱에 직렬 포트 리더기를 입력하면 SBC의 minicom에 나타나는 입력을 볼 수 있지만 무엇이 아닌지 알 수 있습니다. 소프트웨어가 ttyS1을 사용하도록 구성되어 있더라도 C# 소프트웨어에서 보낸 실제 AT 명령이 차단됩니다.

소프트웨어에 대해 내가 제어할 수 있는 유일한 것은 모뎀과 통신하는 데 사용하는 포트입니다. 그래서 예를 들어 가상 포트로 변경하고 /dev/ttyV1시작 중 및 C# 프로그램이 시작되기 전에 socatCreate Virtual Port를 실행하여 가상 포트를 실제로 사용할 수 있도록 했습니다. 또 똑같은 문제가 발생합니다. 여전히 C# 소프트웨어에서 보낸 AT 명령을 볼 수 없습니다.

이틀 동안 이 작업을 수행했는데 제대로 작동하지 못하니 누군가 도움을 줄 수 있기를 바랍니다. 나는 socat이 작동하는 도구라고 확신합니다. 나는 그것이 어떻게 작동하는지 근본적으로 오해했기를 바랍니다.

답변1

필수 부분 중 하나가 누락되었을 수 있습니다: 직렬 포트 속도.

socat옵션에서 직렬 포트 속도를 설정하면 비슷한 실험을 시도해 볼 수 있습니다.

socat -x PTY,link=/dev/ttyV1,raw,echo=0,crnl /dev/ttyS1,b115200,raw,echo=0,crnl

여기서는 115200 전송 속도를 사용했습니다 b115200.socat남성가능한 모든 옵션을 보려면 다음 명령을 사용하십시오 b....

socat -hh |grep 'b[1-9]'

(그리고:

참고: 일부 운영 체제에서는 이러한 옵션을 사용하지 못할 수도 있습니다. 대신 ispeed나 ospeed를 사용하세요.

)

테스트 애플리케이션으로 사용됨(예, screen직렬 포트를 처리할 수 있음):

screen /dev/ttyV1 115200

바꾸다

screen /dev/ttyS1 115200

직렬 포트를 통해 콘솔을 갖도록 구성된 다른 시스템에 평소처럼 로그인할 수 있습니다( screen115200 매개변수는 쓸모가 없지만 이로 인해 응용 프로그램이 중단되어서는 안 된다는 것을 의미합니다).

보내거나 받은 모든 내용은 16진수로 표시됩니다 -x.


귀하의 질문에 답변한 것 같습니다. 귀하의 목표는 더 큰 작업인 트래픽을 변경하는 것 같지만 직렬 포트를 통해 이동하는 트래픽을 읽는 방법을 묻습니다.

특히 문자가 버퍼링되지 않은 경우 흐름을 변경하려면 전용 도구가 필요합니다( sed파이프 중간에서 사용하기가 더 어려울 수 있습니다).

socat일반적으로 전반부(PTY)에는 흐름을 변경하기 위해 실행 파일을 호출하는 첫 번째 명령이 있습니다(셸 스크립트나 Python 등일 수 있으며 최대 4개의 다른 FD를 사용하여 양쪽을 관리해야 함). EXEC:후반부의 두 번째 명령(ttyS1)을 호출합니다 .socat

답변2

HardwareW - /dev/ttyUSB0 <---> socat/logging <---> ~/myserial <---> Python 직렬 스크립트

  1. 장치를 연결 ttyUSB0하고 ttyUSB0사용자가 사용할 수 있도록 합니다.

    sudo chown youruser.youruser -R /dev/ttyUSB0
    
  2. 소캣 시작

    socat -d -d -x /dev/ttyUSB0,b9600,rawer  PTY,link=$HOME/myserial,rawer,echo=0 2>log3
    
  3. RS232 장치로 데이터/요청을 보냅니다.

    python myserial-client.py '*IDN?'
    

    장치에는 특정 문자 시퀀스가 ​​필요한 경우가 많습니다. , , , , *IDN?문자 단위로 데이터를 보내는 미니콤 터미널에는 응답하지 않습니다 .*IDN?

    myserial-client.py:

    import sys
    import serial
    DEFAULT_ADDR = '/home/krzys/myserial'
    DEFAULT_CMD = 'R5'
    args = len(sys.argv) - 1
    if args == 0:
        addr, cmd = DEFAULT_ADDR, DEFAULT_CMD
    elif args == 1:
        addr, cmd = DEFAULT_ADDR, sys.argv[1]
    else:
        addr, cmd = sys.argv[1:3]
    
    cmd += '\r\n'
    s = serial.Serial("/home/krzys/myserial",9600,timeout=0.5)
    s.write(cmd.encode())
    print(s.readline())
    
  4. myserver.py프레임 전송 및 수신을 테스트하고 확인할 수 있는 더미 스크립트를 작성하여 스크립트를 확인하는 것이 좋습니다 .

확인하시기 바랍니다이 점, Linux 가상 Python 에뮬레이터에서 설정하는 방법 및 직렬 통신을 테스트하는 클라이언트에 대해 설명합니다.

관련 정보