Jak to funguje

Mesh sítě jsou založené na nod to nod topologii, kdy každý/většina se podilí na přenosu paketu/zprávy od odesilatele k příjemci. Tomuto způsobu přenosu se říká Managed flooding (řízené zaplavování). Meshtastic používá optimalizovanou verzi flooding, kde každý node se rozhoduje, jestli a kdy paket přepošle. To minimalizuje duplicity, snaží se zachovat vysokou pravděpodobnost doručení a funguje bez centrální koordinace. Nevýhodou tohoto řešení je neefektivita (více přenosů než optimální routing), vysoká latence (delay před rebroadcastem), nedeterminismus (trasa není pevná) a omezená kapacita(LoRa má nízký bitrate).

Role

Nody mají podle toho k čemu jsou určeny přiřazenu jednu z rolí, které určují jak se zařízení chová vůdči provozu, který radiově slyší na základní (ještě poznámka - byť to nejsou role, ale zařízení v meshi se dělí na ty které se výrazně podílí na přenosu/doručení - jakási páteřní infrastruktura a účastnické/konzumní nody):

client_mute

základní role pro zařízení, která přijmají a vysílají zprávy, dále se však nepodílejí na přenosu nevlastních paketů, používá se zvláště ve městech, kde je vyšší hustota zařízení a kde vzhledem k množství budov je problematický příjem a vysílání z takovéhoto zařízení. Základní podmínkou pro použití této role je přímé spojení alespoň na jeden infrastrukturní bod (node v vežimu client, client_base, router_late nebo router)

client

role pro zařízení, která se taky podílejí na přenosu paketů ostatních zařízení. Vysílání/předávání cizích paketů je řízeno algoritmem do kterého vstupuje: zbývající počet hopů, síla přijatého signálu, jestli je paket dekódován a jestli jej už někdo jiný neopakoval. Právě podle síly přijatého signálu je nastaveno zpoždění tak aby se signál dostal co nejdál, tedy čím slabší tím kratší zpoždění a tím rychlejší převysílání. Tady ale nastává problém u zařízení, které mají špatnou anténu, nebo jsou zastíněny budovami, že si myslí, že jsou "daleko" a vysílají hned. Proto se doporučuje tuto roli používat jen v řídké zástavbě/volném terénu. Použití této role má smysl v místě, kde je přímé spojení alespoň na jeden další infrastrukturní bod (node v vežimu client, client_base, router_late nebo router)

client_base

toto je speciální role, která přišla ve verzi 2.7.15 je určena pro zařízení, která mají fungovat jako "domácí" router tedy na domě, na paneláku, na kopci máte node s touto rolí, node který pro Vás funguje jako router - tedy jakmile slyší paket od Vás tak jej převysílá, pro ostatní se chová jako client. Použití této role má smysl v místě, kde je přímé spojení alespoň na jeden další infrastrukturní bod (node v vežimu client, client_base, router_late nebo router)

router

role pro uzlové/klíčové nody, které mají výhodnou polohu a "vidí" na velkou vzdálenost. Opakují okamžitě všechny pakety, které slyší. Použití této role má smysl v místě, kde je přímé spojení na více dalších infrastrukturních bodů (node v vežimu client, client_base, router_late nebo router)

router_late

podobně jako router, akorát než začnou odesílat paket chvíli počkají jestli již daný paket někdo nevysílal. Použití této role má smysl v místě, kde je přímé spojení na více dalších infrastrukturních bodů (node v vežimu client, client_base, router_late nebo router)

tracker

role pro nody, které jsou určeny pro sledování pohybu nodu. Základní podmínkou pro použití této role je přímé spojení alespoň na jeden infrastrukturní bod (node v vežimu client, client_base, router_late nebo router)

sensor

role pro nody, které sbírají data z připojených snímaču a odesílají je do sítě. Základní podmínkou pro použití této role je přímé spojení alespoň na jeden infrastrukturní bod (node v vežimu client, client_base, router_late nebo router)

a ty které se tolik nepoužívají:

  • tak
  • client_hidden
  • lost_and_found
  • tak_tracker

U nich zmíním jen lost_and_found, kdy tato role je určená pro ztracené nody.


Rebroadcast Mode

Velmi důležitým prvkem je Rebroadcast Mode(Režim opětovného vysílání) to je praktický filtr.

  • Role určuje jak ochotně a jak brzo node přeposílá.
  • Rebroadcast Mode určuje co vůbec smí přeposlat, je to filtr, který říká které packety může role přeposlat.

