Repositori ini adalah tempat di mana saya memasukkan semua proyek untuk pengembangan Lora Rhmesh untuk tesis saya. Saya menyediakan semua proyek dalam folder
projects. Semua pengembangan yang dikumpulkan dari banyak proyek berbeda yang tersebar di seluruh internet, tetapi saya mencoba untuk menyederhanakan dan merawatnya ke proyek yang berfungsi dan dapat dimengerti.Saya mengembangkan terutama di papan ESP32, terhubung dengan chip Lora RFM95. Ini mentransmisikan pada 915 MHz. Saya mengembangkan 2 lingkungan, IDE Arduino, plugin platform IO VScode.
Jangan ragu untuk menggunakannya, dan hubungi saya jika Anda mau!
Contoh sketsa ini menunjukkan cara membuat klien pesan yang ditangani sederhana dan dapat diandalkan dengan kelas RhMesh. Itu dirancang untuk bekerja dengan contoh lain rf95_mesh_server
#define SELF_ADDRESS NODE3_ADDRESS
#define TARGET_ADDRESS FINAL_ADDRESS
RH_TEST_NETWORK menentukan topologi Anda di rhroouter.cpp. Baca lebih lanjut di bagian topologi paksa [RFM95] ------------- [ESP32]
RESET -------------- GPIO14
NSS/CS -------------- GPIO5
SCK -------------- GPIO18
MOSI -------------- GPIO23
MISO -------------- GPIO19
DIO0 -------------- GPIO2
3.3V -------------- 3.3V
GND -------------- GND


Jika Anda memiliki skema kabel yang berbeda, jangan lupa mengubah garis -garis ini di main.cpp
#define RFM95_CS 5
#define RFM95_RST 14
#define RFM95_INT 2

Contoh topologi 4 node ini, di mana node FINAL_ADDRESS diharapkan menjadi simpul terakhir dalam jaringan, mensimulasikan topologi umum di mana simpul terakhir ini akan bertindak sebagai simpul perbatasan yang terhubung ke internet, mengumpulkan pesan dari node lain selama hidupnya, kemudian mengirim mereka ke cloud. Node 1-3 akan mengumpulkan data sensor kemudian mengirim ke node akhir, dan di simpul proses 1-3 bisa menjadi simpul perantara untuk satu sama lain. Jangan ragu untuk membuat skema pengalamatan yang sama sekali berbeda.
#define NODE1_ADDRESS 1
#define NODE2_ADDRESS 2
#define NODE3_ADDRESS 3
#define FINAL_ADDRESS 255 // purposefully using the last namber
Anda dapat secara aktif mengubah perilaku node saat ini dengan mengubah garis ini. Pastikan Anda mengubahnya untuk setiap node yang berbeda!
const uint8_t selfAddress_ = NODE3_ADDRESS;
const uint8_t targetAddress_ = FINAL_ADDRESS;

