Vytváříme bránu mezi Wi-Fi a LoRa pro UDP

Měl jsem jako dítě sen — udělit každému domácímu "bezWiFi" zařízení vstupenku do sítě, tedy IP adresu a port. Po nějaké době jsem si uvědomil, že není čas otálet. Je třeba vzít a udělat to.
Technická specifikace
Vytvořit bránu s M5Stack s nainstalovaným modulem LoRa (obr. 1). Brána bude připojena k Wi-Fi síti, kde získá místní IP adresu přes DHCP. Brána bude pravidelně vysílat v "LoRa etheru" své jméno (analog SSID pro Wi-Fi) a rozsah povolených portů, aby ostatní zařízení věděla, že existuje taková síť, ke které se lze připojit a v jakém rozsahu si mohou vybrat volný port. Protože se jedná o prototyp, autentizace zatím nebude. Nová klientská zařízení naleznou dostupnou LoRa síť a předají jí vybraný port. Jakmile brána obdrží od nového klienta port, zkontroluje, zda je volný, a pokud ano, zaregistruje nového klienta a začne poslouchat na daném portu na svém vlastním asynchronním UDP serveru. Po registraci klient obdrží souhlas nebo zamítnutí k použití požadovaného portu. Postup práce je zobrazen v tabulce 1.

Obr. 1
Tabulka 1
strana
směr a data
strana
sezení
[ klient ]
<— signál-maják —
[ brána ]
0xA1
[ klient ]
— vybraný port —>
[ brána ]
0xB1
[ klient ]
<— souhlas nebo zamítnutí —
[ brána ]
0xA2
[ klient ]
— UPD paket —>
[ brána ]
0xB2
[ klient ]
<— UPD paket —
[ brána ]
0xA3
[ síť ]
<— UPD paket —
[ brána ]
0xC1
Před sebou na stole mám různé moduly pro M5Stack, které se nudí. Vezměme LoRu a užijme si s ní. Samotná koncepce modulů je skvělá! Co víc říct? Ale, moduly, které mám, jsou první revize, ve kterých je hrozná vestavěná anténa, vyrobená na flexibilní tištěné desce a přilepená na boční stěnu krytu. Jednou jsem prováděl terénní testy těchto modulů (můžete se podívat na ruském YouTube kanálu):

Samozřejmě bylo nutné odstranit tyto pozůstatky a připájet standardní spirálové antény, které jsou součástí balení s Ra-01. Po takové úpravě se dosah signálu znatelně zlepšil, ale objevil se vedlejší efekt — anténa má větší průměr, než je povolená vzdálenost mezi moduly. Musel jsem se na čas vzdát zakončovacího modulu projektu.
První obtížnosti od synchronní tuhosti
Zdálo by se, že stačí vzít knihovnu WiFiUdp.h, kde je vše potřebné pro pohodlný chod UDP serveru, tak tomu není. Knihovna je navržena pro spuštění synchronního serveru, který, k hlubokému politování, nemůže současně obsluhovat několik spojení v jednom vlákně. Taková knihovna není vhodná pro aktuální úkol. Bylo potřeba vypít hodně šálků čaje a vyhledat knihovnu, která umožní spuštění asynchronního UDP serveru schopného podporovat více spojení současně. Taková knihovna byla nalezena — AsyncUDP.h. Jaký je vlastně rozdíl mezi synchronním serverem a asynchronním? Pojďme si prohlédnout šest scénářů na obrázku 2, ve kterých jsou triviálně zobrazeny možnosti práce soketů.