Takže výsledné chování je kombinace obou. Co přesně dělá Rebroadcast Mode:

  • ALL: přeposílá vše, co odpovídá mesh/radio parametrům.
  • ALL_SKIP_DECODING: jako ALL, ale bez dekódování; oficiálně jen pro REPEATER, jinde se chová jako ALL.
  • LOCAL_ONLY: nepřeposílá cizí/nesrozumitelné meshe; jen lokální primární/sekundární kanály.
  • KNOWN_ONLY: jako LOCAL_ONLY, ale navíc jen od nodů známých v NodeDB.
  • NONE: zakáže přeposílání; oficiálně jen pro SENSOR, TRACKER, TAK_TRACKER.
  • CORE_PORTNUMS_ONLY: přeposílá jen základní typy packetů jako NodeInfo, Text, Position, Telemetry,
    Routing.

Jak do toho vstupuje role:

  • CLIENT: stále routuje, ale později a méně agresivně; často rebroadcast zruší, když už slyšel, že to
    přeposlal někdo jiný.
  • ROUTER: přeposílá přednostně a rychle.
  • ROUTER_LATE: vždy přeposílá, ale až po ostatních.
  • CLIENT_MUTE: nepřeposílá cizí packety; tady je Rebroadcast Mode prakticky bez významu.
  • CLIENT_HIDDEN: role sama říká, že stále rebroadcastuje, ale s lokálním omezením; prakticky to odpovídá LOCAL_ONLY.
  • REPEATER: speciální průchozí role, dnes deprecated; pro ni dává smysl ALL_SKIP_DECODING.
  • TRACKER, SENSOR, TAK_TRACKER: mohou mít NONE, tedy vůbec nepřeposílat.
  • CLIENT_BASE: běžně jako CLIENT, ale pro favorite nody se chová aktivněji; Rebroadcast Mode stále dál
    omezuje, co smí přeposlat.
  • TAK: omezuje rutinní broadcasty, ale není to totéž co vypnutí rebroadcastu.

Praktická pravidla

  • ROUTER + ALL = nejsilnější podpora mesh, nejvyšší airtime.
  • ROUTER + LOCAL_ONLY = dobrý veřejný router bez přeposílání cizích/nerozšifrovatelných meshů(Tedy posílá pouze to od čeho má PKI).
  • CLIENT + LOCAL_ONLY = stále pomáhá síti, ale šetří provoz.
  • CLIENT + KNOWN_ONLY = stále pomáhá síti, ale šetří provoz(omezuje se na node které má v DB).
  • CLIENT_MUTE = fakticky neroutuje bez ohledu na Rebroadcast Mode.
  • TRACKER/SENSOR + NONE = vysílá vlastní data, ale dál nic nepřeposílá.
  • ALL_SKIP_DECODING mimo REPEATER nemá smysl, spadne chováním na ALL.
  • NONE není univerzální volba pro každou roli; je určená jen pro některé role.


Pakety



Celý provoz je rozdělen na pakety, ty jsou jsou základem celého provozu

Životní cyklus paketu v Meshtastic síti

Pakety prochází v Meshtastic mesh síti tímto životním cyklem:

  1. vytvoření paketu
  2. vyslání přes LoRa
  3. přijetí jiným nodem
  4. vyhodnocení rebroadcastu
  5. případné přeposlání
  6. doručení cílovému nodu

Celý proces je implementován ve firmware v komponentách: Router, RadioInterface, MeshService. Rebroadcast se týká pouze nodu, které mají povoleno vysílání tedy mají roli client, client_base, router_late a router.

1. Vytvoření paketu

Paket může vzniknout několika způsoby, příklady:

  • uživatel - text message
  • systém - node info
  • modul - telemetry
  • CLI/API - admin příkaz

Po vytvoření je payload serializován pomocí protobuf a vložen do struktury MeshPacket se základními poli:

  • from
  • to
  • channel
  • hop_limit
  • want_ack

Každý paket má také unikátní ID (packet.id), které slouží pro deduplikaci.

2. Zařazení do TX fronty a vysílání

následně Firmware přidá paket do transmit queue. Queue je řízena podle:

  • priority
  • airtime
  • obsazenosti kanálu

