이 저장소는 논문을위한 Lora Rhmesh 개발을위한 모든 프로젝트를 포함하는 장소입니다.
projects폴더 내의 모든 프로젝트를 제공합니다. 인터넷 전체에 다양한 프로젝트에서 수집 된 모든 개발은 인터넷 전체에 흩어져 있었지만, 나는 그것들을 작동하고 이해할 수있는 프로젝트로 단순화하고 손질하려고 노력합니다.나는 주로 RFM95 LORA 칩과 연결된 ESP32 보드에서 발전합니다. 915 MHz에서 전달됩니다. 2 개의 환경, Arduino IDE, Platform IO VScode 플러그인을 개발합니다.
자유롭게 사용하고, 원한다면 저에게 연락하십시오!
이 예제 스케치는 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

FINAL_ADDRESS 노드가 네트워크의 마지막 노드가 될 것으로 예상되는 4 가지 노드 토폴로지 의이 예는이 마지막 노드가 인터넷에 연결된 테두리 노드 역할을하여 수명 동안 다른 노드에서 메시지를 수집 한 다음 클라우드로 보내는 일반적인 토폴로지를 시뮬레이션합니다. 노드 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 final 연결을 위해 node 1 node 1 노드 1 만 저장합니다. 따라서 node 1 node final 에 연결하는 경로가있을 것으로 예상되며,이 예에서는 직접 연결됩니다. node 2 node final 직접 경로가 없지만 node 3 과 직접 연결됩니다.
915.0, 434.0 또는 기타 주파수로 변경하려면 Lora Chip/RX의 FREQ와 일치해야합니다!
#define RF95_FREQ 915.0
메쉬를 사용하면 RH 또는 RHROUT보다 메모리 요구 사항이 훨씬 높으며 광범위한 충돌을 방지하기 위해 최대 메시지 길이 (문자)를 제한해야 할 수도 있습니다. 이것을 변경하여 메시지 길이를 변경하고 실험 할 수 있지만
#define RH_MESH_MAX_MESSAGE_LEN 50
rhSetup() 편집하여 RFM95 모듈에 대한 특정 LORA 모드를 추가 할 수 있습니다. 이후의 기본값 (명시 적 .set 없음)은 434.0MHz, 0.05MHz AFC 풀인, 변조 FSK_RB2_4FD36입니다.
RHDriver.setTxPower(23, false);
RHDriver.setFrequency(RF95_FREQ);
RHDriver.setCADTimeout(500);
이 프로젝트는 Rhmesh에서 실행되지만 사용자가 완전히 역동적이고 유동적 인 토폴로지를 가질 것으로 예상되지만 경로/토폴로지를 강요 할 수 있습니다. 약간의 하드 코딩이 필요하며 Rhrouter.cpp (223-263 행)에서 코드를 검사 할 수 있습니다. 이미 특정 방식으로 라우팅하는 일부 미세한 토폴로지 예제 (경로를 준수하지 않는 메시지를 삭제/처리하지 않음)가 있으며,이 강제 토폴로지를 활성화하려면 #include "rhmesh.h"를 호출하기 전에 매크로 RH_TEST_NETWORK 정의해야합니다. 당신은 물론 원하는 토폴로지와 유사한 자신의 코드를 추가 할 수 있습니다.
...
#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가 대상 노드에서 나온 것이 아니라 메시지를 성공적으로받은 모든 노드 (대상 노드 제외한 중개 노드)입니다. 현재 RHMesh는 메시지가 '최종'할당 된 대상 노드에 성공적으로 수신되었는지 여부를 알려주지 않습니다. 이 주위의 방법은 '최종'대상 노드에 높은 레벨/응용 프로그램 레이어 로직을 REPLY_TYPE 하는 것입니다. 인공 ACK (현재이 기능은 현재이 레포에서 구현되지 않음).
메시지를 성공적으로 전송 한 후 RECEIVING_MODE 로 전환하고 다른 노드에서 오는 메시지를 기다립니다. recvfromAckTimeout 활성화되는 동안 메시지가 도착하거나 타임 아웃에 도달 할 때까지 활동이 유지됩니다.
if (RHMeshManager.recvfromAckTimeout(_msgRcvBuf, (uint8_t *) sizeof(_msgRcvBuf), 3000, &_msgFrom)) {
localVariable_
_tempVariable
globalVariable