RS232-Verbindungen (serielle Schnittstelle) mittels Software-Konverter auf TCP (Internet) übertragen
Find a file
2026-08-10 12:42:22 +02:00
cmd Add Linux PTY support and device simulator 2026-08-10 12:42:22 +02:00
configs Implement server-side RS232 data transport 2026-08-10 10:38:14 +02:00
internal Add Linux PTY support and device simulator 2026-08-10 12:42:22 +02:00
scripts Version 0.0.1 - Projektgrundlage und Buildsystem 2026-08-09 18:50:25 +02:00
.gitignore Implement server-side RS232 data transport 2026-08-10 10:38:14 +02:00
CHANGELOG.md Add Linux PTY support and device simulator 2026-08-10 12:42:22 +02:00
go.mod Implement server-side RS232 data transport 2026-08-10 10:38:14 +02:00
go.sum Implement server-side RS232 data transport 2026-08-10 10:38:14 +02:00
LICENSE Initial commit 2026-08-09 17:55:34 +02:00
README.md Add Linux PTY support and device simulator 2026-08-10 12:42:22 +02:00

rs2322tcp

rs2322tcp ermöglicht die transparente Übertragung von RS232-Daten über TCP/IP.

Das Projekt ist für den Einsatz geeignet, bei dem eine vorhandene Software eine serielle Schnittstelle erwartet, das zugehörige Gerät sich jedoch an einem entfernten Standort befindet.

Ziel

Auf der Client-Seite soll vorhandene Hersteller-Software eine normale serielle Schnittstelle vorfinden.

Die Daten werden vom rs2322tcp-client über TCP an einen entfernten rs2322tcp-server übertragen. Der Server verbindet die Netzwerkverbindung mit einer realen seriellen Schnittstelle.

Damit sollen weder die vorhandene Software auf dem Client noch die angeschlossenen Geräte auf der Remote-Seite erkennen müssen, dass die Verbindung über ein Netzwerk erfolgt.

Typische Anwendungen sind beispielsweise:

  • Funkgeräte mit CAT-Steuerung
  • Antennenrotoren mit herstellerspezifischen seriellen Protokollen
  • andere Geräte, die über RS232 gesteuert werden

Architektur

Client-PC                              Raspberry Pi 5
─────────────────                     ─────────────────

Hersteller-Software                   rs2322tcp-server
       │                                      │
       │ virtuelle                           │
       │ serielle Schnittstelle              │
       ▼                                      │
rs2322tcp-client                             │
       │                                      │
       └──────────── TCP/IP ──────────────────┘
                                              │
                                   ┌──────────┴──────────┐
                                   │                     │
                              USB-to-RS232          USB-to-RS232
                                   │                     │
                               Funkgerät              Rotor

Aktueller Server-Datenpfad

Die serverseitige TCP-/RS232-Verbindung ist implementiert:

TCP-Control
     │
     ▼
  Session
     │
     ├── Gerät 1 ──► dynamischer Data-Port
     │                    │
     │                    ▼
     │               TCP Data
     │                    │
     │                    ▼
     │              Serial Layer
     │                    │
     │                    ▼
     │                 RS232
     │
     └── Gerät 2 ──► dynamischer Data-Port

Die serielle Schnittstelle wird erst geöffnet, wenn ein Client tatsächlich eine Data-Verbindung zum entsprechenden dynamischen TCP-Port aufbaut.

Pro konfiguriertem Gerät ist nur eine aktive Data-Verbindung vorgesehen.

Die Datenübertragung erfolgt bidirektional:

TCP ───────────────► RS232
TCP ◄────────────── RS232

Client

Der Client soll gleichberechtigt unter folgenden Betriebssystemen eingesetzt werden können:

  • Windows
  • Linux

Die plattformspezifische Bereitstellung der virtuellen seriellen Schnittstelle wird vom gemeinsamen Client-Kern getrennt.

Unter Linux ist die virtuelle serielle Schnittstelle inzwischen über einen direkt aus Go erzeugten PTY implementiert. Die Implementierung verwendet /dev/ptmx und stellt den zugehörigen PTY-Slave unter /dev/pts/N bereit.

Die PTY-Schnittstelle wird im Raw Mode betrieben. Dadurch werden die übertragenen Daten als transparenter Byte-Strom behandelt.

