Gateway za UDP između Wi-Fi i LoRa

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

Gateway za UDP između Wi-Fi i LoRa

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.

Gateway za UDP između Wi-Fi i LoRa
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):

Reproduciraj videozapis

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.

Gateway za UDP između Wi-Fi i LoRa

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. video Možete vidjeti kako funkcionira. Nema problema unutar stana, ali još nisam napravio nikakva terenska ispitivanja.

Izvorni kod je dostupan na GitHubu na link

Više o M5Stack Basic uređaju i njegovoj kupnji možete saznati ovdje. ovdje

Možete odabrati bežične LoRa module za osnovni uređaj ovdje

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

Kupite pouzdan hosting za stranice s DDoS zaštitom, VPS VDS poslužiteljima 🔥 Kupite pouzdan web hosting sa DDoS zaštitom, VPS VDS servere | ProHoster