RS-232 проброс в локальной сети
Всем привет. Как реализовать решение на картинке. На первом PC работает SER2NET. Нужно настроить SOCAT на втором PC, чтобы получился виртуальный кабель в локальной сети.

Ответы (1 шт):
Автор решения: eri
→ Ссылка
Для первого ПЦ вот такую штуку делал на питоне.
import asyncio
import serial_asyncio
import sys
class Output(asyncio.Protocol):
def connection_made(self, transport):
self.transport = transport
self.tcp = None
print('port opened', transport)
transport.serial.rts = False # You can manipulate Serial object via transport
def data_received(self, data):
print('data received', repr(data))
if self.tcp:
self.tcp.write(data)
def connection_lost(self, exc):
print('port closed')
sys.exit(1)
def pause_writing(self):
print('pause writing')
print(self.transport.get_write_buffer_size())
def resume_writing(self):
print(self.transport.get_write_buffer_size())
print('resume writing')
def set_tcp(self, transport):
self.tcp = transport
class ProxyServerProtocol(asyncio.Protocol):
def __init__(self, serial):
self.serial = serial
def connection_made(self, transport):
peername = transport.get_extra_info('peername')
print('Connection from {}'.format(peername))
self.transport = transport
self.serial.set_tcp(transport)
def data_received(self, data):
self.serial.transport.write(data)
async def main(loop):
serial_transpot, serial_protocol = await serial_asyncio.create_serial_connection(loop, Output, sys.argv[1], baudrate=115200)
server = await loop.create_server(
lambda: ProxyServerProtocol(serial_protocol),
'0.0.0.0', 5555)
await server.wait_closed()
loop = asyncio.get_event_loop()
loop.run_until_complete(main(loop))
Сокат плохо ведет себя в реконнекте. Но вот так запускается и стабильно при стабильном эзернете.
PORT=$(readlink -f $1)
echo $PORT
while true; do
socat TCP-LISTEN:5555 $PORT,b115200,raw,echo=0 || sleep 1;
done;
Для второго ПЦ (тоже обернуть в while true)
socat TCP:192.168.0.1:5555 $PORT,b115200,raw,echo=0 || sleep 1;