Die allgemeine Client-Logik verwendet dafür die Abstraktion VirtualSerial. Die Linux-spezifische Implementierung ist von dieser Abstraktion getrennt.

Für die PTY-Funktion ist keine externe Laufzeitabhängigkeit wie socat erforderlich.

Server

Der Server ist zunächst für den Betrieb auf einem Raspberry Pi 5 vorgesehen.

Mehrere USB-to-RS232-Adapter können angeschlossen werden. Anzahl, Bezeichnung und serielle Parameter der Anschlüsse werden über eine Konfigurationsdatei festgelegt.

Die serverseitige Serial-Kommunikation verwendet go.bug.st/serial.

Serielle Schnittstelle

Für die Ansteuerung der seriellen Schnittstellen wird derzeit verwendet:

go.bug.st/serial v1.7.1

Die Bibliothek wurde zusätzlich auf dem privaten Git-Server des Projektes gespiegelt, um bei einem Ausfall des ursprünglichen Anbieters weiterhin auf den verwendeten Quellstand zugreifen zu können:

git.lang-dieter.de/third-party/go-serial

Die verwendete Version v1.7.1 ist auf dem Backup-Repository einschließlich Git-Tag vorhanden.

Netzwerk

Für die Übertragung der RS232-Daten wird TCP verwendet.

Die beteiligten Systeme werden zunächst über ein vertrauenswürdiges Tailscale-Netz verbunden.

Eine zusätzliche TLS-Verschlüsselung ist deshalb derzeit nicht vorgesehen.

Für eine spätere Übertragung von Audio-Daten ist ein separates Netzwerk-/Transportkonzept vorgesehen. Hierfür soll UDP verwendet bzw. untersucht werden.

Konfiguration

Client und Server erhalten jeweils eine eigene JSON-Konfiguration.

Über die Konfiguration werden unter anderem festgelegt:

  • Netzwerkparameter
  • serielle Schnittstelle
  • Baudrate
  • Datenbits
  • Parität
  • Stopbits
  • Bezeichnung des Gerätes
  • weitere für die jeweilige Schnittstelle erforderliche Parameter

Die konkrete Konfigurationsstruktur befindet sich in der Entwicklung.

Diagnose und Logging

Für Debugging und Diagnose soll eine Protokollierung des übertragenen Datenverkehrs möglich sein.

Insbesondere soll eine Darstellung der übertragenen Bytes möglich sein, um Probleme bei der Kommunikation zwischen Hersteller-Software und Gerät analysieren zu können.

Während der Entwicklung kann socat als zusätzliches Werkzeug für Tests und Diagnose eingesetzt werden.

Virtuelle serielle Schnittstelle unter Linux

Für den Linux-Client wird die virtuelle serielle Schnittstelle direkt über den Linux-PTY-Mechanismus erzeugt.

Dabei entsteht ein PTY-Paar:

/dev/ptmx
    │
    ▼
PTY Master
    │
    ↕
PTY Slave
    │
    ▼
/dev/pts/N

Die externe Hersteller-Software arbeitet mit dem PTY-Slave /dev/pts/N. Der rs2322tcp-client verwendet den PTY-Master und transportiert die Bytes über TCP zum Server.

Die PTY-Implementierung arbeitet im Raw Mode und wurde mit einem vollständigen Bytebereich von 0x00 bis 0xFF geprüft.

Dabei wurde die bidirektionale Übertragung aller 256 möglichen Bytewerte erfolgreich getestet.

Geräte-Simulator

Das Programm rs2322tcp-device-sim dient als Simulator für ein an der seriellen Schnittstelle angeschlossenes Gerät.

Der Simulator ist bewusst als eigenständiges Programm ausgeführt. Der rs2322tcp-server muss nicht wissen, ob am seriellen Port ein echtes Gerät oder der Simulator angeschlossen ist.

Der aktuelle Simulator kann eine serielle Schnittstelle öffnen und empfangene Rohdaten als Hexdump anzeigen.

Beispiel:

rs2322tcp-device-sim -port /dev/pts/7

Beispielausgabe:

rs2322tcp-device-sim
Port: /dev/pts/7
Warte auf Daten ...

12:34:01.123 RX  5 Bytes
          46 41 00 10 0D

Die Daten werden zunächst nicht interpretiert. Dadurch kann der Simulator auch zum Beobachten unbekannter serieller Protokolle verwendet werden.

