Loome Wi-Fi ja LoRa vahel UDP-i sild.

Mul oli lapsena unistus â anda igale kodusele âilma Wi-Fi-taâ seadmele pilet vĂ”rku, st IP-aadress ja port. MĂ”ne aja pĂ€rast sain aru, et ei tasu edasi lĂŒkata. Tuleb vĂ”tta ja teha.
Tehniline ĂŒlesanne
Tehke M5Stackist sild, millel on paigaldatud LoRa moodul (joonis 1). Sild ĂŒhendatakse Wi-Fi-vĂ”rguga, et saada DHCP kaudu kohalik IP-aadress. Sild edastab regulaarselt âLoRa-eetrisâ oma nime (sarnane SSID-le Wi-Fi-le) ja lubatud portide vahemikku, et teised seadmed teaksid, et selline vĂ”rk on olemas, millele saab ĂŒhenduda ja millises vahemikus vabade portide valida. Kuna see on prototĂŒĂŒp, pole autentimine seekord vajalik. Uued kliendi seadmed leiavad saadaval oleva LoRa-vĂ”rgu ja edastavad selle valitud porta. PĂ€rast seda, kui sild on saanud uuelt kliendilt porta, kontrollib, kas see on vaba, ja kui jah, registreerib uue kliendi ning hakkab kuulama antud porta oma asĂŒnkroonse UDP-serveris. PĂ€rast registreerimist saab klient nĂ”usoleku vĂ”i keeldumise valitud porta kasutamiseks. Töökorraldus on esitatud tabelis 1.

Joonis 1
Tabel 1
kĂŒlg
suund ja andmed
kĂŒlg
sessioon
[ klient ]
<â signaal-majak â
[ sild ]
0xA1
[ klient ]
â valitud port â>
[ sild ]
0xB1
[ klient ]
<â nĂ”usolek vĂ”i keeldumine â
[ sild ]
0xA2
[ klient ]
â UPD-pakett â>
[ sild ]
0xB2
[ klient ]
<â UPD-pakett â
[ sild ]
0xA3
[ vÔrk ]
<â UPD-pakett â
[ sild ]
0xC1
Minu laual on erinevad M5Stacki moodulid ja nad igatsevad. Vaatame, kas saame LoR'aga natuke lĂ”butseda. Moodulite kontseptsioon on suurepĂ€rane! Mida siia öelda? Aga mul on esimesed versioonid, kus on kohutav integreeritud antenn, mis on tehtud paindlikust trĂŒkkplaadist ja liimitud korpuse kĂŒlgseinale. Ăkskord viisin lĂ€bi vĂ€litestid nende moodulitega (vĂ”ite vaadata venekeelsel YouTube'i kanalis):

Muidugi tuli need jÀÀgid eemaldada ja sisse joodetakse standardsed spiraalsed antennid, mis tulevad koos Ra-01-ga. PĂ€rast sellist kohandamist on sideulatus mĂ€rgatavalt paranenud, kuid tekkis kĂ”rvalnĂ€ht â antenni lĂ€bimÔÔt on suurem kui lubatud kaugus moodulite vahel. Tuli projektis ajutiselt loobuda lĂ”ppmodulist.
Esimene raskus sĂŒnergilise jĂ€ikuse tĂ”ttu
Tundub, et vĂ”tta on raamatukogu WiFiUdp.h, kus kĂ”ik on olemas mugavaks UDP-serveri eksisteerimiseks, nii et ei ole. Raamatukogu on mĂ”eldud sĂŒntaktilise serveri loomiseks, mis, sĂŒgava kahetsusega, ei saa korraga teenindada mitmeid ĂŒhendusi samas lĂ”imes. Selline raamatukogu ei sobi praeguseks ĂŒlesandeks. Pidi jooma palju tasse teed ja otsima raamatukogu, mis vĂ”imaldaks luua asĂŒnkroonset UDP-serverit, mis suudab toetada palju ĂŒhendusi samaaegselt. Selline raamatukogu leiti â AsyncUDP.h. Mis on asĂŒnkroonse serveri ja sĂŒntaktilise serveri vahe? Vaatame kuut episoodi joonisel 2, kus on selgelt nĂ€idatud sokettide töövĂ”imalusi.

