Gumagawa ng gateway sa pagitan ng Wi-Fi at LoRa para sa UDP

Nagkaroon ako ng pangarap noong bata pa ako - na mag-isyu sa bawat sambahayan ng "walang WiFi" na device ng tiket sa network, ibig sabihin, isang IP address at port. Pagkaraan ng ilang oras, natanto ko na walang saysay ang pagpapaliban. Kailangan nating kunin at gawin.
Teknikal na gawain
Gawin itong M5Stack gateway na may naka-install na LoRa Module (Figure 1). Ikokonekta ang gateway sa Wi-Fi network, kung saan makakatanggap ito ng lokal na IP address sa pamamagitan ng DHCP. Ibo-broadcast ng gateway ang pangalan nito (katulad ng SSID para sa Wi-Fi) at ang hanay ng mga valid na port sa LoRa broadcast sa isang partikular na frequency, para malaman ng ibang mga device na mayroong network kung saan sila makakakonekta at sa anong range maaari silang pumili ng isang libreng port. Dahil ito ay isang prototype, hindi kinakailangan ang pagpapatunay sa oras na ito. Ang mga bagong client device ay makakahanap ng available na LoRa network at ipapadala ang napiling port dito. Matapos makatanggap ang gateway ng port mula sa isang bagong client, sinusuri nito kung ito ay libre, kung gayon, irerehistro nito ang bagong kliyente at magsisimulang makinig sa port na ito sa sarili nitong asynchronous na UDP server. Pagkatapos ng pagpaparehistro, ang kliyente ay makakatanggap ng pahintulot o pagtanggi na gamitin ang ipinahayag na port. Ang pamamaraan ng pagpapatakbo ay ipinapakita sa Talahanayan 1.

Figure 1
Table 1
sa gilid
direksyon at datos
sa gilid
session
[ kliyente ]
<— hudyat ng parola —
[ pasukan ]
0xA1
[ kliyente ]
— napiling daungan —>
[ pasukan ]
0xB1
[ kliyente ]
<— pagsang-ayon o pagtanggi —
[ pasukan ]
0xA2
[ kliyente ]
— Pakete ng UPD —>
[ pasukan ]
0xB2
[ kliyente ]
<— Pakete ng UPD —
[ pasukan ]
0xA3
[ lambat ]
<— Pakete ng UPD —
[ pasukan ]
0xC1
Mayroong lahat ng uri ng mga Module para sa M5Stack na nakahiga sa mesa sa harap ko at sila ay mayamot. Kunin natin ang LoR at magsaya dito. Ang konsepto ng mga module mismo ay kahanga-hanga! Ano ang masasabi ko? Ngunit, mayroon akong unang mga module ng rebisyon, na may pinakamasamang built-in na antenna, na ginawa sa isang nababaluktot na naka-print na circuit board at nakadikit sa gilid ng dingding ng kaso. Minsan ay nagsagawa ako ng mga pagsubok sa larangan ng naturang mga module (maaari mong panoorin ang mga ito sa channel na Russian-language sa YouTube):

Naturally, kinailangan naming tanggalin ang mga pangunahing kaalaman at panghinang na ito sa karaniwang helical antenna na kasama ng Ra-01. Pagkatapos ng naturang pagpapasadya, kapansin-pansing bumuti ang hanay ng komunikasyon, ngunit lumitaw ang isang side issue - ang antenna ay may diameter na mas malaki kaysa sa pinapayagang distansya sa pagitan ng mga module. Kinailangan kong iwanan ang Pangwakas na Module para sa tagal ng proyekto.
Ang mga unang paghihirap mula sa kasabay na higpit
Mukhang, kunin ang library WiFiUdp.h, kung saan ang lahat ay naroroon para sa kumportableng pagkakaroon ng isang UDP server, hindi ito ang kaso. Ang library ay idinisenyo para sa pagpapalaki ng isang kasabay na server, na, sa kasamaang-palad, ay hindi maaaring sabay na magseserbisyo ng ilang koneksyon sa isang thread. Ang nasabing silid-aklatan ay hindi angkop para sa kasalukuyang gawain. Kinailangan kong uminom ng maraming tasa ng tsaa at maghanap ng library na magpapahintulot sa akin na bumuo ng isang asynchronous na UDP server na may kakayahang suportahan ang maraming koneksyon nang sabay-sabay. Natagpuan ang gayong silid-aklatan - AsyncUDP.h. Ano ang pagkakaiba sa pagitan ng isang kasabay na server at isang asynchronous? Tingnan natin ang anim na yugto sa Figure 2 na walang kabuluhang nagpapakita kung paano gumagana ang mga socket.

