Krijojmë një kalim mes Wi-Fi dhe LoRa për UDP

Ishte njĂ« Ă«ndĂ«rr e fĂ«mijĂ«risĂ« time â t'i jepja çdo pajisjeje "paWiFi" njĂ« biletĂ« nĂ« rrjet, dmth. njĂ« adresĂ« IP dhe port. Pas njĂ« kohe, kuptova se nuk duhej ta shtyja. Duhet tĂ« marr e ta bĂ«j.
Detyra teknike
Të bëjmë kalim M5Stack me Modul LoRa të instaluar (ilustrimi 1). Kalimi do të lidhet me rrjetin Wi-Fi, ku do të marrë një adresë IP lokale përmes DHCP. Kalimi do të transmetojë në "LoRa-etër" emrin e tij (analog SSID për Wi-Fi) dhe gamën e portave të lejuara, në mënyrë që pajisjet e tjera të dinë se ka një rrjet të tillë, në të cilin mund të lidhen dhe në cilën gamë mund të zgjedhin një port të lirë. Duke qenë se kjo do të jetë një prototip, autentifikimi nuk do të ndodhë këtë herë. Pajisjet e reja-klientë do të gjejnë rrjetin e disponueshëm LoRa dhe do t'i dërgojnë atij portin e zgjedhur. Pasi kalimi të marrë nga klienti i ri portin, verifikon nëse ai është i lirë, nëse po, regjistron klientin e ri dhe fillon të dëgjojë portin në serverin e tij asinkron UDP. Pas regjistrimit, klienti do të marrë miratimin ose refuzimin për përdorimin e portit të shpallur. Rendi i funksionimit është paraqitur në tabelën 1.

Figura 1
Tabela 1
anë
direksioni dhe të dhënat
anë
seancë
[ klient ]
<â sinjali i majĂ«s â
[ kalim ]
0xA1
[ klient ]
â porti i zgjedhur â>
[ kalim ]
0xB1
[ klient ]
<â miratimi ose refuzimi â
[ kalim ]
0xA2
[ klient ]
â paketa UPD â>
[ kalim ]
0xB2
[ klient ]
<â paketa UPD â
[ kalim ]
0xA3
[ rrjet ]
<â paketa UPD â
[ kalim ]
0xC1
Para meje nĂ« tavolinĂ« janĂ« disa Module pĂ«r M5Stack dhe po ndihen tĂ« mĂ«rzitur. Le ta marrim LoR'Ă«n dhe tĂ« argĂ«tohemi me tĂ«. Koncepti i moduleve Ă«shtĂ« i mrekullueshĂ«m! ĂfarĂ« tĂ« them? Por, modulet qĂ« kam janĂ« tĂ« revizionit tĂ« parĂ«, ku antena e integruar Ă«shtĂ« mjaft e keqe, e bĂ«rĂ« nĂ« njĂ« pllakĂ« tĂ« fleksibĂ«l qarku dhe e ngjitur nĂ« anĂ«n e trupit. NjĂ« herĂ« bĂ«ra teste nĂ« terren me kĂ«to module (mund tĂ« shihni nĂ« kanalin rus nĂ« YouTube):

Natyrisht, mĂ« duhej tĂ« hiqja kĂ«to mbetje dhe tĂ« ngjisja antena spirale qĂ« vijnĂ« me Ra-01. Pas njĂ« personalizimi tĂ« tillĂ«, distanca e lidhjes u pĂ«rmirĂ«sua ndjeshĂ«m, por u shfaq njĂ« moment anĂ«sor â antena ka njĂ« diametĂ«r mĂ« tĂ« madh se distanca e lejuar midis moduleve. MĂ« duhej tĂ« heq dorĂ« nga Moduli pĂ«rfundimtar pĂ«r njĂ« kohĂ« gjatĂ« projektit.
Vështirësitë e para nga ngurtësia e sinkronizimit
Duket se duhet tĂ« marr librarinĂ« WiFiUdp.h, ku ku gjithçka Ă«shtĂ« pĂ«r ekzistencĂ«n e rehatshme tĂ« serverit UDP, nuk ka. Biblioteka Ă«shtĂ« menduar pĂ«r ngritjen e njĂ« serveri sinhron, i cili, pĂ«r keqardhje tĂ« thellĂ«, nuk mund tĂ« shĂ«rbejĂ« njĂ«kohĂ«sisht disa lidhjeve nĂ« njĂ« rrjedhĂ«. NjĂ« bibliotekĂ« e tillĂ« nuk Ă«shtĂ« e pĂ«rshtatshme pĂ«r detyrĂ«n aktuale. Duhej tĂ« pija shumĂ« filxhane çaji dhe tĂ« kĂ«rkoja njĂ« bibliotekĂ« qĂ« do tĂ« lejonte ngritjen e njĂ« serveri asinkron UDP qĂ« Ă«shtĂ« nĂ« gjendje tĂ« mbĂ«shtesĂ« shumĂ« lidhje nĂ« tĂ« njĂ«jtĂ«n kohĂ«. NjĂ« bibliotekĂ« e tillĂ« u gjend â AsyncUDP.h. Cila Ă«shtĂ« ndarja mes njĂ« serveri sinhron dhe njĂ« asinkron? Le tĂ« shqyrtojmĂ« gjashtĂ« episode nĂ« figurĂ«n 2, ku janĂ« thjesht paraqitur opsionet e funksionimit tĂ« soketeve.

