RS-232 проброс в локальной сети

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


Ответы (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;
→ Ссылка