From 63b6ca42c8a543dafca3284d065e416885d83ff6 Mon Sep 17 00:00:00 2001 From: Dieter Lang Date: Sun, 9 Aug 2026 18:50:25 +0200 Subject: [PATCH] Version 0.0.1 - Projektgrundlage und Buildsystem --- .gitignore | 40 +++++++ CHANGELOG.md | 30 +++++ README.md | 81 ++++++++++++- cmd/rs2322tcp-client/main.go | 23 ++++ cmd/rs2322tcp-server/main.go | 24 ++++ go.mod | 3 + internal/version/version.go | 22 ++++ scripts/build.sh | 215 +++++++++++++++++++++++++++++++++++ 8 files changed, 437 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 CHANGELOG.md create mode 100644 cmd/rs2322tcp-client/main.go create mode 100644 cmd/rs2322tcp-server/main.go create mode 100644 go.mod create mode 100644 internal/version/version.go create mode 100755 scripts/build.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9f9b114 --- /dev/null +++ b/.gitignore @@ -0,0 +1,40 @@ +# Build-Verzeichnis +/build/ + +# Lokale Build-Binaries +/rs2322tcp-client +/rs2322tcp-server + +# Go build artifacts +*.exe +*.exe~ +*.test +*.out + +# Coverage +coverage.out +coverage.html + +# Go workspace +go.work +go.work.sum + +# IDE / editor files +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS files +.DS_Store +Thumbs.db + +# Local configuration +config.local.json + +# Certificates and private keys +*.key +*.pem +*.crt +*.p12 diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..52cc599 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,30 @@ +# Changelog + +Alle wesentlichen Änderungen am Projekt werden in dieser Datei +dokumentiert. + +## [0.0.1] - Entwicklung + +### Added + +- Grundstruktur des Projekts `rs2322tcp` +- Go-Modul `git.lang-dieter.de/rs2322tcp` +- Client-Anwendung als separates Programm vorgesehen +- Server-Anwendung als separates Programm vorgesehen +- Gemeinsame interne Pakete für Konfiguration, Transport, serielle + Schnittstellen, Client, Server und Versionierung +- Unterstützung von Windows und Linux als gleichberechtigte + Client-Plattformen vorgesehen +- Raspberry Pi 5 als Server-Plattform vorgesehen +- TCP als Transport für RS232-Daten festgelegt +- Tailscale als vertrauenswürdiges Netzwerk vorgesehen +- TLS zunächst nicht vorgesehen +- UDP als möglicher zukünftiger Transport für Audio-Daten vorgesehen +- Logging/Sniffer-Funktion für Diagnose vorgesehen +- Einsatz von `socat` als Entwicklungs- und Diagnosewerkzeug vorgesehen + +### Status + +Die Version 0.0.1 enthält zunächst nur die Projektgrundlage. +Eine funktionierende RS232- oder Netzwerkübertragung ist noch +nicht implementiert. diff --git a/README.md b/README.md index 8b0fbdd..9d8f5c3 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,82 @@ # rs2322tcp -RS232-Verbindungen (serielle Schnittstelle) mittels Software-Konverter auf TCP (Internet) übertragen \ No newline at end of file +## Zweck + +`rs2322tcp` überträgt Daten zwischen seriellen RS232-Schnittstellen +und einem TCP/IP-Netzwerk. + +Das Projekt besteht aus einem Client und einem Server: + +- Der Client stellt auf einem lokalen Rechner eine virtuelle serielle + Schnittstelle für vorhandene Software bereit. +- Der Server läuft auf einem Raspberry Pi und stellt die dort + angeschlossenen echten RS232-Schnittstellen bereit. +- Die serielle Kommunikation wird transparent über TCP übertragen. + +Die vorhandene Software auf dem Client sowie die angeschlossenen +Geräte auf der Serverseite sollen dabei möglichst keinen Unterschied +zu einer direkten seriellen Verbindung feststellen. + +## Plattformen + +### Client + +Der Client soll gleichberechtigt auf folgenden Plattformen betrieben +werden können: + +- Windows +- Linux + +Die plattformspezifische Bereitstellung der virtuellen seriellen +Schnittstelle wird vom gemeinsamen Client-Kern getrennt. + +### Server + +Der Server ist zunächst für den Betrieb auf einem Raspberry Pi 5 +vorgesehen. + +Mehrere USB-to-RS232-Adapter können angeschlossen und über die +Konfiguration einzelnen Geräten zugeordnet werden. + +## Netzwerk + +Für die RS232-Datenübertragung wird TCP verwendet. + +Das Projekt geht zunächst davon aus, dass die beteiligten Rechner +über ein vertrauenswürdiges Tailscale-Netz miteinander verbunden sind. + +Eine zusätzliche TLS-Verschlüsselung ist deshalb zunächst nicht +vorgesehen. + +Für eine spätere Übertragung von Audio-Daten ist ein separates +Transportkonzept vorgesehen. Dafür soll UDP untersucht werden. + +## Konfiguration + +Client und Server erhalten jeweils eine eigene `config.json`. + +Darin werden unter anderem serielle Schnittstellen, Parameter, +Gerätebezeichnungen und Netzwerkparameter konfiguriert. + +## Diagnose und Logging + +Für Debugging und Diagnose soll eine Protokollierung des übertragenen +Datenverkehrs möglich sein. + +Dabei soll insbesondere eine Darstellung der übertragenen Bytes +möglich sein. + +`socat` kann während der Entwicklung und für Diagnosezwecke als +zusätzliches Werkzeug eingesetzt werden. + +## Versionierung + +Die Version des Programms wird über Git verwaltet und beim Build in +das Programm eingebunden. + +Die Entwicklung erfolgt schrittweise über versionierte Entwicklungs- +stände. + +## Lizenz + +GPLv3 diff --git a/cmd/rs2322tcp-client/main.go b/cmd/rs2322tcp-client/main.go new file mode 100644 index 0000000..b4d0ef3 --- /dev/null +++ b/cmd/rs2322tcp-client/main.go @@ -0,0 +1,23 @@ +/* +Package main implements the rs2322tcp client application. + +The client will provide a local virtual serial interface and +transparently transport serial data over TCP to the rs2322tcp server. + +At this stage the application only provides the basic program +structure and version information. + +Project: rs2322tcp +Module: git.lang-dieter.de/rs2322tcp +*/ +package main + +import ( + "fmt" + + "git.lang-dieter.de/rs2322tcp/internal/version" +) + +func main() { + fmt.Printf("rs2322tcp-client %s\n", version.Version) +} diff --git a/cmd/rs2322tcp-server/main.go b/cmd/rs2322tcp-server/main.go new file mode 100644 index 0000000..f6b367b --- /dev/null +++ b/cmd/rs2322tcp-server/main.go @@ -0,0 +1,24 @@ +/* +Package main implements the rs2322tcp server application. + +The server will provide the network endpoint for rs2322tcp clients +and connect incoming connections to configured physical RS232 +interfaces. + +At this stage the application only provides the basic program +structure and version information. + +Project: rs2322tcp +Module: git.lang-dieter.de/rs2322tcp +*/ +package main + +import ( + "fmt" + + "git.lang-dieter.de/rs2322tcp/internal/version" +) + +func main() { + fmt.Printf("rs2322tcp-server %s\n", version.Version) +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..10e3e44 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module git.lang-dieter.de/rs2322tcp + +go 1.22.2 diff --git a/internal/version/version.go b/internal/version/version.go new file mode 100644 index 0000000..1993d95 --- /dev/null +++ b/internal/version/version.go @@ -0,0 +1,22 @@ +/* +Package version provides build-time version information for rs2322tcp. + +The variables are normally overwritten during the build using the +Go linker (-ldflags). Development builds use default values. + +Project: rs2322tcp +Module: git.lang-dieter.de/rs2322tcp +*/ +package version + +// Version contains the application version. +var Version = "dev" + +// Build contains the Git build number. +var Build = "0" + +// Commit contains the short Git commit ID. +var Commit = "unknown" + +// Date contains the build date and time. +var Date = "unknown" diff --git a/scripts/build.sh b/scripts/build.sh new file mode 100755 index 0000000..4e2e5fb --- /dev/null +++ b/scripts/build.sh @@ -0,0 +1,215 @@ +#!/bin/bash +# +# ============================================================================ +# Projekt.....: rs2322tcp +# Datei.......: build.sh +# +# Copyright (C) 2026 Dieter Lang +# +# SPDX-License-Identifier: GPL-3.0-or-later +# +# Beschreibung: +# Erstellt die Linux- und Windows-Builds des Projektes. +# +# Die Versionsinformationen werden aus Git ermittelt und beim Build +# über den Go-Linker in die Binärdateien eingebettet. +# +# Gebaut werden: +# - Linux amd64: Client und Server +# - Linux arm64: Server +# - Windows amd64: Client +# ============================================================================ +# + +set -e + +PROJECT=$(basename "$(pwd)") +BUILDDIR="build" +MODULE=$(go list -m) + +############################################################################## +# Farben +############################################################################## + +RED="\033[1;31m" +GREEN="\033[1;32m" +BLUE="\033[1;34m" +YELLOW="\033[1;33m" +RESET="\033[0m" + +############################################################################## +# Zeitmessung +############################################################################## + +START=$(date +%s) + +############################################################################## +# Projektinformationen +############################################################################## + +VERSION=$(git describe --tags --always 2>/dev/null || echo "dev") +BUILD=$(git rev-list --count HEAD 2>/dev/null || echo "0") +BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown") +COMMIT=$(git rev-parse --short HEAD 2>/dev/null || echo "unknown") +GO_VERSION=$(go version | awk '{print $3}') +HOST=$(hostname) +DATE=$(date "+%Y-%m-%dT%H:%M:%S") + +############################################################################## + +echo +echo -e "${BLUE}" +echo "============================================================" +echo " ${PROJECT} Build Script" +echo "============================================================" +echo -e "${RESET}" + +printf "%-12s %s\n" "Projekt:" "$PROJECT" +printf "%-12s %s\n" "Version:" "$VERSION" +printf "%-12s %s\n" "Build:" "$BUILD" +printf "%-12s %s\n" "Branch:" "$BRANCH" +printf "%-12s %s\n" "Commit:" "$COMMIT" +printf "%-12s %s\n" "Go:" "$GO_VERSION" +printf "%-12s %s\n" "Host:" "$HOST" +printf "%-12s %s\n" "Datum:" "$DATE" + +echo + +############################################################################## +# Formatieren +############################################################################## + +echo -e "${YELLOW}Formatiere Quellcode ...${RESET}" +gofmt -w . + +############################################################################## +# Tests +############################################################################## + +echo -e "${YELLOW}Starte Tests ...${RESET}" +go test ./... + +############################################################################## +# Module bereinigen +############################################################################## + +echo -e "${YELLOW}Bereinige Module ...${RESET}" +go mod tidy + +############################################################################## +# Build-Verzeichnis +############################################################################## + +echo -e "${YELLOW}Erzeuge Build-Verzeichnis ...${RESET}" + +rm -rf "${BUILDDIR}" +mkdir -p "${BUILDDIR}" + +############################################################################## +# Linker-Optionen +############################################################################## + +LDFLAGS="-s -w \ +-X '${MODULE}/internal/version.Version=${VERSION}' \ +-X '${MODULE}/internal/version.Build=${BUILD}' \ +-X '${MODULE}/internal/version.Commit=${COMMIT}' \ +-X '${MODULE}/internal/version.Date=${DATE}'" + +############################################################################## +# Buildfunktion +############################################################################## + +build_target() { + + GOOS=$1 + GOARCH=$2 + TARGET=$3 + PROGRAM=$4 + OUTPUT=$5 + + echo + echo -e "${BLUE}Baue ${PROGRAM} für ${TARGET}${RESET}" + + mkdir -p "${BUILDDIR}/${TARGET}" + + GOOS="${GOOS}" \ + GOARCH="${GOARCH}" \ + CGO_ENABLED=0 \ + go build \ + -trimpath \ + -ldflags="${LDFLAGS}" \ + -o "${BUILDDIR}/${TARGET}/${OUTPUT}" \ + "./cmd/${PROGRAM}" + + ( + cd "${BUILDDIR}/${TARGET}" + sha256sum "${OUTPUT}" > "${OUTPUT}.sha256" + ) + + SIZE=$(stat -c%s "${BUILDDIR}/${TARGET}/${OUTPUT}") + SIZE_MB=$(awk "BEGIN {printf \"%.2f\", ${SIZE}/1024/1024}") + + echo -e "${GREEN}OK${RESET}" + echo "Größe : ${SIZE_MB} MB" +} + +############################################################################## +# Linux amd64 +############################################################################## + +build_target linux amd64 linux-amd64 \ + rs2322tcp-client rs2322tcp-client + +build_target linux amd64 linux-amd64 \ + rs2322tcp-server rs2322tcp-server + +############################################################################## +# Linux arm64 +############################################################################## + +build_target linux arm64 linux-arm64 \ + rs2322tcp-server rs2322tcp-server + +############################################################################## +# Windows amd64 +############################################################################## + +build_target windows amd64 windows-amd64 \ + rs2322tcp-client rs2322tcp-client.exe + +############################################################################## +# Abschluss +############################################################################## + +END=$(date +%s) +RUNTIME=$((END-START)) + +TARGETS=4 +FILES=$(find "${BUILDDIR}" -type f | wc -l) + +echo +echo -e "${BLUE}" +echo "============================================================" +echo "Zusammenfassung" +echo "============================================================" +echo -e "${RESET}" + +printf "%-12s %s\n" "Targets:" "$TARGETS" +printf "%-12s %s\n" "Dateien:" "$FILES" +printf "%-12s %s\n" "Builddauer:" "${RUNTIME} Sekunden" + +echo +echo -e "${BLUE}" +echo "============================================================" +echo "Erzeugte Build-Dateien" +echo "============================================================" +echo -e "${RESET}" + +find "${BUILDDIR}" -type f | sort + +echo +echo -e "${GREEN}" +echo "============================================================" +echo "Alle Builds erfolgreich abgeschlossen." +echo "============================================================" +echo -e "${RESET}"