EasyMeshの既存の実装を少し変更します。現在、ノードの役割を実装していないようです。各ノードは等しく、相互にのみ接続を構築できます。私が見ているように、サーバーをルーティングテーブルに追加したり、サーバーに接続しているテーブル内の特定の接続レコードをマークしたりする方法はありません。
ノードはメッセージのルーティング/転送に接続リストを使用します。必要なのは、サーバーの接続レコードを持つノードです。これがルートノードです。
現在、ノードに電力が供給されると、ノードは利用可能なAP(アクセスポイント)をスキャンし、メッシュプレフィックスで始まらないものを除外して、最良のRSSIでAPに接続します。また、すべてのノードは、メッシュプレフィックス + ノードの一意のチップIDという名前の独自のAPを作成します。
他のノードが利用できない場合は、他のノードが接続するのを待つだけです。そして、これは変更が適用されるべき最初のポイントです。メッシュプレフィックス + "サーバー"のような名前の一意のAPをハードコーディングまたは何らかの方法で構成可能にすることができます。他のEasyMesh APが利用できない場合、ノードはこのAPに接続し、事前定義されたmeshConnectionType
オブジェクトを接続リストに保存する必要があります。
このオブジェクトのespconn
フィールドは、サーバーとノード間のメッセージ交換によって決定されませんが、フィールドを除いて固定値にすることができます。他の場合と同様に取得する必要があります。次の構造体では、最初のメンバー変数のみが必要です。
struct meshConnectionType {
espconn *esp_conn;
uint32_t chipId = 0;
String subConnections;
timeSync time;
uint32_t lastRecieved = 0;
bool newConnection = true;
(...)
};
これchipId
は、メッシュネットワーク内のサーバーのアドレスになります。ESP8266チップIDにできない値を1つ選択する必要があります。
したがって、基本的には、ネットワークで最初に起動するノードが「ルート」ノードになります。他のノードがメッセージをサーバーに送信したい場合、メッセージは間接接続(コードではサブ接続と呼ばれます)レコードに基づいて「ルート」ノードに送信されます。
次に、「ルート」ノードは、サーバー(ルーター/インターネット)に直接接続していること、およびサーバーへのメッセージであるため、このメッセージを別の方法(メッシュのような方法ではない)で転送する必要があることを検出します。 。たとえば、サーバーのIPアドレスや使用されているポートなどの追加情報が必要なのは明らかです。これらはまた、デフォルトで、または構成方法によって、ノード(すべてのノード上)に保管する必要があります。
最後に、「ルート」ノードがサーバーにIPメッセージを送信します。これは、再度実装する必要があります。
TL; DR; 結論:
- サーバーAPがあり、最初のノード(最初に電源が投入されるノードのみ)がそれに接続する必要があります。これがルートノードになります。
- サーバーには
destId
、サーバーにメッセージを送信するときにメッシュネットワークで使用されるアドレス()が必要です。この情報は、デフォルトですべてのノードで利用できるはずです。
- ルートノードは、サーバー/インターネットに「直接」接続されていることを認識している必要があります。これは、サーバーの接続レコードを
destId
ルートノードの接続リストに追加することで実現できます。
- サーバーに接続されていることを知っているルートノードは、インターネットを介してメッセージを適切に転送できます。
これは、EasyMeshの実装を読み通して思いついた理論的なアイデアにすぎません。これを実装するのが困難または不可能になるいくつかの重要な事実を見逃したかもしれません。また、問題を解決するための最も効率的な方法ではない場合もあります。私はメッシュネットワークの専門家ではありません。
ネットワークにルートノードがあると、「ルートが切断されるとどうなりますか?新しいルートはどのように選択されますか?」と質問されます。