Loome UDP jaoks Wi-Fi ja LoRa vahel vÀrava

Mul oli lapsepĂ”lve unistus â anda igale kodusele "ilma Wi-Fi" seadmele pilet vĂ”rku, s.t. IP-aadress ja port. Aja jooksul sain aru, et ei tasu edasi lĂŒkata. Tuleb lihtsalt vĂ”tta ja teha.
Tehniline ĂŒlesanne
Tehke M5Stacki vĂ€rav, millel on paigaldatud LoRa moodul (joonis 1). VĂ€rav on ĂŒhendatud Wi-Fi vĂ”rku, kus see saab DHCP kaudu kohalikku IP-aadressi. VĂ€rav saadab teatud ajavahemike jĂ€rel "LoRa-eetris" oma nime (sarnane SSID-ile Wi-Fi-s) ning lubatud portide vahemiku, et teised seadmed teaksid, et selline vĂ”rk on olemas ja millises vahemikus nad saavad valida avatud pordi. Kuna see on prototĂŒĂŒp, siis autentimist seekord ei toimu. Uued kliendiseadmed leiavad saadaval oleva LoRa-vĂ”rgu ja edastavad sellele valitud pordi. Kui vĂ€rav on saanud uue kliendi porti, kontrollib ta, kas see on vaba, ja kui jah, registreerib uue kliendi ning hakkab kuulama antud porti oma asĂŒnkroonse UDP-serveri kaudu. PĂ€rast registreerimist saab klient kas jahisĂ”numi vĂ”i keeldumise valitud pordi kasutamiseks. Töökorraldus on esitatud tabelis 1.