Obrázek 2
V hlavních rolích:
Člověk v roli Soketa;
Holub v roli Spojení;
Dopis v roli Data.
Scénář A. Synchronní soket bez timeoutu
Člověk bude stát, dokud mu Holub nepřinese Dopis.
Scénář B. Synchronní soket s timeoutem
Člověk čeká domluvenou dobu s Holubem, a pokud nepřijde včas, Člověk odejde.
Scénář C. Synchronní soket s vícerozranností
Člověk nečinně pozoruje, jak Holubi sami doručují Dopisy.
Scénář D. Asynchronní soket (když není co ještě přijímat)
Člověk se věnuje svým oblíbeným činnostem, ale nezapomíná na Holuby.
Scénář E. Asynchronní soket (když je co přijímat)
Člověk se na chvíli odvrátil od svých činností, aby převzal dopis od Holuba.
Scénář F. Asynchronní soket s vícerozranností
Člověk se věnuje svým činnostem a pozoruje, jak Holubi sami doručují Dopisy.
Pokud jste byli pozorní, jistě jste si museli všimnout, že obojky na Holubech v každém scénáři mají určitou barvu. A to není náhoda. Ve scénáři A a B na serveru pracuje pouze jeden soket a hotovo. Ve scénáři C už pracují dva sokety. Ve scénářích D, E a F už tři sokety. „Proč tam jsou dva, a tady tři?“ — zeptáte se. To je podmíněně 2 a 3, ve skutečnosti může být místo 2 20, a místo tří 200. Cílem je ukázat, že asynchronní sokety nezatěžují hardware tolik jako synchronní.
Kam se co vejde?
Pojďme se podívat na tabulku 1, která ukazuje strukturu UDP paketu a zamyslet se, co s tím lze udělat.
Tabulka 1. Struktura UDP paketu
Bity
0 — 15
16 — 31
0-31
Port odesílatele (Source port)
Port příjemce (Destination port)
32-63
Délka datagramu (Length)
Kontrolní součet (Checksum)
64-…
Data (Data)
Přidáme do začátku této tabulky ještě jedno pole Seance (1 Byte). To pro tento projekt stačí. Na základě seance zařízení bude vědět, co dále dělat s paketem. Teď vymyslíme kódy pro seance a zapíšeme je do tabulky 2.
Tabulka 2. Vysvětlení seancí
Kód
Název
Vysvětlení
0xA1
Maják
Brána vysílá název sítě LoRa a rozsah povolených portů s určitou periodicitou. To je potřebné, aby noví klienti viděli dostupnou síť, a stávající klienti, když nedochází k přenosu, mohli určovat úroveň signálu.
0xB1
Žádost
Když klient objeví síť, odešle preferovaný port.
0xA2
Souhlas nebo odmítnutí
Pokud je požadovaný port volný, server odpoví souhlasem, jinak odmítnutím.
0xB2
Up-link
Když klient přenáší UDP paket bráně.
0xA3
Down-link
Když brána přenáší UDP paket klientovi.
0xC1
Pokračování Up-linku
Když brána posílá UDP paket do místní sítě.
Dobře. Teď si pojďme promluvit o složení seancí v tabulce 3.
Tabulka 3. Seance
Název seance
Složení
Maják
Kód seance (1 Byte) + Název sítě LoRa (4 Bytes) + Počáteční port (2 Bytes) + Konečný port (2 Bytes)
Žádost
Kód přenosu (1 Byte) + Název sítě LoRa (4 Bytes) + Preferovaný port (2 Bytes)
Souhlas nebo odmítnutí
Kód přenosu (1 Byte) + Název sítě LoRa (4 Bytes) + Preferovaný port (2 Bytes) + Výsledek (1 Byte)
Up-link
Kód přenosu (1 Byte) + Název sítě LoRa (4 Bytes) + Vzdálená IP adresa (4 Bytes) + Vzdálený port (2 Bytes) + Lokální IP adresa (4 Bytes) + Lokální port (2 Bytes) + Velikost dat (2 Bytes) + Data
Down-link
Kód přenosu (1 Byte) + Název sítě LoRa (4 Bytes) + Vzdálená IP adresa (4 Bytes) + Vzdálený port (2 Bytes) + Lokální IP adresa (4 Bytes) + Lokální port (2 Bytes) + Velikost dat (2 Bytes) + Data
Pokračování Up-linku
Vzdálená IP adresa (4 Bytes) + Vzdálený port (2 Bytes) + Velikost dat (2 Bytes) + Data
Napsal jsem dva klienty pro Arduinu a pro M5Stack. Na můžete vidět, jak to funguje. V bytě nebyly žádné problémy, terénní testy zatím neproběhly.
Zdroje kódu jsou k dispozici na GitHubu na
Zjistit více o základním zařízení M5Stack a zakoupit lze
Vybrat bezdrátové moduly LoRa pro základní zařízení lze
Budu rád, pokud vám tento projekt bude užitečný. Děkujeme, že jste si udělali čas!
Seznam literatury a (nebo) zdrojů:
Zdroj: habr.com
