Version 0.0.1 - Projektgrundlage und Buildsystem

This commit is contained in:
Dieter Lang 2026-08-09 18:50:25 +02:00
parent 941e4be3c8
commit 63b6ca42c8
8 changed files with 437 additions and 1 deletions

40
.gitignore vendored Normal file
View file

@ -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

30
CHANGELOG.md Normal file
View file

@ -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.

View file

@ -1,3 +1,82 @@
# rs2322tcp # rs2322tcp
RS232-Verbindungen (serielle Schnittstelle) mittels Software-Konverter auf TCP (Internet) übertragen ## 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

View file

@ -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)
}

View file

@ -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)
}

3
go.mod Normal file
View file

@ -0,0 +1,3 @@
module git.lang-dieter.de/rs2322tcp
go 1.22.2

View file

@ -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"

215
scripts/build.sh Executable file
View file

@ -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}"