CRP's Tech-Blog
Rust Projekt: CRPs Haushaltsbuch
17.03.2025
Im Jahr 2024 habe ich mir das Ziel gesetzt, meine Kenntnisse in der Systemprogrammiersprache Rust zu vertiefen. Am effektivsten lerne ich eine neue Sprache, indem ich ein praktisches Projekt entwickle, das sowohl herausfordernd als auch praxisnah ist. Die Wahl fiel auf ein Haushaltsbuch, da es zahlreiche technische Aspekte abdeckt, darunter die Entwicklung einer Benutzeroberfläche, die Verarbeitung und Speicherung von Finanzdaten sowie die plattformübergreifende Bereitstellung der Anwendung.
In diesem Artikel möchte ich einen umfassenden Einblick in den aktuellen Entwicklungsstand meines Projekts geben, Herausforderungen schildern und Lösungsansätze vorstellen.
Anforderungen an das Haushaltsbuch
Die Anwendung soll eine intuitive Benutzeroberfläche (UI) bieten, über die Nutzer Ihre Einnahmen und Ausgaben einfach verwalten können. Mein Haushaltsbuch soll sich auch gut eignen für die Verwaltung von Vereinskassenbüchern oder ähnlichem. Die Daten werden in einer Datenbank gespeichert, sodass eine zuverlässige und strukturierte Verarbeitung gewährleistet ist. Um eine breite Nutzerbasis zu erreichen, wird das Haushaltsbuch mehrsprachig entwickelt. Aktuell ist die Unterstützung der Sprachen Englisch, Deutsch und Russisch geplant.
Über ein Einstellungsmenü kann der Nutzer Parameter wie Datums- und Währungsformat, Standardwährung sowie Sprache anpassen. Ferner soll eine umfangreiche Reportfunktion die Einnahmen und Ausgaben gegenüberstellen und den aktuellen Saldo berechnen. Diese Berichte sollen nicht nur in der Anwendung einsehbar sein, sondern auch als PDF exportiert werden können.
Ein weiteres wichtiges Feature ist die Möglichkeit, Finanzdaten als CSV zu importieren. Dabei bleibt der Datenschutz im Fokus: Die Anwendung arbeitet zunächst vollständig lokal, ohne Verbindung zu einem zentralen Datenbankserver. Zukünftig ist jedoch geplant, eine Synchronisationsoption über WebDAV zu integrieren, sodass Nutzer ihre Daten mit einem privaten Server abgleichen können.
Plattformübergreifender Support ist ebenfalls ein zentrales Ziel des Projekts. Aktuell wird die Anwendung für Linux und Windows entwickelt, während Android, iOS und macOS in späteren Phasen folgen sollen. Die nächste Plattform, die unterstützt wird, soll Android sein. Hier möchte ich die App dann auch über den Playstore anbieten.
Technologie-Stack
Für die Entwicklung der Benutzeroberfläche setze ich auf Dioxus, das plattformübergreifende Unterstützung bietet. Die Speicherung und Verwaltung der Daten erfolgt über rusqlite, eine leistungsfähige und schlanke SQLite-Bibliothek für Rust.
Build Prozess
Um eine saubere und reproduzierbare Entwicklungsumgebung zu gewährleisten, nutze ich Docker in Kombination mit einem eigens entwickelten Build-Skript. Dies ermöglicht es, Builds für unterschiedliche Plattformen effizient zu verwalten und Fehlerquellen durch inkonsistente Entwicklungsumgebungen zu minimieren.
Windows Build
Für die Windows-Version wird die Plattform x86_64-pc-windows-gnu verwendet. Da nicht alle benötigten Bibliotheken statisch gelinkt werden, werden die entsprechenden DLL-Dateien separat neben der ausführbaren Datei abgelegt. Anschließend wird das Programmpaket in einem ZIP-Archiv gebündelt.
Ein Installationsprogramm für Windows ist derzeit bisher nicht implementiert, jedoch für zukünftige Versionen geplant.
Linux Build
Die Linux-Version wird für die Plattform x86_64-unknown-linux-gnu kompiliert und als AppImage bereitgestellt. Diese Form der Distribution stellt sicher, dass das Programm auf verschiedenen Linux-Distributionen ohne aufwendige Installation lauffähig ist.
Tests auf unabhängigen Linux-Systemen haben gezeigt, dass einige Abhängigkeiten im AppImage fehlten. Nach einer gründlichen Analyse konnten die fehlenden deb-Pakete identifiziert und in das Build-Paket aufgenommen werden, um eine reibungslose Nutzung auf anderen Debian basierten Systemen zu gewährleisten. Aktuell habe ich das AppImage nicht auf nicht Debian basierten Systemen testen können, weswegen noch keine Aussage zur Lauffähigkeit des Programms auf diesen Systemen getroffen werden kann.
Build und Tests in CI/CD im Gitlab
Um den Build-Prozess weiter zu optimieren, habe ich eine CI/CD-Pipeline in GitLab implementiert.
Diese sorgt dafür, dass Commits zu offenen Merge Requests automatisch kompiliert werden.
Dank des integrierten Testframeworks von Rust konnte ich eine Test-Stage in die Pipeline einfügen.
Dort werden sämtliche Unit-Tests ausgeführt, um sicherzustellen, dass das Programm noch so
funktioniert, wie es soll. Zudem gibt es mir ein Gefühl der Sicherheit, wenn ich Unit-Tests
für die einzelnen Softwaremodule erstelle und alle Tests bestanden werden.
Impressionen vom aktuellen Arbeitsstand




