Wi-Fi ve LoRa arasındaki UDP geçidi

Wi-Fi və LoRa arasında UDP qapısı yaradırıq

Wi-Fi ve LoRa arasındaki UDP geçidi

Mənim uşaqlıq xəyalim var idi - hər bir ev əşyasına "Wi-Fi olmayan" şəbəkəyə bilet vermək, yəni IP ünvanı və port. Bir az vaxt keçdikdən sonra başa düşdüm ki, buna gecikmək lazım deyil. Sadəcə bunu etmək lazımdır.

Texniki tapşırıq

M5Stack-i LoRa Modulu ilə qapı kimi istifadə edin (şəkil 1). Qapı Wi-Fi şəbəkəsinə qoşulacaq, burada DHCP vasitəsilə yerli IP ünvanı alacaq. Qapı müəyyən aralıqlarla öz adını "LoRa hava"sında yayacaq (Wi-Fi üçün analoqu SSID) və icazə verilən portların diapazonunu verəcək, beləliklə, digər qurğular hansı şəbəkəyə qoşula biləcəklərini və hansı diapazonlarda sərbəst port seçməyi biləcəklər. Bu prototip olduğundan, bu dəfə autentifikasiya olmayacaq. Yeni müştəri qurğuları mövcud LoRa şəbəkəsini tapacaq və seçilmiş portu ona göndərəcək. Qapı yeni müştəridən portu aldıqdan sonra, onun sərbəst olub-olmadığını yoxlayacaq, əgər sərbəstdirsə, yeni müştərini qeydiyyata alacaq və öz asinxron UDP serverində göstərilən portu dinləməyə başlayacaq. Qeydiyyatdan sonra müştəri, tələbat etdiyi portun istifadəsi üçün razılıq və ya imtina alacaq. İş prinsipi cədvəl 1-də göstərilmişdir.

Wi-Fi ve LoRa arasındaki UDP geçidi
Şəkil 1

Cədvəl 1

səhifə
istiqamət və məlumatlar
səhifə
seans

[ müştəri ]
<— siqnal-blok —
[ qapı ]
0xA1

[ müştəri ]
— seçilmiş port —>
[ qapı ]
0xB1

[ müştəri ]
<— razılıq və ya imtina —
[ qapı ]
0xA2

[ müştəri ]
— UDP-paket —>
[ qapı ]
0xB2

[ müştəri ]
<— UDP-paket —
[ qapı ]
0xA3

[ şəbəkə ]
<— UDP-paket —
[ qapı ]
0xC1

Masanın üstündə M5Stack üçün müxtəlif modullar var və onlar canı sıxılırlar. Gəlin LoRa alaq və onunla oynayaq. Modul anlayışı gözəldir! Nə deyə bilərik? Lakin, modul üstündən birinci reviziya, dəhşətli birləşdirilmiş antenası ilə gəlib və bu antena elastik çap plakası üzərində hazırlanmışdır və korpusun yan divarına yapışdırılmışdır. Belə modulların sahə testlərini bir dəfə apardım (Rus dilli YouTube kanalında baxmaq olar):

Videonu izləyin

Təbii ki, bu qalıntıları çıxarmaq və Ra-01 ilə gələn standart spiral antenaları lehimləmək lazım gəldi. Belə bir dəyişiklikdən sonra əlaqə məsafəsi nəzərəçarpacaq dərəcədə artdı, lakin yan təsir meydana çıxdı - antenanın diametri modullar arasındakı icazə verilən məsafədən daha böyükdür. Layihənin vaxtı üçün Sonlandırıcı modulu buraxmalı olduq.

Sinxron sərtlikdən ilk çətinliklər

Görünür, götürmək lazımdır WiFiUdp.h, burada UDP serverinin rahat mövcudluğu üçün hər şey var, lakin yoxdur. Kitabxana sinxron server yaratmaq üçün nəzərdə tutulub ki, bu da, dərin təəssüf ki, eyni anda bir axında bir neçə bağlantını idarə edə bilmir. Belə bir kitabxana cari tapşırığa uyğun deyil. Çox çay içmək və eyni anda bir neçə bağlantını dəstəkləyən asinxron UDP serveri yaratmağa imkan verən kitabxanaları axtarmaq lazım gəldi. Belə bir kitabxana tapıldı - AsyncUDP.hAsynchronous server ilə sinxron server arasındakı fərq nədir? Gəlin Şəkil 2-dəki altı epizodu nəzərdən keçirək, burada socketlərin işləmə variantları təqdim olunur.

Wi-Fi ve LoRa arasındaki UDP geçidi

Şəkil 2

Baş rollarda:

İnsan rolunda Socket;

Kabutar rolunda Bağlantı;

Məktub rolunda Məlumat.

Epizod A. Sinxron socket, vaxt limitliyi olmadan

İnsan, Kabutardan Məktub almadan dayanacaq.

Epizod B. Sinxron socket, vaxt limitliyi ilə

İnsan, Kabutarla razılaşdığı müddətdə gözləyir və əgər o, vaxtında gəlməzsə, İnsan gedəcək.

Epizod C. Sinxron socket, çoxhissəli

İnsan, çoxlu Kabutarlara Məktub çatdırmasını izləyərək, heç bir iş görmür.

Epizod D. Asinxron socket (hələ alınacaq bir şey yoxdur)

İnsan, sevdiyi işlərlə məşğuldur, lakin Kabutarlara diqqətini itirmir.

