ELXSoftware

Промышленная автоматизация и IoT

ELX-Serial

Одно последовательное устройство — несколько сетевых клиентов

Мост между TCP-портом и последовательным портом Linux. Один процесс держит одно устройство — встроенный порт, USB-переходник, псевдотерминал — и отдаёт его нескольким сетевым клиентам одновременно. Поверх сокета никакого протокола нет: байты идут в обе стороны как есть.

v1.6 LinuxARM Бесплатно

Несколько клиентов на одну линию

Последовательный порт может открыть одна программа за раз. Мост открывает его однажды и пускает через него несколько сетевых клиентов — это разница между «по очереди» и «система мониторинга работает рядом с вашим терминалом».

Байты без изменений

Ничего не кадрируется, не экранируется, не собирается в строки и не интерпретируется. Что пришло в сокет — то ушло в устройство, что сказало устройство — то ушло обратно. Поэтому работает любой протокол, включая тот, который никто не описал.

Сторож, который переоткрывает порт

При включённом опросе замолчавшая линия проверяется; три пропущенных ответа — и порт закрывается и открывается заново с повторным применением настроек. Около двадцати секунд от молчания до снова работающего порта, и никого не нужно вызывать на объект.

Помещается на любую плату

Написан на C, нужны только компилятор и libc. Основная цель — 32-разрядный одноплатник, но amd64 и arm64 работают точно так же.

Рассчитан на месяцы работы

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

Слушать или звонить самому

Обычно мост слушает TCP-порт. Он умеет и наоборот — подключаться наружу к указанной машине: так устройство за роутером само дотягивается до сервера, а не ждёт, пока дотянутся до него.

Для чего это

Изначальная задача — контроллер умного дома на /dev/ttyS1, до которого нужно было добираться по сети на порту 1824: и системе автоматизации, и диагностической программе, и тому, кто разбирается с неисправностью, — одновременно.

  • Дотянуться до последовательного устройства с другой машины или сразу с нескольких.
  • Оставить подключённой систему мониторинга, пока инженер работает с тем же устройством.
  • Вывести старый прибор с RS-232 в сеть, не покупая аппаратный сервер последовательных портов.
  • Выставить псевдотерминал так, чтобы программа, требующая порт, разговаривала через сеть.

Командная строка

Запуск
elxserial [ключи] устройство
КлючЗначение
-p портTCP-порт, по умолчанию 23000
-s "настройки"Настройки порта в стиле stty, например "115200 raw"
-k секундПериод сторожевого опроса; 0, по умолчанию, — выключен
-m числоМаксимум одновременных клиентов, по умолчанию 4
-r машинаРаботать клиентом: подключаться наружу, а не слушать порт
-l имяДля /dev/ptmx: создать симлинк на ведомую сторону
-wТолько писать в устройство; несовместим со сторожем
-x уровеньОтладочный вывод: 0, 1 или 2
Боевой запуск
elxserial -m 5 -p 1824 -s "115200 raw" -k 60 /dev/ttyS1

Как ведёт себя сторож

Сторож существует ради порта, который перестаёт работать, ничего об этом не сообщая, — залипшего преобразователя, драйвера, потерявшего устройство. Ошибки нет; данные просто перестают приходить.

  1. Один опрос уходит сразу при запуске, поэтому порт, мёртвый с первой секунды, обнаруживается немедленно, а не через минуту.
  2. Дальше опрос отправляется каждый раз, когда с устройства ничего не приходило заданное время. Пока клиент активно разговаривает, линия занята и опрос не идёт — влезть в середину чужой транзакции он не может.
  3. Ответа ждём две секунды. Не дождались — промах, повтор через пять.
  4. Три промаха подряд закрывают и открывают порт, повторно применяют настройки и возобновляют опрос. От начала молчания до нового порта проходит около двадцати секунд.
Почему ответ узнаваемУ каждого опроса свой идентификатор, меняющийся каждый раз, и контроллер возвращает его без изменений. Запоздавший ответ на прошлый опрос поэтому нельзя принять за ответ на текущий. Пакет считается своим, только если совпали разделитель, версия, флаг, идентификатор, заявленная длина, команда и контрольная сумма, — и такой пакет изымается из потока, поэтому служебного трафика сетевые клиенты не видят.

Ответ, совпавший по всем полям, но с флагом ошибки, всё равно доказывает, что контроллер жив: это пишется в журнал предупреждением, а порт не трогается.

Коротко о главном

Операционная система
Linux
Архитектуры
armhf (основная), arm64, amd64, x86
Windows
Не поддерживается
Написан на
C — только компилятор и libc
Порт по умолчанию
23000
Клиентов по умолчанию
4
Устройства
Встроенные порты, USB-переходники, /dev/ptmx
Служба
Работает под systemd

Частые вопросы

Есть ли сборка для Windows?
Нет. Программа построена вокруг терминального интерфейса POSIX и того, как Linux показывает последовательные устройства; версия для Windows была бы не портом, а другой программой.
Что будет, если два клиента отправят что-то одновременно?
Оба потока дойдут до устройства, потому что мост не арбитрирует протокол, о котором ничего не знает. Если ваш протокол этого не терпит, пусть пишет один клиент, а остальные только слушают — для этого и есть режим «только запись» и клиенты, которые просто ничего не отправляют.
Нужен ли root?
Для сборки нет. Для открытия устройства нужен доступ к нему, а это обычно членство в группе dialout, а не root.
Может ли он подключаться сам, а не слушать?
Да. Укажите машину, и он будет звонить наружу: так устройство за роутером без публичного адреса дотягивается до центрального сервера.
Не мешает ли сторож моему протоколу?
Нет. Он опрашивает, только когда линия молчала, и изымает свои ответы из потока раньше, чем их увидят клиенты.

ELX-Serial

Одно последовательное устройство — несколько сетевых клиентов

Скоро

Рядом в разделе