Membuat gateway antara Wi-Fi dan LoRa untuk UDP

Saya memiliki impian masa kecil - untuk mengeluarkan tiket jaringan kepada setiap rumah tangga “tanpa WiFi”, yaitu alamat IP dan port. Setelah beberapa waktu, saya menyadari bahwa tidak ada gunanya menunda. Kita harus mengambilnya dan melakukannya.
tugas teknis
Jadikan sebagai gateway M5Stack dengan Modul LoRa terinstal (Gambar 1). Gateway akan terhubung ke jaringan Wi-Fi, di mana ia akan menerima alamat IP lokal melalui DHCP. Gateway akan menyiarkan namanya (analog dengan SSID untuk Wi-Fi) dan jangkauan port yang valid ke dalam siaran LoRa pada frekuensi tertentu, sehingga perangkat lain mengetahui bahwa ada jaringan yang dapat mereka sambungkan dan dalam jangkauan berapa mereka dapat memilih port gratis. Karena ini akan menjadi prototipe, otentikasi kali ini tidak diperlukan. Perangkat klien baru akan menemukan jaringan LoRa yang tersedia dan mengirimkan port yang dipilih ke jaringan tersebut. Setelah gateway menerima port dari klien baru, gateway memeriksa apakah port tersebut gratis; jika ya, gateway akan mendaftarkan klien baru dan mulai mendengarkan port ini di server UDP asinkronnya sendiri. Setelah registrasi, klien akan menerima persetujuan atau penolakan untuk menggunakan port yang dinyatakan. Prosedur pengoperasian ditunjukkan pada Tabel 1.

Gambar 1
Tabel 1
sisi
arah dan data
sisi
sidang
[ klien ]
<— sinyal suar —
[ gerbang ]
0xA1
[ klien ]
— port yang dipilih —>
[ gerbang ]
0xB1
[ klien ]
<— persetujuan atau penolakan —
[ gerbang ]
0xA2
[ klien ]
— Paket UPD —>
[ gerbang ]
0xB2
[ klien ]
<— Paket UPD —
[ gerbang ]
0xA3
[ jaringan ]
<— Paket UPD —
[ gerbang ]
0xC1
Ada berbagai macam Modul untuk M5Stack tergeletak di atas meja di depan saya dan itu membosankan. Mari kita ambil LoR dan bersenang-senang dengannya. Konsep modulnya sendiri luar biasa! Apa yang bisa kukatakan? Namun, saya memiliki modul revisi pertama, yang memiliki antena internal paling buruk, dibuat pada papan sirkuit cetak fleksibel dan direkatkan ke dinding samping casing. Saya pernah melakukan uji lapangan terhadap modul-modul tersebut (Anda dapat menontonnya di saluran berbahasa Rusia di YouTube):

Tentu saja, kami harus menghilangkan dasar-dasar ini dan menyolder antena heliks standar yang disertakan dengan Ra-01. Setelah penyesuaian tersebut, jangkauan komunikasi meningkat secara nyata, tetapi masalah sampingan muncul - antena memiliki diameter lebih besar dari jarak yang diizinkan antar modul. Saya harus meninggalkan Modul Akhir selama proyek berlangsung.
Kesulitan pertama dari sesak yang sinkron
Tampaknya, ambillah perpustakaan WiFiUdp.h, di mana semuanya ada untuk kenyamanan keberadaan server UDP, namun tidak demikian. Pustaka ini dirancang untuk meningkatkan server sinkron, yang sayangnya tidak dapat melayani beberapa koneksi dalam satu thread secara bersamaan. Perpustakaan seperti itu tidak cocok untuk tugas saat ini. Saya harus minum banyak cangkir teh dan mencari perpustakaan yang memungkinkan saya membangun server UDP asinkron yang mampu mendukung banyak koneksi pada saat yang bersamaan. Perpustakaan seperti itu ditemukan - AsyncUDP.h. Apa perbedaan antara server sinkron dan server asinkron? Mari kita lihat enam episode pada Gambar 2 yang secara sederhana menampilkan cara kerja soket.