Paket dále čeká na: Channel Activity Detection (CAD) to znamená, že rádio zkontroluje, zda není kanál obsazen. Pokud je kanál volný:

  • rádio přepne do TX
  • odešle LoRa frame
  • paket obsahuje: hop_start, hop_limit, packet_id

Tyto hodnoty umožňují sledovat celou cestu paketu v mesh síti.

3. Přijetí paketu jiným nodem a kontrola duplicity

Po přijetí LoRa rámce firmware vytvoří objekt MeshPacket, doplní do něj také lokální metadata:

  • rx_rssi - síla signálu
  • rx_snr - poměr signál/šum
  • rx_time - čas přijetí

Tyto hodnoty nejsou součástí přenášeného payloadu – jsou jen lokální pro přijímač.
Každý node si vede cache nedávno přijatých paketů. Používá se:

  • packet.id
  • packet.from

Pokud node paket už viděl je paket ignorován. Tato cache brání nekonečnému cirkulování paketů v mesh síti.

4. Meshtastic Rebroadcast/Opakovací Algoritmus

Pokud paket není duplicitní a rebroadcast je povolen, node rozhoduje o rebroadcast nebo drop:
pokud hop_limit = 0 => paket se nepřeposílá
node je cílový => paket se zpracuje
paket už byl relaynut (vysílal jej jiný node) => ignoruje se

Pro výpočet zpoždění Meshtastic používá na SNR založené rebroadcast časování.

Principy:

  • nody s nižším SNR opakují dříve
  • nody s vyšším SNR čekají s opakováním
  • toto by mělo zabraňovat redundandním opakováním, což v praxi moc nefunguje

Jednoduchý model:

delay = baseDelay + random(0, 2\^CWsize) × slotTime

Kde CWsize zavisí na SNR.

Node čeká vypočtený čas. Během tohoto čekání na rebroadcast může nastat:
- node slyší stejný paket od jiného nodu => rebroadcast se zruší
To výrazně snižuje kolize a redundantní vysílání
Vyjímku tvoří nody s rolí router, který má upravené chování: má nejkratší delay a tím zvyšuje pravděpodobnost rebroadcastu.

Co se děje při kolizi? Pokud dva nody vysílají zároveň - LoRa nemá collision detection a paket může být ztracen Managed flooding to řeší pomocí náhodným delay přidaný do doby čekání na rebroadcast, více kandidáty na rebroadcast (nikdo není vyčleněn - samozřejmě s příslušnou rolí) to zvyšuje pravděpodobnost, že alespoň jeden paket projde.


5. Přeposlání paketu

Pokud během čekání nedošlo k potlačení node paket rebroadcastuje.
Parametry: hop_limit se decrementuje, hop_start zůstává a packet.id zůstává. Takto může paket pokračovat svou cestu v mesh síti.

6. Doručení cílovému nodu

Pokud packet.to odpovídá ID nodu je paket doručen aplikaci. Například TEXT_MESSAGE_APP je doručen chat modulu, POSITION_APP je doručen GPS modulu, TELEMETRY_APP je doručena telemetry modulu.

ACK mechanismus

Pokud je v přijatém paketu nastaven want_ack = true pak cílový node odešle ROUTING_APP ACK
ACK obsahuje packet_id
Odesílatel pak ví, že zpráva byla doručena cílovému nodu. Pozor - pouze za případu kdy tento ACK paket dorazí zpět.

Životnost paketu v síti

Paket se šíří sítí jen pokud hop_limit > 0 po té je zahozen. Typické hop_limit jsou:

  • text 3–5
  • broadcast 3
  • telemetry 1–2

Všimněte si, že doporučený hop limit pro textové zprávy je 3-5, jak si ale můžete všimnout v Live Logu, tak většina paketů má nastaveno povolené maximum 7. Tímto se snaží o "zaručené doručení", ale tímto dochází zbytečně k zahlcování celé sítě. Úspěšné doručení musí zajišťovat jiné postupy, které tady popisuji. Jedním z nich je Zero Cost Hops, kdy při přenosu přes "páteřní" routery nedochází k dekrementaci hop_limit a tím pádem se pakety s prvotmím hop_limitem=3 mohou dostat až na druhý konec republiky . Pokud si toto chcete ověřit použijte Network Graph vyberte jeden node a posunujte Hop Distance Filter. Uvidíte jaký vliv má počáteční počet skoků na dosah v meshi.


Pokračujte na Nastavení