Создайте соединение виртуального последовательного порта через TCP

Я разрабатываю приложение, которое должно иметь возможность записи в виртуальный последовательный порт и получать данные через тот же порт от удаленных клиентов по сети.

Приложение работает на сервере Linux. Я новичок в использовании последовательных портов, и у меня есть несколько вопросов по этой теме.

клиенты

Клиент может установить TCP-соединение с сервером. Когда мы настраиваем клиента, мы должны предоставить IP-адрес сервера, TCP-порт (обычно 8080) и виртуальный COM-порт.

Затем клиент автоматически попытается подключиться к серверу.

сервер

На сервере есть виртуальный com-порт, который мы установили в конфигурации клиента (например, COM1). Когда приложение на сервере записывает данные в этот порт, данные должны быть отправлены всем клиентам, подключенным через tcp. Ответ от клиентов отправляется через TCP обратно на сервер, который может прочитать его через виртуальный последовательный порт.

Вопрос

В Windows я использовал разъем виртуального последовательного порта http://www.eterlogic.com/Products.VSPE.html который выполнял большую часть работы. Однако я хочу решить эту проблему на машинах Linux.

У меня вопрос: как я могу создать TCP-сервер, к которому подключен виртуальный последовательный порт и который может отправлять / получать данные через этот порт по TCP для прослушивающих клиентов?

2 ответа

Решение

Попробуй сокат. Возможный сценарий:

socat  pty,link=/dev/virtualcom0,raw  tcp:192.168.254.254:8080&

socat создает TCP-соединение с 192.168.254.254:8080, так что все, что будет записано в /dev/virtualcom0, будет перенаправлено на 192.168.254.254:8080 и наоборот.

Другой подход заключается в использовании RFC2217 через ser2net на стороне сервера Linux и драйвера RFC2217 на стороне Windows (например, http://www.hw-group.com/products/hw_vsp/index_en.html версия с одним портом). Вы также можете попробовать заставить http://pyserial.sourceforge.net/ работать с ser2net.

У вас есть socat, ser2net и другие программы, но мой опыт очень плох... не работает должным образом. Я сделал эту небольшую программу на Python, может быть полезно. Обновите порт, скорость передачи... затем используйте любой клиент tcp. Удалите первую строку, если не хотите использовать ее как автоматически исполняемый скрипт

#!/usr/bin/python

import socket
import sys
import serial

#open serial port
ser = serial.Serial('/dev/ttyAMA0', 115200, timeout=0)
#create socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)

#bond to the port. Don't use localhost to accept external connections
server_address = ('', 2105)
print('starting up on {} port {}'.format(*server_address))
sock.bind(server_address)

#listen
sock.listen(1)

#loop
while True:
    #waits for a new connection
    print('waiting for a connection')
    connection, client_address = sock.accept()
    try:
        print('connection from', client_address)
        #continously send from serial port to tcp and viceversa
        connection.settimeout(0.1)
        while True:
            try:
                data = connection.recv(16)
                if data == '': break
                ser.write(data)
            except KeyboardInterrupt:
                connection.close()
                sys.exit()
            except Exception as e:
                pass
            received_data = ser.read(ser.inWaiting())
            connection.sendall(received_data)
    except Exception as e:
        print e

    finally:
        #clean up connection
        connection.close()

Программное обеспечение поможет установить соединение с сервером и клиентом через TCP http://www.serial-com-port.com/

Я использую его для создания виртуальной последовательной связи по сети, но у меня есть настоящий порт RS232 на компьютере. Поэтому я просто передаю данные по сети. Если вам нужно создать виртуальный COM на сервере, используйте драйвер виртуального последовательного порта.

Другие вопросы по тегам