Version 0.0.1 - Projektgrundlage und Buildsystem
This commit is contained in:
parent
941e4be3c8
commit
63b6ca42c8
8 changed files with 437 additions and 1 deletions
40
.gitignore
vendored
Normal file
40
.gitignore
vendored
Normal 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
30
CHANGELOG.md
Normal 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.
|
||||
81
README.md
81
README.md
|
|
@ -1,3 +1,82 @@
|
|||
# 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
|
||||
|
|
|
|||
23
cmd/rs2322tcp-client/main.go
Normal file
23
cmd/rs2322tcp-client/main.go
Normal 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)
|
||||
}
|
||||
24
cmd/rs2322tcp-server/main.go
Normal file
24
cmd/rs2322tcp-server/main.go
Normal 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
3
go.mod
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
module git.lang-dieter.de/rs2322tcp
|
||||
|
||||
go 1.22.2
|
||||
22
internal/version/version.go
Normal file
22
internal/version/version.go
Normal 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
215
scripts/build.sh
Executable 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}"
|
||||
Loading…
Reference in a new issue