Промышленная автоматизация и IoT
ELX-Serial
Одно последовательное устройство — несколько сетевых клиентов
Мост между TCP-портом и последовательным портом Linux. Один процесс держит одно устройство — встроенный порт, USB-переходник, псевдотерминал — и отдаёт его нескольким сетевым клиентам одновременно. Поверх сокета никакого протокола нет: байты идут в обе стороны как есть.
Несколько клиентов на одну линию
Последовательный порт может открыть одна программа за раз. Мост открывает его однажды и пускает через него несколько сетевых клиентов — это разница между «по очереди» и «система мониторинга работает рядом с вашим терминалом».
Байты без изменений
Ничего не кадрируется, не экранируется, не собирается в строки и не интерпретируется. Что пришло в сокет — то ушло в устройство, что сказало устройство — то ушло обратно. Поэтому работает любой протокол, включая тот, который никто не описал.
Сторож, который переоткрывает порт
При включённом опросе замолчавшая линия проверяется; три пропущенных ответа — и порт закрывается и открывается заново с повторным применением настроек. Около двадцати секунд от молчания до снова работающего порта, и никого не нужно вызывать на объект.
Помещается на любую плату
Написан на 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
Как ведёт себя сторож
Сторож существует ради порта, который перестаёт работать, ничего об этом не сообщая, — залипшего преобразователя, драйвера, потерявшего устройство. Ошибки нет; данные просто перестают приходить.
- Один опрос уходит сразу при запуске, поэтому порт, мёртвый с первой секунды, обнаруживается немедленно, а не через минуту.
- Дальше опрос отправляется каждый раз, когда с устройства ничего не приходило заданное время. Пока клиент активно разговаривает, линия занята и опрос не идёт — влезть в середину чужой транзакции он не может.
- Ответа ждём две секунды. Не дождались — промах, повтор через пять.
- Три промаха подряд закрывают и открывают порт, повторно применяют настройки и возобновляют опрос. От начала молчания до нового порта проходит около двадцати секунд.
Ответ, совпавший по всем полям, но с флагом ошибки, всё равно доказывает, что контроллер жив: это пишется в журнал предупреждением, а порт не трогается.
Коротко о главном
- Операционная система
- Linux
- Архитектуры
- armhf (основная), arm64, amd64, x86
- Windows
- Не поддерживается
- Написан на
- C — только компилятор и libc
- Порт по умолчанию
- 23000
- Клиентов по умолчанию
- 4
- Устройства
- Встроенные порты, USB-переходники, /dev/ptmx
- Служба
- Работает под systemd
Частые вопросы
Есть ли сборка для Windows?
Что будет, если два клиента отправят что-то одновременно?
Нужен ли root?
dialout, а не root.Может ли он подключаться сам, а не слушать?
Не мешает ли сторож моему протоколу?
ELX-Serial
Одно последовательное устройство — несколько сетевых клиентов
Скоро