Joonis 2
Peaosades:
Inimene rollis Sokett;
Kohvits rollis Ăhendus;
Kiri rollis Andmed.
Episood A. SĂŒntaktiline sokett ilma ajapiiranguta
Inimene seisab, kuni Kohvits toob talle Kirja.
Episood B. SĂŒntaktiline sokett ajapiiranguga
Inimene ootab Kohvitsa kokkulepitud aega, ja kui ta ei saabu Ôigel ajal, lahkub inimene.
Episood C. SĂŒntaktiline sokett mitme lĂ”imega
Inimene loorib ja jÀlgib, kuidas Kohvits ise Kiri toob.
Episood D. AsĂŒnkroonse soketi (kui pole veel midagi vastu vĂ”tta)
Inimene tegeleb oma lemmiktegevustega, kuid ei unusta Kohvitsaid.
Episood E. AsĂŒnkroonse soketi (kui on, mida saada)
Inimene eemaldas veidi oma tegevust, et saada kiri Kohvitsalt.
Episood F. AsĂŒnkroonse soketi mitme lĂ”imega
Inimene tegeleb oma asjadega ja jÀlgib, kuidas Kohvits ise Kiri toob.
Kui olite tĂ€helepanelik, siis olete tĂ”enĂ€oliselt tĂ€hele pannud, et Kohvitsate kaelarihmadel igas episoodis on kindel vĂ€rv. Ja see pole juhus. Episoodides A ja B töötab serveris ainult ĂŒks sokett ja kĂ”ik. Episoodis C töötavad juba kaks soketti. Episoodides D, E ja F on juba kolm soketti. âMiks seal on kaks ja seal kolm?â â kĂŒsite Te. See on tinglikult 2 ja 3, tegelikult vĂ”ib seal olla 20, ja kolmes 200. Ălesanne nĂ€idata, et asĂŒnkroonsed soketid ei koormata riistvara sama palju kui sĂŒntaktilised.
Kuhu ja kui palju midagi mahub?
Vaatame tabelit 1, kus on toodud UDP-paketi struktuur, ja mÔtleme, mida selle tegemisega alustada.
Tabel 1. UDP-paketi struktuur
Bitid
0 â 15
16 â 31
0-31
Saatja port (Source port)
Saaja port (Destination port)
32-63
Daatagrafi pikkus (Length)
Kontrollsummad (Checksum)
64-âŠ
Andmed
Lisame juurde veel ĂŒhe vĂ€lja tabeli algusesse Seanss (1 bait). Seda on antud projekti jaoks piisavalt. Seansi pĂ”hjal saab seade aru, mida teha paketiga edasi. NĂŒĂŒd mĂ”tleme vĂ€lja koodid seansside jaoks ja kirjutame need tabelisse 2.
Tabel 2. Seansside selgitus
Kood
Nimi
Selgitus
0xA1
Piik
Loodus hÀÀlestab LoRa vÔrgu nime ja lubatud sadamate vahemiku kindla ajavahemiku jÀrel. See on vajalik, et uued kliendid nÀeksid saadaval olevat vÔrku, ja olemasolevad kliendid saaksid signaali taset mÀÀrata, kui edastusi ei toimu.
0xB1
PĂ€ring
Kui klient on vÔrgu avastanud, saadab ta eelistatud sadama.
0xA2
NÔusolek vÔi keeldumine
Kui kliendi poolt kĂŒsitud sadam on vaba, vastab server nĂ”usolekuga, vastasel juhul keeldumisega.
0xB2
Ăleslink
Kui klient edastab UDP-paketi siit.
0xA3
Allaling
Kui siht edastab UDP-paketi kliendile.
0xC1
Ăleslinki jĂ€tkamine
Kui siht saadab UDP-paketi kohalikku vÔrku.
Hea. NĂŒĂŒd arutame seansside koostist tabelis 3.
Tabel 3. Seansid
Seansi nimi
Koostis
Piik
Seansi kood (1 bait) + LoRa vÔrgu nimi (4 baiti) + Algne port (2 baiti) + LÔpp-port (2 baiti)
PĂ€ring
Edastamise kood (1 bait) + LoRa vÔrgu nimi (4 baiti) + Eelistatud port (2 baiti)
NÔusolek vÔi keeldumine
Edastamise kood (1 bait) + LoRa vÔrgu nimi (4 baiti) + Eelistatud port (2 baiti) + Tulemus (1 bait)
Ăleslink
Edastamise kood (1 bait) + LoRa vÔrgu nimi (4 baiti) + Kaug-IP-aadress (4 baiti) + Kaug-port (2 baiti) + Kohalik IP-aadress (4 baiti) + Kohalik port (2 baiti) + Andmete suurus (2 baiti) + Andmed
Allaling
Edastamise kood (1 bait) + LoRa vÔrgu nimi (4 baiti) + Kaug-IP-aadress (4 baiti) + Kaug-port (2 baiti) + Kohalik IP-aadress (4 baiti) + Kohalik port (2 baiti) + Andmete suurus (2 baiti) + Andmed
Ăleslinki jĂ€tkamine
Kaug-IP-aadress (4 baiti) + Kaug-port (2 baiti) + Andmete suurus (2 baiti) + Andmed
Kirjutasin kaks klienti Arduinole ja M5Stackile. Saate vaadata, kuidas see töötab. Korteris pole mingeid probleeme, vÀlitestid pole veel tehtud.
Allika kood on saadaval GitHubis aadressil
Saate rohkem teada M5Stacki baasseadmest ja osta selle
Saate valida LoRa-ĂŒhenduse mooduleid baasseadmest
Olen rÔÔmus, kui see projekt on teile kasulik. Suur tÀnu, et leidsite aega!
Kirjanduse ja (vÔi) allikate loetelu:
Allikas: habr.com
