このリポジトリは、私の論文のためにLora Rhmesh開発のためのすべてのプロジェクトを含める場所です。
projectsフォルダー内のすべてのプロジェクトを提供しています。インターネット全体に散らばっている多くの異なるプロジェクトから収集されたすべての開発は、それらを単純化して、実用的で理解できるプロジェクトに手入れをしようとしています。私は主にRFM95ロラチップに接続されたESP32ボードで開発しています。 915 MHzに送信されます。 2つの環境、Arduino IDE、プラットフォームIO VSCODEプラグインで開発します。
自由に使用してください。そうすれば私に連絡してください!
この例のスケッチは、RHMESHクラスを使用して、単純なアドレス指定された信頼できるメッセージングクライアントを作成する方法を示しています。他の例rf95_mesh_serverで動作するように設計されています
#define SELF_ADDRESS NODE3_ADDRESS
#define TARGET_ADDRESS FINAL_ADDRESS
RH_TEST_NETWORKを設定することにより、他のネットワークトポロジーをシミュレートできます。詳細については、強制トポロジーセクションをご覧ください [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のFreqと一致する必要があります!
#define RF95_FREQ 915.0
メッシュを使用することにより、RHまたはRHRouterだけよりもはるかに大きなメモリ要件があり、最大メッセージの長さ(文字)を制限して、奇妙なクラッシュを防ぐ必要があります。これを変更することで、メッセージの長さを変更して実験することができますが
#define RH_MESH_MAX_MESSAGE_LEN 50
rhSetup()を編集することにより、RFM95モジュールに特定のLORAモードを追加できます。 init(明示的な.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行)でコードを検査できます。特定の方法を強制する事前のトポロジの例がすでにあります(パスを順守しないメッセージをドロップ/処理しないことでこれを行います)。マクロ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を使用する主なポイントであり、このノードのルーティングテーブルを自動的に生成します(詳細調査のために、 RHMesh.hの関数bool doArp(uint8_t address);をチェックしてください)。
if (RHMeshManager.sendtoWait(reinterpret_cast<uint8_t *>(&msgSend[0]), msgSend.size(), targetAddress_) == RH_ROUTER_ERROR_NONE) {
そのラインの後、 trueのリターンは、次のノードにメッセージを確実に配信し、次のノードが「ACK」を送信しました。特定の時間の後にACKがない場合、Sendtowaitはfalseを返します。重要な注意点は、ACKはターゲットノードからではなく、メッセージを正常に受信したAnyNode(ターゲットノード以外は中間ノードです)です。現在、RHMESHは、「ファイナル」割り当てられたターゲットノードにメッセージが正常に受信されたかどうかはわかりません。これを回避する方法は、「Simply」高レベル/アプリケーションレイヤーロジックを「Final」ターゲットノードに追加し、メッセージを受信した後、「初期」送信者ノードに多少REPLY_TYPEメッセージを送信することです。
メッセージを正常に送信した後、 RECEIVING_MODEに変わり、別のノードからのメッセージを待ちます。 recvfromAckTimeoutがアクティブである間、メッセージが届くか、タイムアウトに達するまでアクティビティを保持します。
if (RHMeshManager.recvfromAckTimeout(_msgRcvBuf, (uint8_t *) sizeof(_msgRcvBuf), 3000, &_msgFrom)) {
localVariable_
_tempVariable
globalVariable