ESP8266メッシュネットワークルートノード


11

ESP8266に基づくメッシュネットワークで作業していますが、CoopdisによるEasyMeshのサンプルコードを使用すると、すべてが正常に機能しているようです。彼/彼女の例では、3つのESP8266がメッシュに登録し、単純なWebインターフェースを提供します。これは私にとっても完全に機能しています。

ただし、私のソリューションでは、メッシュ全体がノードにアクセスできるように(または少なくともメッシュにアクセスできるように)、これらのノードの1つをインターネットに接続する必要があります。これは、に記載されているESP8266メッシュユーザーのGuidからの文書(ページ4)Espressif。彼らが発行している他のいくつかのドキュメントも見つかりました。これは通常のことですが、すぐに理解できるコード例がないためです。

ルーターも接続するようにメッシュを構成するにはどうすればよいですか。私のWi-Fiルーターで使用しているのと同じSSIDとPassキーをメッシュネットワークに使用するのと同じくらい簡単ですか、それとも接続できるWi-FiメッシュのRaspberry Piのようなものを作成する必要がありますか?イーサネット接続を介して私のルーターに?私が行った研究から、後者は必要とされるべきではないと私は思います。

これにはhello worldサンプルコードが必要です。ATコマンドは役に立たないと思います。


1
3つのノードの例について、このビデオの電話のように、Webインターフェースも稼働していますか?
Bence Kaulics

1
@BenceKaulics以前にテストしたことがあるので、特にテストしていません。これは私にとっては問題ではありません。なぜ聞くのですか?これは、「サーバー」がメッシュでホストされているREST呼び出しを介してメッシュネットワークに単純にアクセスできるフォールバックオプションになると考えていましたが、正しいアーキテクチャ(IMHO)のように聞こえるルートノードオプションに興味をそそられます。
Gineer 2017

1
そうですか。私は、ネットワークにアクセスするための代替オプションになり得ると同じことを考えていました。しかし、解決策として提案していないので、それが何であったかについての単なるコメント。あなたがすでにそれについて考えていることを知りませんでした。;)
Bence Kaulics 2017

回答:


6

簡単なメッシュのもう1つのオプションは、BlackEdderのpainlessMeshを使用して、データを外界に送るためのブリッジを導入することです。

painlessMesh gitlabのメッシュから他のネットワークへの接続に関する問題があり、4つの異なるソリューションを説明しています。ソリューションはeasyMeshでも機能する可能性があります。問題は最初にそこで発生したためですが、確かにpainlessMeshでは問題が発生しました。

私はそれらを見て、ほとんどの実用的なソリューションでは、外部ネットワークへの実際の接続を処理するために、メッシュに追加の両方のデバイスが必要でした。

最初のプロジェクトでは、4つ目のesp8266をプロジェクトに導入します。それはインターネットに接続され、シリアル接続を介してノードの1つと通信します。

もう1つは、Raspberry PIデバイスを使用してデータを収集し、別のwifiカードで他のネットワークに接続することです。

他の2つは良くありませんでした、1つは著者によって落胆しました、そして、他は非常に複雑で、esp8266で制限されていたので、試してみませんでした。

gitlabのガイド全体。


5

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の実装を読み通して思いついた理論的なアイデアにすぎません。これを実装するのが困難または不可能になるいくつかの重要な事実を見逃したかもしれません。また、問題を解決するための最も効率的な方法ではない場合もあります。私はメッシュネットワークの専門家ではありません。

ネットワークにルートノードがあると、「ルートが切断されるとどうなりますか?新しいルートはどのように選択されますか?」と質問されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.