Kompilieren der Meshtastic Firmware

Inhaltsverzeichnis

Meshtastic

Meshtastic ist ein quelloffenes, von anderer Infrastruktur unabhängiges, dezentrales Mesh-Netzwerk, das auf günstigen Geräten mit geringem Stromverbrauch läuft. Für die Kommunikation zwischen den Geräten verwendet es LoRa. Aufgrund von LoRa ist die mögliche Datenrate niedrig, so dass es sich nur für den Austausch von Textnachrichten, Sensordaten und anderen datensparsamen Nachrichten eignet. Theoretisch kann man alles übertragen, aber die geringe Datenrate schränkt den praktischen Nutzen größerer Datenmengen ein. Vor allem in der EU mit einem Duty Cycle von 10 % reicht die verfügbare Bandbreite nicht für größere Daten wie Bilder oder Sprache. Dennoch handelt es sich um ein interessantes Projekt, mit dem man experimentieren oder nützliche Anwendungen entwickeln kann, ohne auf zentrale Infrastruktur angewiesen zu sein.

Es gibt viele vorgefertigte Builds der Firmware für viele verschiedene Geräte, die entweder über den Meshtastic Web Flasher oder als Download von der GitHub Meshtastic Firmware Releases Seite verfügbar sind. Allerdings decken diese nicht alle unterstützten Geräte ab. Diese Schritt-für-Schritt-Anleitung soll diese Lücke schließen und es ermöglichen die Firmware für weitere von Meshtastic unterstützte Geräte zu erstellen. Hier werden zwei Wege beschrieben, um die Firmware zu erstellen:

tl;dr

Kurz und knapp. Siehe weiter unten für die ausführliche Anleitung mittels Visual Studio Code oder mit der Kommandozeile. Für die folgenden Kommandos müssen git und PlatformIO Core installiert sein.

# Das Meshtastic Firmware Repository klonen
git clone https://github.com/meshtastic/firmware.git
# In das Projektverzeichnis wechseln
cd firmware
# Git Submodule Initialisieren und Aktualisieren
git submodule update --init
# Verfügbare Git-Tags anzeigen
git tag
# Ein Git-Tag aus-checken und gleichzeitig einen Git-Branch erstellen
git checkout -b v2.6.13 v2.6.13.0561f2c
# Git Submodule erneut aktualisieren
git submodule update 
# Firmware für nugget-s3 kompilieren
pio run -e nugget-s3-lora
# Oder direkt kompilieren und auf das Gerät laden
pio run -e nugget-s3-lora --upload-port /dev/ttyACM0 --target upload

# Einige Tage/Wochen später... Den Quelltext und die Submodule aktualisieren
git pull --recurse-submodules
# Zum master Branch wechseln
git switch master
# Git Submodule aktualisieren
git submodule update
# Build (Kompilieren)
pio run ...
# Oder ein Tag auschecken und dabei ein Branch erstellen
git checkout -b v2.7.2 v2.7.2.f6d3782
# Git Submodule aktualisieren
git submodule update
# Build
pio run ...

# Liste der Umgebungen (Geräte), ausführlich
pio project config
# Liste der Umgebungen (Geräte), nur Namen
pio project config | grep "^env:" | cut -d':' -f2- | sort

Kompilieren mit Visual Studio Code

In dieser Anleitung verwende ich Visual Studio Code, da die Installation der notwendigen PlatformIO IDE Erweiterung in Open Source Versionen von Visual Studio Code nicht so einfach ist.

Anmerkung

Es gib auch Open Source Versionen von Visual Studio Code, wie Code OSS oder VSCodium. Doch wie bereits erwähnt, ist die Installation von einigen Erweiterungen nicht so einfach wie bei Visual Studio Code. Eine manuelle Installation von Erweiterungen ist möglich, kann aber aufwendig sein.

Stelle sicher, dass die PlatformIO IDE Erweiterung installiert ist. Für weiter Details zur Installation siehe auch die Installationsanleitung für Visual Studio Code.

  1. Öffne den Erweiterungsmanager von Visual Studio Code
  2. Suche nach PlatformIO IDE
  3. Installiere die PlatformIO IDE Erweiterung

Sobald die Erweiterung installiert ist, kann das Git-Repository direkt aus Visual Studio Code heraus geklont werden. Wähle Repository klonen und gebe anschließend https://github.com/meshtastic/firmware.git ein und bestätige dies mit Enter. Anschließend kann das Ziel zum Speichern nach persönlicher Präferenz gewählt werden. Ich verwende ~/git/meshtastic-firmware.

Hinweis

Wenn das Repository bereits geklont wurde, kann der Ordner direkt geöffnet werden, in dem es sich befindet.

Klonen des Meshtastic Git Repositories