Setelah rute ditemukan untuk node target, itu akan disimpan sebagai entri rute tabel peruteannya di dalam masing -masing node tersebut. Dengan menyimpan simpul langsung berikutnya yang diharapkan dapat menghubungkannya dengan node target, bahkan sebagai perantara. Jadi dalam contoh ini, node 2 hanya menyimpan node 1 di entri rute untuk terhubung dengan node final , tidak tahu apakah node 1 adalah satu -satunya node perantara, atau mungkin ada lebih banyak. Oleh karena itu, node 1 diharapkan memiliki rute untuk terhubung dengan node final , dalam contoh ini akan menjadi koneksi langsung. node 2 tidak memiliki rute langsung ke node final , tetapi memiliki koneksi langsung dengan node 3
Ubah ke 915.0, 434.0 atau frekuensi lainnya, harus cocok dengan lora chip/rx freq!
#define RF95_FREQ 915.0
Dengan menggunakan mesh, ia memiliki persyaratan memori yang jauh lebih besar daripada hanya RH atau rhroutter, dan Anda mungkin perlu membatasi panjang pesan maksimal (karakter) untuk mencegah kerusakan yang aneh. Padahal Anda dapat mengubah dan bereksperimen dengan panjang pesan dengan mengubah ini
#define RH_MESH_MAX_MESSAGE_LEN 50
Anda dapat menambahkan mode LORA spesifik untuk modul RFM95 dengan mengedit rhSetup() . Default setelah init (tanpa eksplisit .set ) adalah 434.0MHz, 0,05MHz AFC pull-in, modulasi FSK_RB2_4FD36.
RHDriver.setTxPower(23, false);
RHDriver.setFrequency(RF95_FREQ);
RHDriver.setCADTimeout(500);
Meskipun proyek ini berjalan di Rhmesh, yang akan mengharapkan pengguna memiliki topologi yang sepenuhnya dinamis dan lancar, Anda dapat memaksa rute/topologi. Ini membutuhkan sedikit hardcoding, Anda dapat memeriksa kode di rhrouter.cpp (baris 223-263). Ini sudah memiliki beberapa contoh topologi premade yang memaksa routing dengan cara tertentu (ia melakukan ini dengan menjatuhkan/tidak memproses pesan yang tidak mematuhi jalur), dan makro RH_TEST_NETWORK perlu didefinisikan (sebelum menyebut #include "rhmesh.h") untuk mengaktifkan topologi paksa ini. Anda dapat menambahkan kode Anda sendiri yang menyerupai topologi yang Anda inginkan.
...
#ifdef RH_TEST_NETWORK
if (
#if RH_TEST_NETWORK==1
// This network looks like 1-2-3-4
(_thisAddress == 1 && _from == 2)
|| (_thisAddress == 2 && (_from == 1 || _from == 3))
|| (_thisAddress == 3 && (_from == 2 || _from == 4))
|| (_thisAddress == 4 && _from == 3)
#elif RH_TEST_NETWORK==2
// This network looks like 1-2-4
// | | |
// --3--
(_thisAddress == 1 && (_from == 2 || _from == 3))
|| _thisAddress == 2
|| _thisAddress == 3
|| (_thisAddress == 4 && (_from == 2 || _from == 3))
...
Kami akan mengirim pesan ke simpul rhmesh lain menggunakan kode ini, rute ke tujuan akan ditemukan secara otomatis. Fungsi penemuan ini adalah titik utama menggunakan rhmesh, secara otomatis menghasilkan tabel perutean untuk simpul ini (untuk penyelidikan lebih lanjut, periksa fungsi bool doArp(uint8_t address); dalam RHMesh.h ).
if (RHMeshManager.sendtoWait(reinterpret_cast<uint8_t *>(&msgSend[0]), msgSend.size(), targetAddress_) == RH_ROUTER_ERROR_NONE) {
Setelah baris itu, kembalinya true berarti kami telah mengirimkan pesan ke simpul berikutnya, dan simpul berikutnya telah mengirimi kami 'ACK'. Jika setelah waktu tertentu tidak ada ACK, SendTowait akan mengembalikan false . Catatan penting adalah, ACK bukan dari node target, tetapi anynode yang telah berhasil menerima pesan (selain dari node target, adalah simpul perantara). Saat ini Rhmesh tidak memberi tahu apakah pesan telah berhasil diterima ke simpul target 'final' yang ditugaskan. Jalannya adalah dengan "cukup" menambahkan logika lapisan tingkat tinggi/aplikasi ke simpul target 'final', mengirimkan pesan REPLY_TYPE ke simpul pengirim 'awal' setelah menerima pesan, sebagai ACK buatan (fitur tersebut saat ini tidak diimplementasikan dalam repo ini).
Setelah berhasil mengirim pesan, kami berubah menjadi RECEIVING_MODE dan menunggu pesan yang datang dari simpul lain. Sementara recvfromAckTimeout aktif, itu akan mengadakan kegiatan sampai pesan tiba, atau waktu tunggu.
if (RHMeshManager.recvfromAckTimeout(_msgRcvBuf, (uint8_t *) sizeof(_msgRcvBuf), 3000, &_msgFrom)) {
localVariable_
_tempVariable
globalVariable