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を起動したときにEthernet接続が利用できない場合はどうなりますか?ネットワーク接続なしでシェルで実行すると機能しなくなり、「ネットワークにアクセスできません」というエラーメッセージが表示され、コマンドは失敗します。

(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

以下のスクリプトはリンクから取得され、すべてを1か所にインポートします。
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)

おすすめ記事