Gateway untuk UDP antara Wi-Fi dan LoRa

Kami membuat gateway antara Wi-Fi dan LoRa untuk UDP



Saya memiliki mimpi masa kecil - untuk memberi setiap rumah tangga perangkat "bebas Wi-Fi" tiket jaringan, yaitu, alamat IP dan porta. Setelah beberapa waktu, saya menyadari bahwa saya seharusnya tidak menundanya. Kita harus mengambil dan melakukannya.


Kerangka Acuan


Jadikan sebagai gateway M5Stack dengan Modul LoRa terpasang (Gambar 1). Gateway akan terhubung ke jaringan Wi-Fi untuk mendapatkan alamat IP lokal melalui DHCP. Gateway akan menyiarkan namanya di LoRa-ether dengan frekuensi tertentu (analog SSID untuk Wi-Fi) dan rentang port yang dapat diterima, sehingga perangkat lain tahu bahwa ada jaringan yang dapat Anda sambungkan dan di mana Anda dapat memilih port gratis. Karena ini akan menjadi prototipe, otentikasi tidak kali ini. Perangkat klien baru akan menemukan jaringan LoRa yang tersedia dan mengirimkan port yang dipilih ke sana. Setelah gateway menerima port dari klien baru, ia memeriksa apakah itu gratis, jika demikian, ia mendaftarkan klien baru dan mulai mendengarkan port ini di server UDP asinkronnya sendiri. Setelah pendaftaran, klien akan menerima persetujuan atau penolakan untuk menggunakan port yang dinyatakan. Prosedur operasi ditunjukkan pada tabel 1.



Gambar 1


Tabel 1


sisiarah dan datasisisesi
[pelanggan]<- sinyal suar -[gerbang]0xA1
[pelanggan]- port yang dipilih ->[gerbang]0xB1
[pelanggan]<- persetujuan atau penolakan -[gerbang]0xA2
[pelanggan]- Paket UPD ->[gerbang]0xB2
[pelanggan]<- Paket UPD -[gerbang]0xA3
[jaringan]<- Paket UPD -[gerbang]0xC1

Sebelum saya di meja ada segala macam Modul untuk M5Stack dan bosan. Mari kita ambil LoR dan bersenang-senang dengannya . Konsep modul itu sendiri sangat indah! Apa yang bisa saya katakan? Tapi, modul revisi pertama saya, di mana antena built-in yang mengerikan, dibuat pada papan sirkuit cetak yang fleksibel dan direkatkan ke dinding samping case. Saya pernah melakukan tes lapangan untuk modul-modul tersebut (Anda dapat menontonnya di saluran berbahasa Rusia di YouTube):



Secara alami, saya harus menghapus rudiments ini dan menyolder antena heliks standar yang datang dengan Ra-01. Setelah penyesuaian seperti itu, jangkauan komunikasi meningkat secara nyata, tetapi muncul titik samping - antena memiliki diameter lebih besar dari jarak yang diperbolehkan antara modul. Saya harus meninggalkan modul Final selama durasi proyek.


Kesulitan pertama dari sesak sinkronis


Tampaknya mengambil perpustakaan WiFiUdp.h , di mana semuanya untuk keberadaan nyaman server UDP, tidak. Perpustakaan dirancang untuk mengangkat server sinkron, yang, sayangnya, tidak dapat melayani beberapa koneksi secara bersamaan. Perpustakaan seperti itu tidak cocok untuk tugas saat ini. Saya harus minum banyak cangkir teh dan mencari perpustakaan yang memungkinkan kami untuk meningkatkan server UDP asinkron yang mampu mendukung banyak koneksi secara bersamaan. Perpustakaan seperti itu ditemukan - AsyncUDP.h . Apa perbedaan antara server yang sinkron dan yang tidak sinkron? Mari kita lihat enam episode pada Gambar 2, di mana opsi operasi socket ditampilkan secara sepele.



Gambar 2


Dibintangi:


Seorang pria dalam peran soket ;


Dove dalam peran Compound ;


Pismo sebagai Data .


Episode A. Soket Sinkron tanpa Batas Waktu


Seseorang akan berdiri sampai Merpati membawakannya Surat.


Episode B. Socket Sinkron dengan Timeout


Seorang pria menunggu waktu yang disepakati dengan Merpati, dan jika dia tidak tiba tepat waktu, maka Pria itu akan pergi.


Episode C. Soket Multithreading Sinkron


Seorang pria duduk dan menonton ketika Merpati mengirimkan Surat sendiri.


Episode D. Soket asinkron (ketika tidak ada lagi yang menerima)


Seorang pria melakukan hal-hal favoritnya, tetapi tidak melupakan Merpati.


