[Lora]

Was ist der Room Server bei MeshCore?

/was-ist-der-room-server-bei-meshcore

Der Room Server in MeshCore funktioniert wie ein Gruppenchat-Server mit Verlauf. Stell dir vor, du trittst einem Chatraum bei: Dein Gerät (Client) verbindet sich mit dem Room Server, sendet Nachrichten in diesen „Raum“ und erhält beim Verbinden oder nach einer Pause den bisherigen Chatverlauf – sofern er noch verfügbar ist.

So läuft’s ab:

  • Ein Client sagt dem Server: „Ich kenne alle Nachrichten bis Zeitpunkt T“ (das ist der sync_since-Zeitstempel).
  • Der Server schickt dem Client dann automatisch alle neueren Nachrichten, die seit T gepostet wurden.
  • Sobald ein Client aktiv ist, bekommt er neue Nachrichten direkt „zugepusht“, ohne selbst nachfragen zu müssen.
  • Jede Nachricht wird mit einer Bestätigung (ACK) versehen. Erst nach einem erfolgreichen ACK aktualisiert der Server den Zeitstempel des Clients. So bleibt alles schön synchron, ähnlich wie in einem klassischen Chat – aber mit einer Einschränkung: Der Server speichert nur begrenzt viele Nachrichten.

Wo und wie werden Nachrichten gespeichert?

Die Nachrichten landen nur im RAM des Room Servers, genauer gesagt in einem Ringspeicher (Ringbuffer). In der Beispielimplementierung (simple_room_server) ist der Puffer auf 32 Nachrichten begrenzt (definiert durch MAX_UNSYNCED_POSTS 32). Das bedeutet:

  • Der Server hält maximal die letzten 32 Nachrichten im Speicher.
  • Es gibt keine dauerhafte Speicherung (z. B. auf Flash oder SD-Karte). Nach einem Neustart sind alle Nachrichten weg.

Warum so?

  • Mikrocontroller haben oft wenig RAM (manchmal nur ein paar Dutzend Kilobyte).
  • Jede Nachricht braucht Platz für Dinge wie den öffentlichen Schlüssel, Zeitstempel, Text und etwas Puffer.
  • Ein großer Puffer würde den RAM überlasten und die Synchronisation über Funk langsamer machen, da mehr Daten gesendet und bestätigt werden müssen.

Kann man mehr Nachrichten speichern?

Ja, technisch ist das machbar, indem man die Puffergröße im Code (z. B. MAX_UNSYNCED_POSTS) erhöht. Aber Vorsicht:

  • Mehr Puffer = mehr RAM-Verbrauch und längere Synchronisationszeiten, da Clients beim Verbinden mehr Daten nachholen müssen.
  • Auf Geräten mit wenig RAM (z. B. nRF52-Chips) ist das riskant – 32 Nachrichten sind oft schon die Obergrenze.
  • Auf leistungsstärkeren Geräten wie dem ESP32 (mit z. B. 512 kB RAM) könnte man den Puffer auf 64 oder 128 Nachrichten erhöhen. Aber: Das belastet das Funknetz, da mehr Daten gesendet werden müssen. Es braucht also eine gute Balance zwischen Puffergröße, RAM und Netzwerkbelastung.

Wie läuft die Synchronisation im Detail?

Hier der typische Ablauf:

  1. Client meldet sich an: Beim Verbinden oder per „Keep-Alive“-Signal gibt der Client seinen letzten bekannten Zeitstempel (sync_since) an.
  2. Server wählt Nachrichten aus: Er schaut im Ringspeicher nach Nachrichten, die neuer sind als sync_since und nicht vom Client selbst stammen.
  3. Push mit Bestätigung: Der Server schickt die Nachrichten einzeln an alle aktiven Clients (im Round-Robin-Verfahren) und wartet auf ein ACK. Ohne ACK versucht er es ein paar Mal erneut.
  4. Zeitstempel aktualisieren: Nach einem erfolgreichen ACK aktualisiert der Server den sync_since-Zeitstempel des Clients, damit dieser beim nächsten Mal nur neuere Nachrichten bekommt.
  5. Fortlaufend synchron: Neue Nachrichten von anderen Clients werden direkt an alle aktiven Clients gepusht, sodass niemand ständig nachfragen muss.

Problem bei Offline-Zeiten: Wenn ein Client lange offline war und sein sync_since weit zurückliegt, bekommt er nur die letzten 32 Nachrichten (oder wie groß der Puffer eben ist). Ältere Nachrichten sind verloren.

Tipps und Fallstricke

  • Puffergröße klug wählen: Mehr Nachrichten bedeuten mehr RAM und längere Sync-Zeiten. Für Low-End-Chips wie nRF52: maximal 32 Nachrichten. Für ESP32: Größere Puffer (z. B. 64 oder 128) sind möglich, aber teste die Auswirkungen auf Funk und Latenz.
  • Keine dauerhafte Speicherung: Willst du einen dauerhaften Verlauf? Dann müsstest du selbst eine Lösung bauen, z. B. mit Flash-Speicher.
  • Funkbelastung beachten: Viele ungesyncte Nachrichten = viele Push-/ACK-Zyklen = hohe Belastung des Funknetzes. Das kann die Performance bremsen.

Falls du noch tiefer in ein Detail einsteigen willst, lass es mich wissen!

Anzeige

/comments0 Einträge

Kommentare

> NO_COMMENTS_FOUND

> INITIATE_COMMENT_PROTOCOL

MARKDOWN_SUPPORT: ENABLED
CHARS: 0