ที่เก็บนี้เป็นสถานที่ที่ฉันรวมโครงการทั้งหมดสำหรับการพัฒนา Lora Rhmesh สำหรับวิทยานิพนธ์ของฉัน ฉันจัดทำโครงการทั้งหมดภายในโฟลเดอร์
projectsการพัฒนาทั้งหมดที่รวบรวมจากโครงการต่าง ๆ ที่กระจัดกระจายไปทั่วอินเทอร์เน็ต แต่ฉันพยายามทำให้ง่ายขึ้นและดูแลพวกเขาไปยังโครงการที่ทำงานและเข้าใจได้ฉันพัฒนาส่วนใหญ่บนบอร์ด ESP32 ซึ่งเชื่อมต่อกับชิป RFM95 LORA มันส่งผ่าน 915 MHz ฉันพัฒนาใน 2 สภาพแวดล้อม, Arduino IDE, ปลั๊กอิน VSCODE แพลตฟอร์ม IO
อย่าลังเลที่จะใช้พวกเขาและติดต่อฉันถ้าคุณจะ!
ตัวอย่างตัวอย่างนี้แสดงวิธีการสร้างไคลเอนต์การส่งข้อความที่เชื่อถือได้อย่างง่าย ๆ ที่กำหนดเส้นทางด้วยคลาส RHMESH มันถูกออกแบบมาเพื่อทำงานกับตัวอย่างอื่น ๆ rf95_mesh_server
#define SELF_ADDRESS NODE3_ADDRESS
#define TARGET_ADDRESS FINAL_ADDRESS
RH_TEST_NETWORK กำหนดโทโพโลยีของคุณใน rhrouter.cpp อ่านเพิ่มเติมในส่วนทอพอโลยีบังคับ [RFM95] ------------- [ESP32]
RESET -------------- GPIO14
NSS/CS -------------- GPIO5
SCK -------------- GPIO18
MOSI -------------- GPIO23
MISO -------------- GPIO19
DIO0 -------------- GPIO2
3.3V -------------- 3.3V
GND -------------- GND


หากคุณมีรูปแบบการเดินสายที่แตกต่างกันอย่าลืมเปลี่ยนบรรทัดเหล่านี้ใน main.cpp
#define RFM95_CS 5
#define RFM95_RST 14
#define RFM95_INT 2

ตัวอย่างของโทโพโลยีโหนด 4 ซึ่งคาดว่าโหนด FINAL_ADDRESS คาดว่าจะเป็นโหนดสุดท้ายในเครือข่ายจำลองทอพอโลยีทั่วไปซึ่งโหนดสุดท้ายนี้จะทำหน้าที่เป็นโหนดชายแดนที่เชื่อมต่อกับอินเทอร์เน็ตรวบรวมข้อความจากโหนดอื่น ๆ โหนด 1-3 จะรวบรวมข้อมูลเซ็นเซอร์จากนั้นส่งไปยังโหนดสุดท้ายและในโหนดกระบวนการ 1-3 อาจเป็นโหนดตัวกลางต่อกัน อย่าลังเลที่จะสร้างรูปแบบที่อยู่ที่แตกต่างอย่างสิ้นเชิง
#define NODE1_ADDRESS 1
#define NODE2_ADDRESS 2
#define NODE3_ADDRESS 3
#define FINAL_ADDRESS 255 // purposefully using the last namber
คุณสามารถเปลี่ยนพฤติกรรมโหนดปัจจุบันได้อย่างแข็งขันโดยการเปลี่ยนบรรทัดนี้ ตรวจสอบให้แน่ใจว่าคุณเปลี่ยนมันสำหรับทุกโหนดที่แตกต่างกัน!
const uint8_t selfAddress_ = NODE3_ADDRESS;
const uint8_t targetAddress_ = FINAL_ADDRESS;