Figure 2
Pag-Star:
Tao sa papel Socket;
Pigeon sa papel Mga koneksyon;
Pismo sa papel Анных.
Episode A. Synchronous socket nang walang timeout
Tatayo ang lalaki hanggang sa dalhin sa kanya ng Kalapati ang Liham.
Episode B. Synchronous socket na may timeout
Naghihintay ang Lalaki sa panahong napagkasunduan sa Kalapati, at kung hindi ito dumating sa oras, aalis ang Lalaki.
Episode C. Synchronous socket na may multithreading
Umupo ang lalaki at pinapanood ang mga kalapati na mag-isa na naghahatid ng mga Sulat.
Episode D. Asynchronous socket (kapag wala nang matatanggap)
Ginagawa ng isang tao ang kanyang mga paboritong bagay, ngunit hindi nakakalimutan ang tungkol sa mga Pigeon.
Episode E. Asynchronous socket (kapag may makukuha)
Ang lalaki ay nagpahinga sandali mula sa kanyang mga gawain upang makatanggap ng isang liham mula sa Kalapati.
Episode F. Asynchronous na socket na may multithreading
Ang lalaki ay gumagawa ng kanyang negosyo at pinapanood ang mga Pigeon na naghahatid ng mga Sulat nang mag-isa.
Kung binibigyang pansin mo, malamang na napansin mo na ang mga kwelyo sa mga Pigeon sa bawat episode ay may isang tiyak na kulay. At ito ay hindi walang dahilan. Sa episode A at B, isang socket lang ang gumagana sa server at iyon na. Sa episode C, gumagana na ang dalawang socket. Ang mga Episode D, E at F ay mayroon nang tatlong socket. "Bakit dalawa doon at tatlo dito?" - tanong mo. Ang mga ito ay may kondisyon na 2 at 3, sa katunayan, sa halip na 2 ay maaaring mayroong 20, at sa halip na tatlong 200. Ang layunin ay upang ipakita na ang mga asynchronous na socket ay hindi nagpapainit ng bakal nang kasing dami ng mga kasabay.
Saan magkasya ang magkano ng anumang bagay?
Tingnan natin ang Talahanayan 1, na nagpapakita ng istraktura ng isang UDP packet at isipin kung ano ang magagawa natin dito.
Talahanayan 1. UDP packet structure
bits
0 - 15
16 - 31
0-31
Pinagmulan na port
Destination port
32-63
Haba ng datagram (Haba)
Checksum
64- ...
Data
Magdagdag tayo ng isa pang field sa pinakasimula ng talahanayang ito. Session (1 Byte). Ito ay sapat na para sa proyektong ito. Batay sa Session, malalaman ng device kung ano ang susunod na gagawin sa packet. Ngayon, gumawa tayo ng mga code para sa mga session at isulat ang mga ito sa Talahanayan 2.
Talahanayan 2. Pagpapaliwanag ng mga sesyon
Kodigo
Pangalan
Linaw
0xA1
Lighthouse
Ang gateway ay nagbo-broadcast ng pangalan ng LoRa network at ang hanay ng mga wastong port sa isang tiyak na dalas. Ito ay kinakailangan upang makita ng mga bagong kliyente ang magagamit na network, at ang mga kasalukuyang kliyente, kapag walang mga pagpapadala, ay maaaring matukoy ang antas ng signal.
0xB1
Paglalapat
Kapag natuklasan ng kliyente ang network, ipinapadala nito ang ginustong port nito.
0xA2
Pagsang-ayon o pagtanggi
Kung ang port na hiniling ng kliyente ay libre, ang server ay tumugon nang may pahintulot, at kung hindi man ay may pagtanggi.
0xB2
Pataas na link
Kapag nagpadala ang kliyente ng UDP packet sa gateway.
0xA3
Pababang link
Kapag ang gateway ay nagpapadala ng isang UDP packet sa kliyente.
0xC1
Pagpapatuloy ng Up-link
Kapag nagpadala ang gateway ng UDP packet sa lokal na network.
ayos lang. Ngayon talakayin natin ang komposisyon ng mga sesyon sa Talahanayan 3.
Talahanayan 3. Mga Sesyon
Pangalan ng session
Kaayusan
Lighthouse
Session code (1 Byte) + LoRa network name (4 Bytes) + Start port (2 Bytes) + End port (2 Bytes)
Paglalapat
Transmission code (1 Byte) + LoRa network name (4 Bytes) + Preferred port (2 Bytes)
Pagsang-ayon o pagtanggi
Transmission code (1 Byte) + LoRa network name (4 Byte) + Preferred port (2 Byte) + Resulta (1 Byte)
Pataas na link
Transmission Code (1 Byte) + LoRa Network Name (4 Bytes) + Remote IP Address (4 Bytes) + Remote Port (2 Bytes) + Local IP Address (4 Bytes) + Local Port (2 Bytes) + Laki ng Data (2 Bytes) ) + Data
Down-link
Transmission Code (1 Byte) + LoRa Network Name (4 Bytes) + Remote IP Address (4 Bytes) + Remote Port (2 Bytes) + Local IP Address (4 Bytes) + Local Port (2 Bytes) + Laki ng Data (2 Bytes) ) + Data
Pagpapatuloy ng Up-link
Remote IP Address (4 Bytes) + Remote Port (2 Bytes) + Laki ng Data (2 Bytes) + Data
Sumulat ako ng dalawang kliyente para sa Arduino at para sa M5Stack. Naka-on makikita mo kung paano ito gumagana. Walang mga problema sa loob ng apartment;
Available ang source code sa GitHub sa
Maaari kang matuto nang higit pa tungkol sa M5Stack Base Device at pagbili
Maaari kang pumili ng LoRa wireless modules para sa Base Device
Ako ay natutuwa kung ang proyektong ito ay kapaki-pakinabang sa iyo. Maraming salamat sa iyong oras!
Listahan ng mga sanggunian at (o) mga mapagkukunan:
Pinagmulan: www.habr.com