Fazit
Die Entwicklung meines Haushaltsbuch-Projekts hat mir bereits viele wertvolle Erkenntnisse gebracht. Besonders konnte ich meine Kenntnisse in Rust und dem Cargo-Build-System vertiefen und mich intensiv mit den Besonderheiten von Rust im Vergleich zu anderen Programmiersprachen auseinandersetzen.
Besonders beeindruckt hat mich das integrierte Testframework von Rust, das sich als äußerst wertvoll für eine stabile Code-Basis erwiesen hat. Hier zeigt sich, dass Rust als junge Systemprogrammiersprache gezielt auf die Anforderungen moderner Softwareentwicklung ausgerichtet ist und viele bewährte Konzepte elegant integriert.
Wetterstation auf dem Balkon, ein Bluetooth-Lern-Projekt
19.03.2025
Bluetooth Low Energy (BLE) ist eine effiziente Lösung für drahtlose Sensornetzwerke, insbesondere für energieoptimierte IoT-Anwendungen. In diesem Artikel kombinieren wir Theorie und Praxis, indem wir die Entwicklung eines BLE-Treibers für einen ESP32-WROOM anhand eines realen Szenarios betrachten: Ein Umweltsensor auf dem Balkon, der Temperatur-, Luftfeuchtigkeits- und Luftdruckwerte misst und diese per BLE an meinen Heimserver überträgt.
Projektziel: Eine Wetterstation für den Balkon
Das Ziel ist die Entwicklung eines solarbetriebenen Wetterstation, die regelmäßig Umweltdaten aufzeichnet und über BLE an meinen Heimserver (Raspberry Pi 4) überträgt. Dabei steht eine energieeffiziente Kommunikation im Vordergrund, um eine lange Laufzeit zu gewährleisten.
Hardware-Komponenten
- ESP32-WROOM-32 Modul
- BME280 Sensor (Temperatur, Luftfeuchtigkeit, Luftdruck)
- Laderegler TP4056-Modul
- Solar SP2 Panel
- LM3671 3,3 V Wandler
- LED für Statusanzeige
- LiPo-Akku
BLE-Treiberentwicklung: Grundlagen und Herausforderungen
Ein BLE-Treiber vermittelt zwischen der Anwendungssoftware und der Hardware des ESP32. Dabei sind verschiedene Schichten involviert:
- Controller Layer: Steuerung der BLE-Funktionen auf Hardware-Ebene
- Host Layer: BLE-Protokollverarbeitung (GATT, GAP)
- Application Layer: Datenaustausch mit der Applikation.
Zu den zentralen Herausforderungen gehören:
- Energiesparmechanismen, um die Laufzeit des Sensors zu maximieren
- Zuverlässige Datenübertragung mit minimalem Overhead.
Firmware-Entwicklung: Implementierung eines BLE-Treibers
Als Entwicklungsumgebung verwende ich VS-Code mit dem ESP-IDF Plugin, was den benötigten
Compiler für den ESP32 enthält. Als Buildsystem verwende ich CMake.
Die Firmware für den ESP32 wurde in C++ geschrieben. Folgende Kernfunktionen wurden
implementiert:
- Advertising-Mechanismus: Der ESP32 sendet periodisch Datenpakete mit aktuellen Sensordaten. Der Sensor agiert als Broadcaster, eine Verbindung, um Daten abzurufen, ist nicht notwendig.
- Deep-Sleep-Modus: Nach jeder Messung wechselt der ESP32 in einen energiesparenden Zustand.
- Reconnect-Handling: Automatische Wiederverbindung nach Verbindungsverlust.
Datenübertragung an den Heimserver
Ein zentraler Aspekt des Projekts ist die zuverlässige und energieeffiziente Übertragung der Sensordaten an den Heimserver. Da der ESP32 als BLE-Broadcaster arbeitet, sendet er seine Messwerte periodisch als BLE-Advertising-Pakete, ohne dass der Heimserver Daten abrufen muss. Der Ablauf sieht folgendermaßen aus:
- Der ESP32 verarbeitet Umweltdaten, wie Temperatur, Luftfeuchtigkeit, Luftdruck und verpackt sie in BLE-Advertising-Pakete.
- Der Heimserver (in meinem Fall ein Raspberry Pi4) lauscht kontinuierlich auf BLE-Advertising-Daten und empfängt die gesendeten Werte.
- Die empfangenen Sensordaten werden auf dem Server im CSV-Format abgelegt und mit einem Jupyter Notebook visualisiert.
Durch diese Methode bleibt der ESP32 energieeffizient, da er keine aufwendigen BLE-Verbindungen verwalten muss, sondern lediglich Werbepakete in regelmäßigen Abständen sendet.
Fehlersuche und Debugging
Während der Entwicklung wurden verschiedene Debugging-Methoden eingesetzt:
- BLE-Sniffer (Wireshark mit nRF Sniffer-Plugin) zur Analyse der BLE-Pakete
- Logging von BLE-Events, um Verbindungsabbrüche nachzuvollziehen
- Debugging mit Segger J-Link Compact im VS-Code
Aufbau eines Bluetooth Advertising Packet
Ein Bluetooth Advertising Frame besteht aus diesen Elementen:
- Preamble: Ist das Synchronisationsmuster, dass den Anfang eines neuen Frame markiert
- Adresse: statische Adresse des Pakets als UInt32
- PDU-Header: enthält Informationen über Pakettyp, Länge der Nutzdaten und Steuerflags
- PDU Payload: Nutzdaten bestehend aus 6-Byte Mac-Adresse des Broadcasters und eigentlichen Nutzdaten. In meinem Fall Temperatur, Luftdruck und Luftfeuchtigkeit.
- CRC zum Absichern der Kommunikation gegen Übertragungsfehler
Fazit
Die Entwicklung eines BLE-Treibers für den ESP32 erfordert eine durchdachte Architektur, insbesondere im Hinblick auf Energieverbrauch und Speicherverwaltung. Das Balkon-Sensor-Projekt zeigt, wie BLE in der Praxis genutzt werden kann, um Sensordaten effizient zu erfassen und zu übertragen. Mit optimierten BLE-Mechanismen und einer robusten Treiberarchitektur lässt sich eine langlebige und zuverlässige IoT-Lösung realisieren. Mir hat das Projekt Spaß gemacht, ich habe viel lernen können. Leider ist es bei mir eine private Studie geblieben, die feste Installation auf meinem Balkon habe ich bislang noch nicht umsetzen können.