หลังจากค้นพบเส้นทางสำหรับโหนดเป้าหมายมันจะถูกบันทึกเป็นเส้นทางการเข้าสู่ตารางการกำหนดเส้นทางภายในโหนดแต่ละโหนดนั้น โดยการบันทึกโหนดโดยตรงถัดไปที่คาดว่าจะสามารถเชื่อมต่อกับโหนดเป้าหมายได้แม้ในฐานะตัวกลาง ดังนั้นในตัวอย่างนี้ node 2 จะบันทึก node 1 ในรายการเส้นทางเพื่อเชื่อมต่อกับ node final โดยไม่ทราบว่า node 1 เป็นโหนดตัวกลางเพียงตัวเดียวหรืออาจมีมากขึ้น ดังนั้น node 1 คาดว่าจะมีเส้นทางที่จะเชื่อมต่อกับ node final ในตัวอย่างนี้มันจะเป็นการเชื่อมต่อโดยตรง node 2 ไม่มีเส้นทางตรงไป node final แต่มีการเชื่อมต่อโดยตรงกับ node 3
เปลี่ยนเป็น 915.0, 434.0 หรือความถี่อื่น ๆ จะต้องตรงกับความพร้อมของ Lora Chip/RX!
#define RF95_FREQ 915.0
ด้วยการใช้ตาข่ายจะมีข้อกำหนดของหน่วยความจำมากกว่า RH หรือ Rhrouter มากและคุณอาจต้อง จำกัด ความยาวข้อความสูงสุด (อักขระ) เพื่อป้องกันการล่มที่ผิดพลาด แม้ว่าคุณสามารถเปลี่ยนแปลงและทดสอบด้วยความยาวข้อความโดยการเปลี่ยนสิ่งนี้
#define RH_MESH_MAX_MESSAGE_LEN 50
คุณสามารถเพิ่มโหมด LORA เฉพาะสำหรับโมดูล RFM95 ได้โดยการแก้ไข rhSetup() ค่าเริ่มต้นหลังจาก init (โดยไม่มี .set set) คือ 434.0MHz, 0.05MHz AFC pull-in, modulation FSK_RB2_4FD36
RHDriver.setTxPower(23, false);
RHDriver.setFrequency(RF95_FREQ);
RHDriver.setCADTimeout(500);
แม้ว่าโครงการนี้จะทำงานบน RHMESH ซึ่งคาดว่าผู้ใช้จะมีทอพอโลยีแบบไดนามิกและของเหลวอย่างเต็มที่คุณสามารถบังคับเส้นทาง/โทโพโลยี มันต้องใช้ hardcoding เล็กน้อยคุณสามารถตรวจสอบรหัสใน rhrouter.cpp (บรรทัด 223-263) มันมีตัวอย่างโทโพโลยีที่ทำไว้ล่วงหน้าแล้วที่บังคับให้กำหนดเส้นทางในวิธีใดวิธีหนึ่ง (มันทำเช่นนี้โดยการทิ้ง/ไม่ประมวลผลข้อความที่ไม่ปฏิบัติตามเส้นทาง) และจำเป็นต้องกำหนด Macro RH_TEST_NETWORK (ก่อนที่จะเรียก #include "rhmesh.h") เพื่อเปิดใช้งานโทโพโลยีที่ถูกบังคับนี้ คุณสามารถเพิ่มรหัสของคุณเองที่คล้ายกับโทโพโลยีที่คุณต้องการ
...
#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))
...
เราจะส่งข้อความไปยังโหนด RHMESH อื่นโดยใช้รหัสนี้เส้นทางไปยังปลายทางจะถูกค้นพบโดยอัตโนมัติ ฟังก์ชั่นการค้นพบนี้เป็นจุดหลักของการใช้ RHMESH โดยอัตโนมัติจะสร้างตารางการกำหนดเส้นทางสำหรับโหนดนี้โดยอัตโนมัติ (สำหรับการตรวจสอบเพิ่มเติมให้ตรวจสอบฟังก์ชั่น bool doArp(uint8_t address); ; ใน RHMesh.h )
if (RHMeshManager.sendtoWait(reinterpret_cast<uint8_t *>(&msgSend[0]), msgSend.size(), targetAddress_) == RH_ROUTER_ERROR_NONE) {
หลังจากบรรทัดนั้นการกลับมาของ true หมายความว่าเราได้ส่งข้อความไปยังโหนดถัดไปอย่างน่าเชื่อถือและโหนดถัดไปได้ส่ง 'ACK' มาให้เรา หากหลังจากเวลาผ่านไปไม่มี ACK SendTowait จะกลับมาเป็น false หมายเหตุสำคัญคือ ACK ไม่ได้มาจากโหนดเป้าหมาย แต่ AnyNode ที่ได้รับข้อความได้สำเร็จ (นอกเหนือจากโหนดเป้าหมายเป็นโหนดตัวกลาง) ปัจจุบัน RHMESH ไม่ได้บอกว่าได้รับข้อความไปยังโหนดเป้าหมายที่ได้รับมอบหมาย 'สุดท้าย' หรือไม่ วิธีการนี้คือ "เพียง" การเพิ่มตรรกะระดับสูง/เลเยอร์แอปพลิเคชันไปยังโหนดเป้าหมาย 'สุดท้าย' ส่งข้อความ REPLY_TYPE ไปยังโหนดผู้ส่ง 'เริ่มต้น' หลังจากได้รับข้อความเป็น ACK เทียม
หลังจากส่งข้อความเรียบร้อยแล้วเราจะกลายเป็น RECEIVING_MODE และรอข้อความที่มาจากโหนดอื่น ในขณะที่ recvfromAckTimeout ใช้งานอยู่มันจะจัดกิจกรรมจนกว่าข้อความจะมาถึงหรือหมดเวลา
if (RHMeshManager.recvfromAckTimeout(_msgRcvBuf, (uint8_t *) sizeof(_msgRcvBuf), 3000, &_msgFrom)) {
localVariable_
_tempVariable
globalVariable