Brána pro UDP mezi Wi-Fi a LoRa

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

Brána pro UDP mezi Wi-Fi a LoRa

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.

Brána pro UDP mezi Wi-Fi a LoRa
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):

Přehrát video

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ů.

Brána pro UDP mezi Wi-Fi a LoRa

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 video 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 odkazu

Zjistit více o základním zařízení M5Stack a zakoupit lze tady

Vybrat bezdrátové moduly LoRa pro základní zařízení lze tady

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

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster