Izgradnja pristupnika između Wi-Fi-ja i LoRa-e za UDP

Imao sam dječji san da svakom kućnom uređaju koji "ne-Wi-Fi" dam mrežnu pristupnu karticu, tj. IP adresu i port. Nakon nekog vremena shvatio sam da nema smisla odgađati. Morao sam to učiniti.
Tehnički zadatak
Postavite M5Stack s instaliranim LoRa modulom kao pristupnikom (Slika 1). Pristupnik će biti spojen na Wi-Fi mrežu, gdje će putem DHCP-a primati lokalnu IP adresu. Pristupnik će periodički emitirati svoje ime (slično SSID-u za Wi-Fi) i raspon dostupnih portova preko LoRa mreže, obavještavajući druge uređaje da postoji mreža na koju se mogu spojiti i koji raspon portova mogu odabrati. Budući da će ovo biti prototip, autentifikacija neće biti potrebna. Novi klijentski uređaji pronaći će dostupnu LoRa mrežu i emitirati odabrani port na nju. Nakon što pristupnik primi port od novog klijenta, provjerava je li dostupan. Ako jest, registrira novog klijenta i počinje slušati na ovom portu na vlastitom asinkronom UDP poslužitelju. Nakon registracije, klijent će dobiti potvrdu hoće li koristiti deklarirani port. Postupak rada prikazan je u Tablici 1.

Slika 1
Tablica 1
stranka
smjer i podaci
stranka
sjednica
[klijent]
<— signal svjetionika —
[ pristupnik ]
0xA1
[klijent]
— odabrani priključak —>
[ pristupnik ]
0xB1
[klijent]
<— pristanak ili odbijanje —
[ pristupnik ]
0xA2
[klijent]
— Paket ažuriranja —>
[ pristupnik ]
0xB2
[klijent]
<— UPD-paket —
[ pristupnik ]
0xA3
[ mreža ]
<— UPD-paket —
[ pristupnik ]
0xC1
Dosadno mi je što mi na stolu leže svakakvi M5Stack moduli. Uzmimo malo LoR-a i zabavimo se s njim. Koncept modula je briljantan! Što reći? Ali moji moduli su prva revizija i imaju užasnu ugrađenu antenu, napravljenu na fleksibilnoj tiskanoj pločici i zalijepljenu sa strane kućišta. Jednom sam testirao ove module na terenu (možete pogledati na ruskom YouTube kanalu):

Naravno, morao sam ukloniti te ostatke i zalemiti standardne spiralne antene koje dolaze s Ra-01. Nakon ove prilagodbe, domet komunikacije se značajno poboljšao, ali se pojavila nuspojava: promjer antene bio je veći od dopuštene udaljenosti između modula. Morao sam napustiti konačni modul za vrijeme trajanja projekta.
Prve poteškoće zbog sinkrone krutosti
Čini se, uzmite knjižnicu WiFiUdp.h, koji ima sve što je UDP poslužitelju potrebno za udobno funkcioniranje, ali ne. Biblioteka je dizajnirana za pokretanje sinkronog poslužitelja, koji, nažalost, ne može istovremeno obraditi više veza u jednoj niti. Takva biblioteka nije prikladna za trenutni zadatak. Morao sam popiti mnogo šalica čaja i tražiti biblioteku koja bi mi omogućila pokretanje asinkronog UDP poslužitelja sposobnog za istovremenu podršku više veza. Pronašao sam takvu biblioteku— AsyncUDP.hKoja je razlika između sinkronog i asinkronog poslužitelja? Pogledajmo šest scenarija na slici 2, koji trivijalno ilustriraju opcije rada utičnice.