Nachdem Öffnen folgt die Frage Vertrauen Sie den Autoren der Dateien in diesem Ordner? Bestätige dies mit Ja, ich vertraue den Autoren, damit Erweiterungen aktiviert werden.

Vertraue den Autoren beim Öffnen des Meshtastic Firmware Projekts

PlatformIO IDE führt dann zusätzliche Installationsschritte im Hintergrund durch. Nach Abschluss dieser klicke auf Jetzt Neuladen. Nach dem Neuladen konfiguriert PlatformIO IDE das Projekt (Meshtastic Firmware). Dies dauert auch einen Moment. Ich habe die Dev Containers Erweiterung nicht installiert, indem ich die Meldung mit klicken auf x geschlossen habe. Diese Erweiterung ist für das Kompilieren der Firmware nicht notwendig.

PlatformIO konfiguriert das Projekt

Optional: Um eine bestimmte Version der Meshtastic Firmware zu kompilieren, wähle das entsprechende Git-Tag aus. Klicke dazu auf master (das ist der aktuell ausgewählte Git-Branch) in der unteren linken Ecke. Für die Version 2.6.13, gib v2.6.13 ein und wähle das passende Tag (v2.6.13.0561f2) aus.

Optional: Eine Version mittels Git-Tag auswählen

Falls noch nicht geschehen, wechsel zur PlatformIO IDE Ansicht.

Zur PlatformIO Ansicht wechseln

Wähle das gewünschte Gerät, für das die Firmware kompiliert werden soll, unter Project Tasks im oberen linken Bereich aus. Das Aufklappen der Aufgaben eines Geräts dauert einen Moment und die Ansicht wird anschließend neu geladen. Nach dem Neuladen der Ansicht muss das Gerät erneut ausgewählt werden.

Geräteauswahl in der Project Tasks Liste

Unter Project Tasks können verschiedene Aufgaben pro Gerät ausgewählt werden:

  • Build: Kompiliert die Firmware für das ausgewählte Gerät
  • Upload: Lädt die Firmware auf das Gerät. Kompiliert zuvor auch die Firmware für das Gerät, falls noch nicht geschehen.
Hinweis

Upload (Flashen) der Firmware mittels Upload Aufgabe ist abhängig vom Gerät. Einige Geräte können direkt mittels Upload aktualisiert werden, während andere zunächst in einem entsprechenden Zustand zu versetzen sind, damit sie eine neue Firmware mittels Upload akzeptieren. Dann gibt es noch Geräte, die als externes Laufwerk erscheinen, worauf die kompilierte Firmwaredatei kopiert wird und dadurch die Firmware auf das Gerät gelangt.

Ein erfolgreiches Kompilieren der Firmware wird mit dem Text SUCCESS im Terminal Fenster angezeigt.

Ein erfolgreicher Build

Nun sollte die Firmware erfolgreich gebaut oder sogar mittels Upload auf dem Gerät sein. Die erstellten Firmware Dateien befinden sich im Meshtastic Firmware Projektordner unter .pio/build/.

Kompilieren in der Kommandozeile mit PlatformIO Core

PlatformIO Core ist eine Kommandozeilenschnittstelle (CLI), das Herzstück des PlatformIO Ökosystems. Um PlatformIO Core zu installieren, folge den Schritten in der Installationsanleitung. Alternativ bieten einige Linux Distributionen auch direkt Pakete an, die mithilfe der jeweiligen Paketverwaltung installierbar sind. Z.b.:

  • Fedora: dnf install platformio
  • Fedora (Atomic): rpm-ostree install platformio
  • Arch Linux (basierend): pacman -S platformio

Als Erstes muss das Meshtastic Firmware Repository mit git clone https://github.com/meshtastic/firmware.git meshtastic-firmware geklont werden. git muss installiert sein, um den Befehl auszuführen.

Hinweis

Der obige Befehl klont das Meshtastic Firmware Repository in meshtastic-firmware. Ich speicher die Repositorien in ~/git/ in meinem Heimatverzeichnis. Da ich auch andere Projekte habe, die den selben Namen haben, stelle ich ein Präfix voran. Wie du deine Daten organisierst, bleibt dir überlassen. Du kannst Unterverzeichnisse wie z.B. ~/Projekte/meshtastic verwenden und es dorthin klonen ohne dabei meshtastic-firmware mit anzugeben. Nehmen wir also an, man befindet sich im Verzeichnis ~/Projekte/meshtastic und führt git clone https://github.com/meshtastic/firmware.git aus, was zu ~/Projekte/meshtastic/firmware führt.

$ git clone https://github.com/meshtastic/firmware.git meshtastic-firmware
Klone nach 'meshtastic-firmware'...
remote: Enumerating objects: 65651, done.
remote: Counting objects: 100% (349/349), done.
remote: Compressing objects: 100% (217/217), done.
remote: Total 65651 (delta 260), reused 136 (delta 132), pack-reused 65302 (from 4)
Empfange Objekte: 100% (65651/65651), 110.86 MiB | 8.00 MiB/s, fertig.
Löse Unterschiede auf: 100% (48144/48144), fertig.

