Linux проброс ком порта

Подключаем последовательные интерфейсы по IP

Последовательные интерфейсы RS-232/422/485 до сих пор очень популярны в промышленности: по ним подключаются диагностические порты, датчики, сканеры штрих-кодов и RFID меток и т.д. Однако последовательные интерфейсы имеют свои ограничения. Иногда возникает необходимость получить доступ к такому интерфейсу по IP-сети, или, например, иметь доступ к одному устройству с RS-232 с нескольких удаленных компьютеров одновременно, или объединить несколько удаленных объектов в одну шину RS-485.

Сервер последовательных интерфейсов конвертирует последовательные физические протоколы в IP-пакеты, и позволяет программно управлять ими — подключать удаленный виртуальный COM-порт к компьютеру по сети так, будто он подключен физически, и прозрачно соединять несколько устройств в режиме P2P, без использования компьютеров.

В статье мы разберем сервер последовательных интерфейсов Advantech EKI-1524, имеющий четыре последовательный порта, каждый из которых поддерживает протоколы RS-232/422/485, и два LAN-порта.

Сервер последовательных интерфейсов EKI-1524 имеет четыре порта DB9 и два LAN-порта.

  • Виртуальный COM-порт — позволяет программно эмулировать виртуальный COM-порт удаленного устройства на системе Linux.
  • Одновременное подключение нескольких клиентов — в режиме сервера дает возможность использовать один последовательный порт для нескольких устройств одновременно.
  • Работа в режиме P2P — одновременная работа в режиме клиента и сервера позволяет объединить несколько EKI-1524 напрямую, без использования серверов и компьютеров.

Характеристики

Серия последовательных серверов EKI-1500 представлена широким спектром устройств для различных задач. От серверов с одним последовательным портом: EKI-1511X до серверов на 16 портов, для монтажа в серверную стойку, таких как EKI-1526N.

Дополнительно представлены модели с повышенным уровнем защищенности, для работы в экстремальных условиях, и гальванической развязкой портов, для защиты от высоких напряжений: EKI-1522I, EKI-1524I, и другие.

Все модели поддерживают подключение двух источников питания. Переключение между источниками питания происходит без перезагрузки устройства. Реле индикации обрыва питания замыкается в случае, если на одной из линий отсутствует напряжение.

Виртуальный COM-порт

Сервер последовательных интерфейсов позволяет по TCP/IP получить доступ к удаленным устройствам таким образом, что для прикладного ПО это будет выглядеть так, будто устройства подключены к физическому COM-порту.

Принцип работы виртуального COM-порта по сети Ethernet

Для этого на стороне клиента используется модуль ядра Linux и программа для обмена данными с сервером последовательных интерфейсов. В итоге для пользователя такое подключение выглядит как физический порт (устройство /dev/ttyADV0).

Читайте также:  Internal server error apache2 linux

На данный момент Advantech выпускает драйвера виртуального COM-порта только для ОС Linux. Инструкция по сборке модуля ядра VCOM 2.0 на Ubuntu.
Также существуют бинарные пакеты драйвера под разные дистрибутивы: Linux Pseudo TTY

В веб-интерфейсе можно настроить параметры работы в данном режиме:

Дополнительные настройки. Можно вручную задать таймауты и т.д:

Настройки параметров последовательного интерфейса. В этом меню также можно изменить основной протокол (RS-232/422/485), для каждого порта.

Режим RFC 2217

Также доступен открытый протокол перенаправления COM-порта RFC 2217, представляющий собой расширенные команды для протокола Telnet. В этом режиме устройство принимает входящие подключения по TCP, в настройках можно указать порт для входящий соединений.

Режим P2P

Для сложных случаев, когда несколько устройств нельзя соединить напрямую, можно использовать два терминальных сервера в режиме прозрачного моста. Таким образом можно подключить удаленные устройства, используя в качестве транспорта TCP/IP.

Подключение двух удаленных устройств по последовательному протоколу через TCP/IP-транспорт

Таким образом можно программно переключать устройства между собой, соединять удаленные шины по RS-485 и делать много другое, используя все преимущества IP-сетей, включая радиомосты, виртуальные частные сети (VPN) и т.д. Передаваемые данные между двумя серверами можно дополнительно защитить от перехвата, используя шифрование на транспортном уровне.

Уведомления о событиях

Устройство позволяет настроить уведомления о событиях с помощью Email и SNMP Trap. MIB-файл для настройки SNMP-сервера доступен для каждого устройства.

События для уведомлений можно настроить вручную.

Логирование через Syslog

В веб-интерфейсе можно задать адрес удаленного Syslog-сервера для логирования. В лог записываются события подключения клиентов, ошибки аутентификации, статус LAN и последовательных портов и т.д.

Первичная настройка

Первичную конфигурацию сервера последовательных интерфейсов можно выполнить через утилиту EKI Device Configuration Utility. При этом утилита работает через ARP-пакеты и не требует настройки соответствующего IP-адреса на сетевом интерфейсе. Это значит, что можно задать любой IP-адрес устройству, без утраты доступа.

Заключение