Figura 2
NĂ« rolet kryesore:
Njeriu në rol Socketi;
Peli në rol Lidhjet;
Letra në rol Të Dhënat.
Epizodi A. Socketi sinhron pa kohë të caktuar
Njeriu do të qëndrojë derisa Peli të sjellë Letra.
Epizodi B. Socketi sinhron me kohë të caktuar
Njeriu pret kohën e diskutuar me Pelin, dhe, nëse ai nuk vjen në kohë, atëherë Njeriu do të largohet.
Epizodi C. Socketi sinhron me shumë rrjedha
Njeriu po kalon kohën dhe vëzhgon sesi Pelit vetë sjellin Letra.
Epizodi D. Socketi asinkron (kur nuk ka çfarë të merrni)
Njeriu merret me aktivitetet e tij të preferuara, por nuk e harron Pelin.
Epizodi E. Socketi asinkron (kur ka çfarë të merrni)
Njeriu u shpërqendrua për një moment nga aktivitetet e tij për të marrë një letër nga Peli.
Epizodi F. Socketi asinkron me shumë rrjedha
Njeriu është duke u marrë me punët e tij dhe vëzhgon sesi Peli vetë sjellin Letra.
Nëse ishit të vëmendshëm, patjetër që keni vënë re se byrekët në Pelit në çdo epizod kanë një ngjyrë të caktuar. Dhe kjo nuk është përndryshe. Në epizodet A dhe B në server punon vetëm një socket dhe mjafton. Në epizodin C punojnë tashmë dy socketë. Në epizodet D, E dhe F janë tre socketë. "Pse atje janë dy, e këtu janë tre?" do të pyesni. Këto janë kushtimisht 2 dhe 3, në të vërtetë për 2 mund të jetë 20, dhe për tre 200. Qëllimi është të tregohet se socketët asinkronë nuk e ngarkojnë harduerin ashtu si socketët sinhron.
Sa dhe çfarë kap?
Le të shqyrtojmë tabelën 1, e cila shfaq strukturën e paketës UDP dhe të mendojmë se çfarë mund të bëjmë me të.
Tabelë 1. Struktura e paketës UDP
Bits
0 â 15
16 â 31
0-31
Porti i dërguesit (Source port)
Porti i marrësit (Destination port)
32-63
Gjatësia e datagramit (Length)
Kontrolli i shumës (Checksum)
64-âŠ
Të Dhënat (Data)
Do të shtojmë një fushë tjetër në fillim të kësaj tabele Sesioni (1 Byte). Kjo është e mjaftueshme për këtë projekt. Sipas Sesionit, pajisja do të dijë se çfarë të bëjë me paketën më pas. Tani do të konceptojmë kodet për sesionet dhe do t'i regjistrojmë ato në tabelën 2.
Tabela 2. Shpjegimi i sesioneve
Kodi
Emri
Shpjegimi
0xA1
Far
Gateway-i transmeton emrin e rrjetit LoRa dhe gamën e porteve të pranuara me një periudhë të caktuar. Kjo është e nevojshme që klientët e rinj të shohin rrjetin e disponueshëm, ndërsa klientët aktualë, kur nuk ka transmetimesh, të përcaktojnë nivelin e sinjalit.
0xB1
Aplikimi
Kur klienti zbulohet rrjeti, ai dërgon portin e preferuar.
0xA2
Konsenti ose refuzimi
Nëse porta e kërkuar nga klienti është e lirë, serveri përgjigjet me konsent, nd otherwise me refuzim.
0xB2
Up-link
Kur klienti dërgon një paketë UDP në gateway.
0xA3
Down-link
Kur gateway-i dërgon një paketë UDP te klienti.
0xC1
Vazhdimi i Up-link
Kur gateway-i dërgon një paketë UDP në rrjetin lokal.
Mirë, tani le të diskutojmë për përbërjen e sesioneve në tabelën 3.
Tabela 3. Sesionet
Emri i sesionit
Përbërja
Far
Kodi i sesionit (1 Byte) + Emri i rrjetit LoRa (4 Byte) + Porta fillestare (2 Byte) + Porta përfundimtare (2 Byte)
Aplikimi
Kodi i transferimit (1 Byte) + Emri i rrjetit LoRa (4 Byte) + Porta e preferuar (2 Byte)
Konsenti ose refuzimi
Kodi i transferimit (1 Byte) + Emri i rrjetit LoRa (4 Byte) + Porta e preferuar (2 Byte) + Rezultati (1 Byte)
Up-link
Kodi i transferimit (1 Byte) + Emri i rrjetit LoRa (4 Byte) + Adresa IP e largët (4 Byte) + Porta e largët (2 Byte) + Adresa IP lokale (4 Byte) + Porta lokale (2 Byte) + Madhësia e të dhënave (2 Byte) + Të dhëna
Down-link
Kodi i transferimit (1 Byte) + Emri i rrjetit LoRa (4 Byte) + Adresa IP e largët (4 Byte) + Porta e largët (2 Byte) + Adresa IP lokale (4 Byte) + Porta lokale (2 Byte) + Madhësia e të dhënave (2 Byte) + Të dhëna
Vazhdimi i Up-link
Adresa IP e largët (4 Byte) + Porta e largët (2 Byte) + Madhësia e të dhënave (2 Byte) + Të dhëna
Krijova dy klientë për Arduino dhe për M5Stack. Në mund të shihni se si funksionon kjo. Brenda apartamentit nuk ka ndonjë problem, testet në terren nuk i kam bërë ende.
Kodi burimor është i disponueshëm në GitHub në
Mësoni më shumë rreth Pajisjes Bazë M5Stack dhe mund ta blini
Zgjidhni modulët pa tel LoRa për Pajisjen Bazë
Do të jem i lumtur nëse ky projekt do t'ju ndihmojë. Faleminderit shumë për kohën tuaj!
Lista e literaturës dhe (ose) burimeve:
Burimi: habr.com