Git-Repositorien können weitere Git-Repositorien enthalten, diese nennt man Submodule. Das Meshtastic Firmware Repository verwendet Submodule. Um sie zu Initialisieren und Aktualisieren führe git submodule update --init aus.

$ cd meshtastic-firmware
$ git submodule update --init

Optional: Um eine bestimmte Version der Meshtastic Firmware zu kompilieren, muss das entsprechende Git-Tag ausgecheckt werden, z.B. mit git checkout v2.6.13.0561f2c.

Anmerkung

Wenn man ein Git-Tag auscheckt, ohne dabei ein Git-Branch zu erstellen, wird ein losgelösten HEAD erstellt. Wenn man mit git nicht vertraut ist, kann dies verwirrend sein. Wenn man lediglich eine bestimmte Firmwareversion kompilieren möchte, braucht man der Meldung keiner weiteren Beachtung zu schenken. Alternativ kann man beim Aus-checken eines Git-Tags auch direkt einen Git-Branch erstellen. Mit git checkout -b v2.6.13 v2.6.13.0561f2c wird der Git-Branch v2.6.13 aus dem Git-Tag v2.6.13.0561f2c erstellt.

$ git checkout v2.6.13.0561f2c 
M       protobufs
Hinweis: Wechsle zu 'v2.6.13.0561f2c'.

Sie befinden sich im Zustand eines 'losgelösten HEAD'. Sie können sich
umschauen, experimentelle Änderungen vornehmen und diese committen, und
Sie können alle möglichen Commits, die Sie in diesem Zustand machen,
ohne Auswirkungen auf irgendeinen Branch verwerfen, indem Sie zu einem
anderen Branch wechseln.

Wenn Sie einen neuen Branch erstellen möchten, um Ihre erstellten Commits
zu behalten, können Sie das (jetzt oder später) durch Nutzung von
'switch' mit der Option -c tun. Beispiel:

  git switch -c <neuer-Branchname>

Oder um diese Operation rückgängig zu machen:
  git switch -

Sie können diesen Hinweis ausschalten, indem Sie die Konfigurationsvariable
'advice.detachedHead' auf 'false' setzen.

HEAD ist jetzt bei 12680ad9c Update README.md

Wenn man zu einem anderen Branch wechselt oder ein Tag aus-checkt, sind unter Umständen die Submodule nicht mehr aktuell bzw. nicht mehr auf dem selben Stand des Branches oder Tags. Mittels git submodule update bringt man die Submodule auf den richtigen Stand. Die --init Option vom ersten Ausführen wird nun nicht mehr benötigt.

Mit dem Befehl pio project config erhält man eine ausführliche Liste aller unterstützten Geräte, wofür die Meshtastic Firmware kompiliert werden kann. Mit dem Kommando werden alle Möglichen Umgebungen und ihre Parameter angezeigt. Wir sind jedoch nur an den Namen der Umgebung, der wiederum für ein Gerät steht interessiert. Um nur die Namen der Umgebungen anzuzeigen, kann man pio project config | grep "^env:" | sort verwenden.

Um die Firmware zu kompilieren, führe pio run -e <environment> aus, z.B. pio run -e nugget-s3-lora. Man kann die Firmware auch direkt auf das Gerät flashen (Upload), dazu sind einige weitere Optionen notwendig: pio run -e nugget-s3-lora --upload-port /dev/ttyACM0 --target upload. Stelle dabei sicher, den korrekten Pfad zum Gerät (/dev/tty...) anzugeben. Unter welchen Pfad das Gerät zu finden ist, kann man mit journalctl -f oder sudo dmesg herausfinden, während man das Gerät anschließt.

Ein erfolgreicher Build der Firmware sollte folgende Ausgabe erzeugen:

===================== [SUCCESS] Took 19.37 seconds =====================

Environment     Status    Duration
--------------  --------  ------------
nugget-s3-lora  SUCCESS   00:00:19.370
====================== 1 succeeded in 00:00:19.370 ======================

Den Quelltext aktuell halten

Die Entwicklung der Meshtastic Firmware geht schnell voran. In etwa jede Woche erscheint eine neue Version (Release). Um den Quelltext aktuell zu halten, führe git pull --recurse-submodules aus. Anschließend kann man zum master Branch wechseln, was die neueste Version in der Entwicklung befindend entspricht. Oder man verwendet Git-Tags um zu einer spezifischen Version zu wechseln. Mit dem Befehl git tag kann man sich alle verfügbaren Tags anzeigen lassen, was einer Version bzw. einem Release der Firmware entspricht. Wie zuvor beschrieben, kann man somit eine neue Firmware kompilieren.

Referenzen