socat: 스크립트, bashrc 또는 systemd에서 호출됩니까?

socat: 스크립트, bashrc 또는 systemd에서 호출됩니까?

socat을 사용하여 이더넷을 통해 직렬 명령을 이더넷 직렬 변환기(고정 IP 주소)로 보내고 싶습니다. socat을 시작하는 좋은 방법이 무엇인지 알고 싶습니다.

내가 이해한 바로는 systemd를 사용하면 socat이 항상 실행되고 있는지 확인하거나 실패할 경우 다시 시작하려고 시도할 수 있습니다. .service 파일은 다음과 같습니다.

[Service]
Type=simple
Restart=always
RestartSec=5

[Unit] 
Description=my socat test
User=me
Group=me

ExecStart=/bin/bash -c '~/my_socat.sh'

[Install]
WantedBy=multi-user.target

스크립트는 다음과 같습니다.

#!/bin/bash
socat PTY,link=/home/me/dev/valve1 TCP:192.168.11.101:5001 & socat PTY,link=/home/me/dev/valve2 TCP:192.168.11.101:5002

이 접근 방식이 내가 원하는 결과를 얻을 수 있을까요? 어떤 이유로 socat이 죽으면 다시 시작되나요? socat을 시작할 때 이더넷 연결을 사용할 수 없으면 어떻게 됩니까? 네트워크 연결 없이 셸에서 실행하면 작동하지 않으며 "네트워크에 액세스할 수 없습니다"라는 오류 메시지와 함께 명령이 실패합니다.

(Python) 스크립트를 실행하기 전에 socat이 실행되고 있는지 어떻게 확인해야 합니까? Python에서 socat을 시작해야 합니까?

답변1

스크립트를 통해 socat를 설정하는 방법을 알아보려면 이 문서와 요점을 참조하세요.

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

https://gist.github.com/krzyklo/e60793b27400be7a330042aa6bdf388a

socat -x -d -d pty,raw,echo=0,link=/tmp/cryocon_simulator pty,raw,echo=0,link=/tmp/cryocon

아래 스크립트는 링크에서 가져온 것이며 모든 것을 한곳에 가져옵니다.
my-serial.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())

client.py

import sys
import serial
DEFAULT_ADDR = '/tmp/cryocon'
DEFAULT_CMD = '*IDN?'
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 += '\n'
s = serial.serial_for_url(addr)
s.write(cmd.encode())
print(s.readline())

Emulator.py

import sys
import logging

import serial

DEFAULT_ADDR = '/tmp/cryocon_simulator'

logging.basicConfig(level=logging.INFO)

addr = sys.argv[1] if len(sys.argv) > 1 else DEFAULT_ADDR

conn = serial.serial_for_url(addr)
logging.info(f'Ready to receive requests on {addr}')
while True:
    request = conn.readline()
    logging.info('REQ: %r', request)
    request = request.strip().decode().lower()
    reply = 'Cryo-con,24C,305682,1.05A\n' if request == '*idn?' else 'NACK\n'
    reply = reply.encode()
    logging.info('REP: %r', reply)
    conn.write(reply)

관련 정보