Slika 2
Glumi:
Čovjek u ulozi Utičnica;
golubica u ulozi Veze;
Pismo u ulozi Podaci.
Epizoda A. Sinkroni utičnica bez vremenskog ograničenja
Čovjek će stajati dok mu Golubica ne donese Pismo.
Epizoda B. Sinkroni utičnica s vremenskim ograničenjem
Osoba čeka vrijeme dogovoreno s Golubicom, a ako ne stigne na vrijeme, osoba će otići.
Epizoda C. Sinkroni utičnica s višenitnim radom
Čovjek se nasloni i promatra kako golubovi sami dostavljaju Pisma.
Epizoda D. Asinkroni socket (Kada nema ništa drugo za primati)
Čovjek je zauzet svojim omiljenim stvarima, ali ne zaboravlja na Golubice.
Epizoda E. Asinkroni socket (Kada postoji nešto za primiti)
Čovjek je na trenutak predahnuo od posla kako bi primio pismo od Golubice.
Epizoda F. Asinkroni socket s višenitnim radom
Čovjek ide svojim poslom i promatra kako golubovi sami dostavljaju pisma.
Ako ste obraćali pažnju, vjerojatno ste primijetili da su ogrlice Golubica u svakoj epizodi drugačije boje. I to nije slučajno. U epizodama A i B, poslužitelj ima samo jedan pokrenut socket. U epizodi C, rade dva socketa. U epizodama D, E i F, postoje po tri socketa. "Zašto dva tamo, a tri ovdje?" mogli biste pitati. To su 2 i 3, ali u stvarnosti, 2 bi moglo biti 20, a 3 bi moglo biti 200. Cilj je pokazati da asinhroni socketi nisu toliko zahtjevni kao sinkroni.
Gdje koliko čega stane?
Pogledajmo Tablicu 1, koja prikazuje strukturu UDP paketa, i razmislimo što možemo s njom učiniti.
Tablica 1. Struktura UDP paketa
komadići
0 - 15
16 - 31
0-31
Izvorni priključak
Odredišna luka
32-63
Duljina datagrama (Length)
Kontrolni zbroj
64- ...
Podaci
Dodajmo još jedno polje na sam početak ove tablice. Sjednica (1 bajt). To je dovoljno za ovaj projekt. Na temelju sesije, uređaj će znati što dalje učiniti s paketom. Sada smislimo kodove sesije i zabilježimo ih u Tablicu 2.
Tablica 2. Objašnjenje sesija
Šifra
ime
razjašnjenje
0xA1
svjetionik
Pristupnik periodički emitira naziv LoRa mreže i raspon dopuštenih portova. To je potrebno kako bi novi klijenti mogli vidjeti dostupnu mrežu, a postojeći klijenti mogu odrediti jačinu signala kada nema prijenosa.
0xB1
Primjena
Kada klijent otkrije mrežu, šalje svoj preferirani port.
0xA2
Pristanak ili odbijanje
Ako je port koji je zatražio klijent slobodan, poslužitelj odgovara pristankom, u suprotnom odbijanjem.
0xB2
Uzlazna veza
Kada klijent šalje UDP paket prema pristupniku.
0xA3
Down-link
Kada pristupnik šalje UDP paket klijentu.
0xC1
Nastavak uzlazne veze
Kada pristupnik šalje UDP paket lokalnoj mreži.
U redu. Sada raspravimo sastav sesije u Tablici 3.
Tablica 3. Sesije
Naziv sesije
Struktura
svjetionik
Kod sesije (1 bajt) + Naziv LoRa mreže (4 bajta) + Početni port (2 bajta) + Završni port (2 bajta)
Primjena
Prijenosni kod (1 bajt) + Naziv LoRa mreže (4 bajta) + Preferirani port (2 bajta)
Pristanak ili odbijanje
Prijenosni kod (1 bajt) + Naziv LoRa mreže (4 bajta) + Preferirani port (2 bajta) + Rezultat (1 bajt)
Uzlazna veza
Prijenosni kod (1 bajt) + Naziv LoRa mreže (4 bajta) + Udaljena IP adresa (4 bajta) + Udaljeni port (2 bajta) + Lokalna IP adresa (4 bajta) + Lokalni port (2 bajta) + Veličina podataka (2 bajta) + Podaci
Down-link
Prijenosni kod (1 bajt) + Naziv LoRa mreže (4 bajta) + Udaljena IP adresa (4 bajta) + Udaljeni port (2 bajta) + Lokalna IP adresa (4 bajta) + Lokalni port (2 bajta) + Veličina podataka (2 bajta) + Podaci
Nastavak uzlazne veze
Udaljena IP adresa (4 bajta) + Udaljeni port (2 bajta) + Veličina podataka (2 bajta) + Podaci
Napisao sam dva klijenta za Arduino i M5Stack. Možete vidjeti kako funkcionira. Nema problema unutar stana, ali još nisam napravio nikakva terenska ispitivanja.
Izvorni kod je dostupan na GitHubu na
Više o M5Stack Basic uređaju i njegovoj kupnji možete saznati ovdje.
Možete odabrati bežične LoRa module za osnovni uređaj
Bilo bi mi drago ako vam ovaj projekt bude koristan. Puno vam hvala na izdvojenom vremenu!
Popis literature i/ili izvora:
Izvor: www.habr.com