Gambar 2
Dibintangi:
Orang dalam peran Stopkontak;
Merpati dalam peran Koneksi;
pismo dalam peran анных.
Episode A. Soket sinkron tanpa batas waktu
Pria itu akan berdiri sampai Merpati membawakannya Surat itu.
Episode B. Soket sinkron dengan batas waktu
Manusia menunggu waktu yang telah disepakati dengan Merpati, dan jika tidak tiba tepat waktu, Manusia akan pergi.
Episode C. Soket sinkron dengan multithreading
Pria itu duduk kembali dan menyaksikan Merpati mengantarkan Surat mereka sendiri.
Episode D. Soket asinkron (ketika tidak ada lagi yang bisa diterima)
Seseorang melakukan hal favoritnya, tetapi tidak melupakan Merpati.
Episode E. Soket asinkron (bila ada keuntungan)
Pria itu beristirahat sejenak dari urusannya untuk menerima surat dari Merpati.
Episode F. Soket asinkron dengan multithreading
Pria itu menjalankan urusannya dan menyaksikan Merpati mengantarkan Surat sendiri.
Jika kalian memperhatikannya, mungkin kalian pasti pernah memperhatikan bahwa kerah Merpati di setiap episodenya memiliki warna tertentu. Dan ini bukan tanpa alasan. Di episode A dan B, hanya satu soket yang berfungsi di server dan hanya itu. Di episode C, dua soket sudah berfungsi. Episode D, E dan F sudah memiliki tiga soket. “Mengapa ada dua di sana dan tiga di sini?” - Anda bertanya. Ini bersyarat 2 dan 3, pada kenyataannya, bukannya 2 bisa ada 20, dan bukannya tiga 200. Tujuannya adalah untuk menunjukkan bahwa soket asinkron tidak memanaskan setrika sebanyak soket sinkron.
Di mana berapa banyak barang yang muat?
Mari kita lihat Tabel 1, yang menunjukkan struktur paket UDP dan pikirkan apa yang dapat kita lakukan dengannya.
Tabel 1. Struktur paket UDP
sedikit
0 - 15
16 - 31
0-31
Pelabuhan sumber
Pelabuhan tujuan
32-63
Panjang datagram (Panjang)
Jumlah pemeriksaan
64- ...
Data
Mari tambahkan field lain ke awal tabel ini. Sidang (1 Byte). Ini cukup untuk proyek ini. Berdasarkan Sesi tersebut, perangkat akan mengetahui apa yang harus dilakukan selanjutnya dengan paket tersebut. Sekarang mari kita buat kode untuk sesi tersebut dan tuliskan di Tabel 2.
Tabel 2. Penjelasan sesi
kode
Nama
Klarifikasi
0xA1
Lighthouse
Gateway menyiarkan nama jaringan LoRa dan jangkauan port yang valid pada frekuensi tertentu. Hal ini diperlukan agar klien baru dapat melihat jaringan yang tersedia, dan klien saat ini, ketika tidak ada transmisi, dapat menentukan level sinyal.
0xB1
Aplikasi
Ketika klien telah menemukan jaringan, ia mengirimkan port pilihannya.
0xA2
Persetujuan atau penolakan
Jika port yang diminta oleh klien gratis, maka server merespons dengan persetujuan, dan sebaliknya dengan penolakan.
0xB2
Tautan ke atas
Ketika klien mengirimkan paket UDP ke gateway.
0xA3
Tautan bawah
Ketika gateway mengirimkan paket UDP ke klien.
0xC1
Kelanjutan dari Up-link
Ketika gateway mengirimkan paket UDP ke jaringan lokal.
Bagus. Sekarang mari kita bahas komposisi sesi pada Tabel 3.
Tabel 3. Sesi
Nama sesi
Struktur
Lighthouse
Kode sesi (1 Byte) + Nama jaringan LoRa (4 Byte) + Port awal (2 Byte) + Port akhir (2 Byte)
Aplikasi
Kode transmisi (1 Byte) + nama jaringan LoRa (4 Bytes) + Port pilihan (2 Byte)
Persetujuan atau penolakan
Kode transmisi (1 Byte) + Nama jaringan LoRa (4 Byte) + Port pilihan (2 Byte) + Hasil (1 Byte)
Tautan ke atas
Kode Transmisi (1 Byte) + Nama Jaringan LoRa (4 Byte) + Alamat IP Jarak Jauh (4 Byte) + Port Jarak Jauh (2 Byte) + Alamat IP Lokal (4 Byte) + Port Lokal (2 Byte) + Ukuran Data (2 Byte ) + Data
Tautan bawah
Kode Transmisi (1 Byte) + Nama Jaringan LoRa (4 Byte) + Alamat IP Jarak Jauh (4 Byte) + Port Jarak Jauh (2 Byte) + Alamat IP Lokal (4 Byte) + Port Lokal (2 Byte) + Ukuran Data (2 Byte ) + Data
Kelanjutan dari Up-link
Alamat IP Jarak Jauh (4 Byte) + Port Jarak Jauh (2 Byte) + Ukuran Data (2 Byte) + Data
Saya menulis dua klien untuk Arduino dan untuk M5Stack. Pada Anda dapat melihat cara kerjanya. Tidak ada masalah di dalam apartemen; saya belum melakukan uji lapangan.
Kode sumber tersedia di GitHub di
Anda dapat mempelajari lebih lanjut tentang Perangkat Basis M5Stack dan membelinya di sini
Anda dapat memilih modul nirkabel LoRa untuk Perangkat Dasar
Saya akan senang jika proyek ini bermanfaat bagi Anda. Terima kasih banyak atas waktu Anda!
Daftar referensi dan (atau) sumber:
Sumber: www.habr.com