Joonis 1
Tabel 1
kĂŒlg
suund ja andmed
kĂŒlg
seanss
[ klient ]
<â signaal-mĂ€rkerohi â
[ vÀrav ]
0xA1
[ klient ]
â valitud port â>
[ vÀrav ]
0xB1
[ klient ]
<â nĂ”usolek vĂ”i keeldumine â
[ vÀrav ]
0xA2
[ klient ]
â UPD-pakett â>
[ vÀrav ]
0xB2
[ klient ]
<â UPD-pakett â
[ vÀrav ]
0xA3
[ vÔrk ]
<â UPD-pakett â
[ vÀrav ]
0xC1
Minu laual on igasuguseid M5Stack'i mooduleid, mis ootavad tegevust. Vaatame LoR'it ja meelelahutame end sellega. Moodulite mĂ”te on suurepĂ€rane! Mida siin öelda? Kuid mul on esimesed versioonid, milles on kohutav sisseehitatud antenn, mis on valmistatud painduvale trĂŒkkplaadile ja kleebitud korpuse kĂŒlgpinnale. Ma tegin kord nende moodulitega vĂ€litestide seeria (saate vaadata vene keelses YouTube'i kanalis):

Loomulikult tuli need jÀÀnused eemaldada ja keevitada sisse standardsed spiraal antennid, mis tulevad koos Ra-01'ga. PĂ€rast sellist kohandamist paranes ĂŒhenduse ulatus mĂ€rgatavalt, kuid tekkis kĂ”rvalmĂ”ju â antenn on suurema lĂ€bimÔÔduga kui lubatud kaugus moodulite vahel. Tuli projektist loobuda LĂ”ppmodulist ajutiselt.
Alguses ilmnevad raskused synhroniseeritud jÀikusega
Tundub, et vĂ”ta raamatukogu WiFiUdp.h, kus on kĂ”ik vajalikud tingimused UDP-serveri mugavaks toimimiseks, paraku ei ole. Raamatukogu on mĂ”eldud sĂŒnkroonse serveri seadistamiseks, mis, kurvastuseks, ei suuda samal ajal hallata mitut ĂŒhendust ĂŒhes voos. Selline raamatukogu ei sobi praeguseks ĂŒlesandeks. Olin sunnitud jooma palju tassi teed ja otsima raamatukogu, mis vĂ”imaldaks seadistada asĂŒnkroonset UDP-serverit, mis suudab toetada mitut ĂŒhendust korraga. Selline raamatukogu leiti â AsyncUDP.h. Mis on siis sĂŒnkroonse ja asĂŒnkroonse serveri vahe? Vaatame kuut episoodi joonisel 2, kus on lihtsalt nĂ€idatud sokettide töövĂ”imaluste eri variandid.

Joonis 2
Peaosades:
Inimene rollis Soket;
Tuvi rollis Ăhendus;
Kiri rollis Andmed.
Episood A. SĂŒnkroonne soket ilma ajaĂŒlevaatuseta
Inimene seisab, kuni Tuvi toob talle Kirja.
Episood B. SĂŒnkroonne soket ajaĂŒlevaatuseta
Inimene ootab koos Tuvi kokkulepitud aega ja, kui Tuvi ei tule Ôigeks ajaks, siis Inimene lahkub.
Episood C. SĂŒnkroonne soket mitme lĂ”imega
Inimene laiskleb ja jÀlgib, kuidas Tuvid ise toovad Kirju.
Episode D. AsĂŒnkroonne sokket (kui pole veel midagi vastuvĂ”tta)
Inimene tegeleb oma lemmiktegevustega, kuid ei unusta Tuvisid.
Episode E. AsĂŒnkroonne sokket (kui on, mida vastu vĂ”tta)
Inimene eemaldas korraks oma tegemistest, et saada kiri Tuvalt.
Episode F. AsĂŒnkroonne sokket koos mitme toiminguga
Inimene tegeleb oma asjadega ja jÀlgib, kuidas Tuvid toovad Kirjat ise.
Kui olete tĂ€helepanelik olnud, siis kindlasti olete mĂ€rganud, et Tuvidel on igas episoodis kindel kaelarihmade vĂ€rv. Ja see pole juhuslik. Episoodides A ja B töötab serveris vaid ĂŒks sokket. Episoodis C töötab juba kaks sokket. Episoodides D, E ja F on juba kolm sokket. "Miks seal on kaks ja siin kolm?" â kĂŒsite teie. Need on tinglikud 2 ja 3, tegelikult vĂ”ib 2 asemel olla 20 ja kolme asemel 200. EesmĂ€rk on nĂ€idata, et asĂŒnkroonsed soketid ei koorma riistvara nii, nagu sĂŒnkroonsed.
Kuhu, kui palju, mida mahub?
Vaatame tabelit 1, kus on toodud UDP-paketi struktuur ja mÔtleme, mida sellega teha.
Tabel 1. UDP-paketi struktuur
Bitid
0 â 15
16 â 31
0-31
Saatja port (Source port)
Saaja port (Destination port)
32-63
Datagrammi pikkus (Length)
Kontrollsumma (Checksum)
64-âŠ
Andmed (Data)
Lisame selles tabelis veel ĂŒhe vĂ€liku algusesse Sessioon (1 bait). Seda on selle projekti jaoks piisavalt. Sessioonist lĂ€htuvalt teab seade, kuidas paketiga edasi tegutseda. NĂŒĂŒd mĂ”tleme vĂ€lja sessioonikoodid ja kanname need tabelisse 2.
Tabel 2. Sessioonide selgitus
Kood
Nimi
Selgitus
0xA1
Majakas
VĂ€rav edastab LoRa vĂ”rgu nime ja lubatud portide vahemikku teatud sagedusega. See on vajalik, et uued kliendid nĂ€eksid saadaolevat vĂ”rku, ja juba registreeritud kliendid, kui ĂŒlegandeid ei toimu, saaksid mÀÀrata signaali taset.
0xB1
PĂŒsikĂŒsimus
Kui klient on vÔrgu avastanud, saadab ta soovitud porta.
0xA2
NÔusolek vÔi keeld
Kui klient soovitud port on vaba, vastab server nÔusolekuga, muul juhul toimub keeld.
0xB2
ĂlesĂŒlekande
Kui klient edastab UDP-paketti vÀravale.
0xA3
AllasĂŒlekande
Kui vÀrav edastab UDP-paketti kliendile.
0xC1
ĂlesĂŒlekande jĂ€tk
Kui vÀrav saadab UDP-paketti kohaliku vÔrku.
Hea. NĂŒĂŒd arutame sessioonide koostist tabelis 3.
Tabel 3. Sessioonid
Sessiooni nimi
Koostis
Majakas
Sessioonikood (1 bait) + LoRa vÔrgu nimi (4 baiti) + Algne port (2 baiti) + LÔpp-port (2 baiti)
PĂŒsikĂŒsimus
Edastuskoodeks (1 bait) + LoRa vÔrgu nimi (4 bait) + Eelistatud port (2 bait)
NÔusolek vÔi keeld
Edastuskoodeks (1 bait) + LoRa vÔrgu nimi (4 bait) + Eelistatud port (2 bait) + Tulem (1 bait)
ĂlesĂŒlekande
Edastuskoodeks (1 bait) + LoRa vÔrgu nimi (4 bait) + Kaug IP-aadress (4 bait) + Kaug port (2 bait) + Kohalik IP-aadress (4 bait) + Kohalik port (2 bait) + Andmete suurus (2 bait) + Andmed
Down-link
Edastuskoodeks (1 bait) + LoRa vÔrgu nimi (4 bait) + Kaug IP-aadress (4 bait) + Kaug port (2 bait) + Kohalik IP-aadress (4 bait) + Kohalik port (2 bait) + Andmete suurus (2 bait) + Andmed
ĂlesĂŒlekande jĂ€tk
Kaug IP-aadress (4 bait) + Kaug port (2 bait) + Andmete suurus (2 bait) + Andmed
Olen loonud kaks klienti Arduino ja M5Stack jaoks. Saate vaadata kuidas see töötab. Korteris pole probleeme, aga ma pole veel vÀlitestimist teinud.
LĂ€htekood on saadaval GitHubis aadressil
Rohkem teavet M5Stack Basic seadme kohta ning selle ostmine on saadaval
Valige LoRa traadita moodulid M5Stack Basic seadme jaoks
Olen rÔÔmus, kui see projekt on teile kasulik. Suur tÀnu, et leidsite aega!
Kirjanduse ja (vÔi) allikate nimekiri:
Allikas: habr.com