Epizod E. Asinxron socket (bir şey alınacaqdır)

İnsan, Kabutardan Məktub almaq üçün işlərindən qısa müddətə uzaqlaşır.

Epizod F. Asinxron socket, çoxhissəli

İnsan, işləri ilə məşğuldur və Kabutarlara Məktub çatdırmasını izləyir.

Əgər diqqətli olmuşsunuzsa, hər epizodda Kabutarlardakı boyunbaqların müəyyən rəngdə olduğunu mütləq gördünüz. Bunun səbəbi var. Epizod A və B-də serverdə yalnız bir socket aktivdir. Epizod C-də iki socket işləyir. Epizodlar D, E və F-də isə üç socket var. "Niyə orada iki, burada üç var?" - soruşa bilərsiniz. Bu, şərti olaraq 2 və 3-dür, əslində 2 yerinə 20, 3 yerinə isə 200 ola bilər. Məqsəd asinxron socketlərin sinxronlardan daha az resurs sərf etdiyini göstərməkdir.

Nə qədər şey harada sığına bilər?

Gəlin Cədvəl 1-i nəzərdən keçirək, burada UDP paketinin strukturu təqdim olunub və bununla nə edə biləcəyimiz haqqında düşünək.

Cədvəl 1. UDP paketinin strukturu

Bitlər
0 — 15
16 — 31

0-31
Göndərən port (Source port)
Alıcı port (Destination port)

32-63
Datagram uzunluğu (Length)
Yoxlama cəmi (Checksum)

64-...
Məlumat (Data)

Bu cədvəlin başına bir əlavə sahə əlavə edək. Seans (1 Bayt). Bu, bu layihə üçün kifayətdir. Seans əsasında cihaz paketi gələcəkdə necə idarə edəcəyini biləcək. İndi seans kodlarını tərtib edək və Cədvəl 2-də qeyd edək.

Cədvəl 2. Seansların izahı

Kod
Ad
Izah

0xA1
İşarə
Şlüz, LoRa şəbəkəsi adını və müəyyən bir müddətdə icazə verilən portların aralığını yayır. Bu, yeni müştərilərin əlçatan şəbəkəni görməsi üçün, hazırkı müştərilərin isə ötürümlərin olmadığı zaman siqnal səviyyəsini müəyyən etməsi məqsədilə vacibdir.

0xB1
Tələb
Müştəri şəbəkəni aşkar etdikdə, o, seçdiyi portu göndərir.

0xA2
Razılıq və ya imtina
Əgər müştərinin sorğuladığı port açıqdırsa, server razılıq ilə cavab verir, əks halda imtina edir.

0xB2
Up-lynк
Müştəri UDP paketini şlüzə göndərdiyi zaman.

0xA3
Down-lynк
Şlüz, UDP paketini müştəriyə göndərdiyi zaman.

0xC1
Up-lynк-ın davamı
Şlüz, UDP paketini yerli şəbəkəyə göndərdiyi zaman.

Yaxşı. İndi gəlin Cədvəl 3-də seansların tərkibini müzakirə edək.

Cədvəl 3. Seanslar

Seansın adı
Tərkibi

İşarə
Seans kodu (1 Bayt) + LoRa şəbəkəsinin adı (4 Bayt) + Başlanğıc portu (2 Bayt) + Son port (2 Bayt)

Tələb
Köçürmə kodu (1 Bayt) + LoRa şəbəkəsinin adı (4 Bayt) + Seçim portu (2 Bayt)

Razılıq və ya imtina
Köçürmə kodu (1 Bayt) + LoRa şəbəkəsinin adı (4 Bayt) + Seçim portu (2 Bayt) + Nəticə (1 Bayt)

Up-lynк
Köçürmə kodu (1 Bayt) + LoRa şəbəkəsinin adı (4 Bayt) + Uzaq IP ünvanı (4 Bayt) + Uzaq port (2 Bayt) + Yerli IP ünvanı (4 Bayt) + Yerli port (2 Bayt) + Məlumat həcmi (2 Bayt) + Məlumatlar

Down-link
Köçürmə kodu (1 Bayt) + LoRa şəbəkəsinin adı (4 Bayt) + Uzaq IP ünvanı (4 Bayt) + Uzaq port (2 Bayt) + Yerli IP ünvanı (4 Bayt) + Yerli port (2 Bayt) + Məlumat həcmi (2 Bayt) + Məlumatlar

Up-lynк-ın davamı
Uzaq IP ünvanı (4 Bayt) + Uzaq port (2 Bayt) + Məlumat həcmi (2 Bayt) + Məlumatlar

Arduino və M5Stack üçün iki müştəri yazdım. Video bunu necə işlədiyini görə bilərsiniz. Mənzilin içində heç bir problem yoxdur, hələ sahə testləri aparmamışam.

Mənbə kodu GitHub-da mövcuddur: linkdə

M5Stack-in Əsas cihazı haqqında daha çox məlumat əldə edib ala bilərsiniz. burada

Əsas cihaz üçün LoRa simsiz modullarını seçə bilərsiniz. burada

Bu layihənin sizə faydalı olacağını düşünürəm. Vaxt ayırdığınız üçün təşəkkür edirəm!

İstinadlar və (ya) mənbələr siyahısı:

Mənbə: habr.com

DDoS qoruması olan saytlara etibarlı hosting satın alın, VPS VDS serverlər 🔥 DDoS qoruması olan saytlara etibarlı hosting satın alın, VPS VDS serverlər | ProHoster