Der Simulator soll insbesondere auch als Sniffer dienen können, wenn externe Hersteller-Software untersucht werden soll. Dadurch lassen sich die von einer Software gesendeten seriellen Kommandos zunächst als Rohdaten beobachten.

Geplante Erweiterungen sind:

  • manuelles Senden von Rohbytes
  • Anzeige von RX und TX
  • automatische Geräteantworten
  • Protokollsimulation
  • Aufzeichnung und Wiedergabe von Datenströmen

Tests

Die wichtigsten Komponenten verfügen über automatisierte Tests.

Der aktuelle Stand wird unter anderem mit folgenden Befehlen geprüft:

go test ./...

und:

go test -race ./...

Der Race Detector wird eingesetzt, um Probleme bei der nebenläufigen Verarbeitung von Sessions, Data-Listenern und DataConnections zu erkennen.

Die Linux-PTY-Komponente verfügt über einen automatisierten bidirektionalen Byte-Test.

Dabei werden alle 256 möglichen Bytewerte übertragen:

00 01 02 03 ... FD FE FF

Geprüft werden beide Richtungen:

PTY-Slave → Client
Client → PTY-Slave

Für den Integrationstest des Client-/Server-Datenpfades werden virtuelle serielle Schnittstellen verwendet. Während der Entwicklung kann hierfür socat eingesetzt werden.

Damit kann der Datenpfad ohne angeschlossene RS232-Hardware getestet werden.

Projektstruktur

rs2322tcp/
├── cmd/
│   ├── rs2322tcp-client/
│   ├── rs2322tcp-device-sim/
│   └── rs2322tcp-server/
├── configs/
├── docs/
├── internal/
│   ├── client/
│   ├── config/
│   ├── serial/
│   ├── server/
│   ├── transport/
│   └── version/
├── scripts/
│   └── build.sh
├── CHANGELOG.md
├── LICENSE
├── README.md
└── go.mod

Build

Der Build erfolgt über das zentrale Build-Skript:

./scripts/build.sh

Das Skript führt unter anderem folgende Schritte aus:

  • Formatierung des Go-Quellcodes
  • Ausführung der Tests
  • Bereinigung der Go-Module
  • Ermittlung der Git-Versionsinformationen
  • Build der vorgesehenen Zielplattformen
  • Einbettung der Versionsinformationen über den Go-Linker
  • Erzeugung von SHA256-Prüfsummen

Aktuell werden folgende Builds erzeugt:

  • Linux amd64 -- Client und Server
  • Linux arm64 -- Server
  • Linux armv7 -- Server
  • Linux armv6 -- Server

Versionierung

Die Versionierung erfolgt über Git.

Die Git-Informationen werden beim Build in die Binärdateien eingebettet. Neben der Version werden unter anderem Build-Nummer, Commit und Build-Datum erfasst.

Release-Versionen werden über Git-Tags gekennzeichnet.

Entwicklungsstand

Das Projekt befindet sich weiterhin in der frühen Entwicklungsphase.

Die ursprüngliche Projektgrundlage aus Version 0.0.1 wurde inzwischen um eine funktionierende serverseitige TCP-/RS232-Datenübertragung und die clientseitige Grundlage für virtuelle serielle Schnittstellen erweitert.

Implementiert und getestet sind derzeit:

  • Server-Control-Verbindung
  • Session-Verwaltung
  • dynamische Data-Ports
  • DataConnection
  • bidirektionale TCP-/RS232-Datenübertragung
  • Serial-Abstraktion
  • Konfiguration der seriellen Parameter
  • Client-Control-Verbindung
  • Client-DataConnection
  • Client-Integrationstests
  • Linux-PTY-Abstraktion
  • Linux-PTY im Raw Mode
  • automatisierter bidirektionaler 256-Byte-PTY-Test
  • nebenläufigkeitssichere Data-Listener
  • Race-Detection
  • eigenständiger Geräte-Simulator mit RX-Hexdump

Noch nicht vollständig implementiert sind insbesondere:

  • die vollständige Anbindung der virtuellen seriellen Schnittstelle an den produktiven Client-Anwendungsdatenpfad
  • die Windows-Implementierung der virtuellen seriellen Schnittstelle
  • TX-Funktion des Geräte-Simulators
  • automatische Geräteantworten und Protokollsimulation

Lizenz

GPL-3.0-or-later