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を設定する方法については、この記事とポイントを参照してください。
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)