Серверы последовательных интерфейсов позволяют обходить ограничения, которые накладывают физические протоколы, и легко масштабировать подключения. Режим P2P позволяет подключать устаревшие устройства, используя интернет в качестве транспорта, при этом обходиться без серверов.

Ссылки

Источник

Create a virtual serial port connection over TCP

I am developing an application that should be able to write to a virtual serial port and receive data through the same port from remote clients over network. The application runs on a linux server. I am new in using serial ports and I have some questions on this topic. Clients The client can establish a TCP connection to a server. When we setup a client, we have to provide the IP address of the server, a tcp port (usually 8080) and a virtual com port. The client then will automatically try to connect to the server. Server The server has a virtual com port, the same we set in the client config (e.g. COM1). When an application on the server writes data to this port, the data should be send to all clients connected via tcp. The response from the clients is send over TCP back to the server which can read it over the virtual serial port. Question On windows I used a virtual serial port connector http://www.eterlogic.com/Products.VSPE.html which did most of the work. However I want to solve this problem on linux machines. My question is, how can I create a TCP server that has a virtual serial port attached and can send/receive data through this port over TCP to listening clients?

Читайте также:  Самые лучшие дистрибутивы linux

3 Answers 3

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

socat creates TCP connection to 192.168.254.254:8080, so that everything, that will be written to /dev/virtualcom0 will be forwarded to 192.168.254.254:8080 and vice versa.

Another approach would be to use RFC2217 via ser2net on Linux sever side and RFC2217 driver on Windows side (for example http://www.hw-group.com/products/hw_vsp/index_en.html single port version). You can also try to get http://pyserial.sourceforge.net/ to work with ser2net.

Thanks, does this create the virtual com port? I think this just links an existing one to the tcp server. However, I already did what you say here superuser.com/questions/733552/… my problem is that I cannot write to the com port.

socat would create /dev/virtualcom0 , so this is a virtual port. I’m using socat with a VScom NET-CAN 110 device and it is working like a charm. The instructions are here.

and can you say what virtualcom0 would be on windows? If I want to connect from windows client to linux that has virtualcom0 port, what should I select on windwos, COM1, COM2.

you have socat and ser2net and other programs but my experience is very bad. not working properly. I’ve done this small python program, can be useful. Update port, baudrate. then use any tcp client. Remove first line if don’t want to use is as auto executable script

#!/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() 

Источник

Читайте также:  Who was logged in linux

/dev/blog

При такой схеме передаются данные, но не управляющая информация. Настройка виртуального терминала на хосте client никак не отражается на реальном терминале на хосте server. Это значит, что приложения, которые используют ioctl(2) или termios(3) , не будут работать так, как ожидается.

Способ 2: RFC 2217

Более сложный способ – использовать RFC 2217 для удаленного управления терминалом. Это расширение telnet, которое описывает передачу управляющей информации для последовательного порта.

Сервер

server$ ser2net -d -C '23:telnet:0:/dev/ttyS0'
server$ nc -l -p 23 -c '/usr/sbin/sredird 5 /dev/ttyS0 sredird.lock'

Клиент

client$ kermit -q C-Kermit>set carrier-watch off C-Kermit>telnet SERVER_IP

cyclades-serial-client – клиент для сервера RFC 2217. Он работает с помощью трюка с LD_PRELOAD .

  1. Виртуальный терминал /dev/pts/N .
  2. Символическая ссылка на него /dev/NAME .
  3. Локальный сокет /dev/NAME.control .

Настраиваем конфиг клиента /etc/cyclades-devices (без этого не будет работать трюк с LD_PRELOAD ):

/dev/mytty:prts:SERVER_IP:0:rfc2217:
client$ cyclades-ser-cli -d 3 -m 1 -x /dev/mytty SERVER_IP 0
client$ echo hello > /dev/mytty

Cообщение hello должен получить тот, кто подключен к порту /dev/ttyS0 на хосте server .
Проверяем настройку baud rate :

client$ export LD_PRELOAD=/usr/lib/libcyclades-ser-cli.so client$ stty -F /dev/mytty 38400
server$ stty -F /dev/ttyS0 speed 38400 baud; .

У меня этот клиент работает с сервером sredird , но не работает с ser2net .

  • Не все параметры ioctl() реализованы.
  • Подход с использованием LD_PRELOAD для ioctl() и tcgetattr() работает не для всех приложений. У меня так и не заработала команда setserial(8) .

And this is still something that should be done in userspace if necessary
by fixing up the tty layer to support pty/tty pair modem lines and
termios change reporting, or some kind of generic vt that can also
expose all the config other net protocols might need.

TTYredirector

TTYredirector реализует сервер и клиент RFC 2217, создавая на клиенте виртуальный терминал. Автоматического перенаправления управляющих команд с локального терминала на удаленный нет, его нужно настраивать вручную с помощью специальной утилиты, так что это решение подвержено тем же проблемам, что способ в socat .

Способ 3: Serial to Ethernet Converter

Serial to Ethernet Converter – устройство, преобразующее RS-232 (и/или другие протоколы) в Ethernet и обратно.

Источник

Оцените статью
Adblock
detector