Episode E. Soket asinkron (ketika ada sesuatu untuk diterima)


Pria itu sejenak mengalihkan perhatiannya dari urusannya untuk menerima surat dari Dove.


Episode F. Socket Multithreading Asynchronous


Seorang lelaki menjalankan bisnisnya dan mengawasi Merpati mengirimkan Surat sendiri.


Jika Anda berhati-hati, Anda mungkin harus memperhatikan bahwa kerah pada Merpati di setiap episode memiliki warna tertentu. Dan ini bukan kecelakaan. Dalam episode A dan B, hanya satu soket yang berfungsi di server dan hanya itu. Episode C sudah memiliki dua soket. Episode D, E, dan F sudah memiliki tiga soket. "Kenapa ada dua, tapi di sini ada tiga?" - kamu bertanya. Ini kondisional 2 dan 3, pada kenyataannya, bukannya 2 bisa 20, dan bukannya tiga 200. Tugasnya adalah untuk menunjukkan bahwa soket asinkron tidak membakar besi sebanyak yang sinkron.


Dimana yang cocok?


Mari kita lihat tabel 1, yang menunjukkan struktur paket UDP dan berpikir tentang apa yang dapat Anda lakukan.


Tabel 1. Struktur paket UDP


Bits0 - 1516 - 31
0-31Port sumberPelabuhan tujuan
32-63Panjang DatagramChecksum
64 -...Data

Tambahkan bidang Sesi lain (1 Byte) ke bagian paling awal tabel ini. Ini cukup untuk proyek ini. Berdasarkan Sesi, perangkat akan tahu apa yang harus dilakukan dengan paket selanjutnya. Sekarang kita akan membuat kode untuk sesi dan menuliskannya di tabel 2.


Tabel 2. Deskripsi Sesi


KodeJudulPenjelasan
0xA1MercusuarGateway menyiarkan nama jaringan LoRa dan kisaran port yang diizinkan dengan frekuensi tertentu. Ini diperlukan agar klien baru melihat jaringan yang tersedia, dan klien saat ini, ketika tidak ada transmisi, dapat menentukan level sinyal.
0xB1AplikasiKetika klien menemukan jaringan, ia mengirim port yang disukai.
0xA2Persetujuan atau PenolakanJika port yang diminta oleh klien gratis, maka server merespons dengan persetujuan, dan sebaliknya dengan penolakan.
0xB2Tautan ke atasKetika klien mengirim paket UDP ke gateway.
0xA3Tautan bawahKetika gateway mengirim paket UDP ke klien.
0xC1Lanjutan Tautan-AtasKetika gateway mengirim paket UDP ke jaringan lokal.

Bagus Sekarang mari kita bahas komposisi sesi pada tabel 3.


Tabel 3. Sesi


Nama SesiKomposisi
MercusuarKode sesi (1 Byte) + Nama jaringan LoRa (4 Bytes) + Start port (2 Bytes) + End port (2 Bytes)
AplikasiKode Transfer (1 Byte) + Nama Jaringan LoRa (4 Bytes) + Preferred Port (2 Bytes)
Persetujuan atau PenolakanKode transmisi (1 Byte) + Nama jaringan LoRa (4 Bytes) + Port pilihan (2 Bytes) + Hasil (1 Byte)
Tautan ke atasKode transmisi (1 Byte) + Nama jaringan LoRa (4 Bytes) + Alamat IP jarak jauh (4 Bytes) + Port jarak jauh (2 Bytes) + Alamat IP lokal (4 Bytes) + Port lokal (2 Bytes) + Ukuran data (2 Bytes) + Data
Tautan bawahKode transmisi (1 Byte) + Nama jaringan LoRa (4 Bytes) + Alamat IP jarak jauh (4 Bytes) + Port jarak jauh (2 Bytes) + Alamat IP lokal (4 Bytes) + Port lokal (2 Bytes) + Ukuran data (2 Bytes) + Data
Lanjutan Tautan-AtasAlamat IP jarak jauh (4 Bytes) + Remote Port (2 Bytes) + Ukuran Data (2 Bytes) + Data

Menulis dua klien untuk Arduino dan untuk M5Stack. Anda dapat melihat cara kerjanya di video . Tidak ada masalah di dalam apartemen, saya belum melakukan tes lapangan.


Kode sumber tersedia di GitHub di


Pelajari lebih lanjut tentang M5Stack Base Unit dan beli di sini.


Anda dapat memilih modul nirkabel LoRa untuk Unit Dasar di sini


Saya akan senang jika proyek ini bermanfaat bagi Anda. Terima kasih banyak atas waktu Anda!


Referensi dan (atau) sumber:


Source: https://habr.com/ru/post/id482080/


All Articles