SSH를 통해 직렬 연결 실행

SSH를 통해 직렬 연결 실행

편집: 여기에 몇 가지 제안과 추가 조사를 거친 후 현재 상황은 다음과 같습니다.

4바이트 그룹으로 입력을 받고 4~8바이트 그룹으로 응답을 출력하는 직렬 장치가 있습니다.

0x01010000은 직렬 장치로 보내려는 첫 번째 명령입니다.

0x01fef40b0201080b가 올바른 출력이라는 것을 알고 있습니다. 내가 달리면

echo -n -e "\x01\x01\x00\x00" | socat - /dev/ttyUSB0,raw,echo=0,b19200 > temp && hexdump temp

직렬 장치를 연결한 후 나는 항상 다음과 같은 결과를 얻습니다.

0000000 01fe f40b 0201 080b

출력으로(0의 첫 번째 배치는 에서 옴 hexdump) 모든 것이 잘 작동합니다.

그러나 내가 달리면

socat -,raw /dev/ttyUSB0,raw,echo=0,b19200

Raspberry Pi의 터미널에서 직접

echo -n -e "\x01\x01\x00\x00" | socat - /dev/ttyUSB0,raw,echo=0,b19200 > temp && hexdump temp

다른 터미널에서는(역시 Raspberry Pi에 직접 있으므로 여기에서 문제가 발생할 수 있는 SSH가 없습니다!) 출력이 없습니다.

0000000 01fe f40b 0201 080b

더 이상은 아닙니다. 대신에 나도

  • 출력 없음
  • 0000000 01fe 0002or 0000000 0b02 0008또는 or ... 같은 것을 얻습니다 0000000 01fe 08f4. (따라서 항상 틀리고 예상보다 짧습니다)
  • 다음과 같은 것을 얻습니다 0000000 01fe 0b02 0008(동일하지만 이번에는 3바이트).
  • 또는 비슷하지만 너무 짧고 잘못된 것을 얻으십시오.

따라서 직렬 장치에 아무 것도 보내지 않고(적어도 명시적으로) 방금 부팅하면 socat -,raw /dev/ttyUSB0,raw,echo=0,b19200뭔가 중단되고 잘못된 출력이 나오는 것 같습니다. 마치 무언가가 전송되어 일종의 오프셋을 일으킨 것처럼 같습니다. (이것이 바로 응답이 갑자기 된 이유입니다. 너무 짧아).

그러나 실행했는데 strace socat -,raw /dev/ttyUSB0,raw,echo=0,b19200출력에서 ​​어떤 명령도 찾을 수 없으므로 write무엇을 기대해야 할지 모르겠습니다.

그래서 이것은 상황을 깨뜨리는 것처럼 보이지만 socat그것이 무엇일 수 있는지 전혀 모릅니다. 그리고 socatWindows 프로그램이나 SSH의 개입 없이 순수한 것처럼 보입니다 .

socat편집 2: 입력을 하지 않고 실행하면 strace열려 있는 대신 종료된다는 것을 방금 알았습니다.

strace socat -,raw /dev/ttyUSB0,raw,echo=0,b19200 > strace3

그럼 내가 달릴 때

echo -n -e "\x01\x01\x00\x00" | socat - /dev/ttyUSB0,raw,echo=0,b19200 > temp && hexdump temp

이번에도 모든 것이 잘 작동하는 것 같습니다. 따라서 socat무언가가 파괴되지 않는 경우 입력이 제공되었기 때문이 아니라 열려 있는 상태를 유지하지 않고 종료되기 때문인 것 같습니다 .


다음 시나리오를 고려해보세요.

  1. 우리는 Windows PC를 가지고 있습니다(걱정하지 마세요. 이는 방정식에서 가장 작은 부분이지만 보시다시피 여전히 중요한 세부 사항입니다).
  2. 직렬 장치가 있습니다.
  3. 꽤 최근의 Raspbian을 실행하는 Raspberry Pi가 있습니다.

우리는 Windows PC의 프로그램이 SSH를 통해 직렬 장치에 연결되기를 원합니다. 즉, 장치가 COM을 통해 연결된 것처럼 SSH를 통해 동일한 데이터를 보내야 하고 장치가 마치 장치가 연결된 것처럼 SSH를 통해 동일한 데이터를 받아야 합니다. COM 연결을 통해 연결한 것은 동일합니다.

내 솔루션 아이디어에는 Raspberry Pi가 포함됩니다. Raspberry Pi에 연결된 직렬 장치입니다. Raspberry Pi에서는 SSH 사용자에게 표시되는 프롬프트가 없으며 직접 실행할 수 있는 로그인 bash 스크립트가 있습니다.화면사전에 콘솔 출력 없이 연결 시 직렬 터미널이 직접 시작되도록 직렬 포트에 터미널을 연결합니다. 이런 식으로 SSH 연결이 직렬 장치에 대한 직접 터널 역할을 할 수 있다고 생각했습니다.

그러나 이 구성에서 직렬 장치에 명령을 보낼 때 반환되는 내용은 예상한 것과 다른 것으로 나타났습니다.

지금 내 질문은 다음과 같습니다.

  1. SSH는 어쨌든 텍스트 문자를 예상하고 바이트 문자열을 처리할 수 없기 때문에 이것이 실패합니까?0x0000입력으로? 이게 사실인지는 모르겠지만 그냥 제가 갖고 있던 생각일 뿐입니다.
  2. Windows 시스템에서 SSH를 실행하고 있습니다.-tt배너. 그렇지 않으면 ssh의 stdout에서 읽고 해당 stdin에 쓸 수 있도록 ssh 프로세스와 내 프로그램 프로세스에서 stdin 및 stdout을 파이프할 수 없기 때문에 이 작업을 수행하고 있습니다. -tt가 문제를 일으킬 수도 있나요?
  3. 아니면 이 작업을 수행하는 방법에 대한 내 생각이 처음부터 완전히 잘못된 것이었습니까?

다음과 같은 솔루션에 의지할 수는 없다는 점을 명심하세요.재직렬화PC가 Windows에서 실행되기 때문에 터널링을 위한 것입니다(이것이 바로 이 세부 사항이 중요한 이유입니다).

시간을 내어 이 기사를 읽어주셔서 감사합니다. 이 글을 다른 곳에 게시해야 하는지 알려주세요.

관련 정보