ESP8266 Mesh Network Root Node

11

Ich arbeite an einem Mesh-Netzwerk, das auf ESP8266 basiert, und alles scheint gut zu funktionieren, wenn Beispielcode von EasyMesh von Coopdis verwendet wird . In seinem Beispiel registrieren sich 3 ESP8266 im Netz und dienen als einfache Weboberfläche. Das funktioniert auch bei mir perfekt.

In meiner Lösung muss jedoch einer dieser Knoten mit dem Internet verbunden sein, damit das gesamte Netz darauf zugreifen kann (oder zumindest auf das Netz zugegriffen werden kann). Dies wird auch in der ESP8266 Mesh User Guid- Dokumentation (Seite 4) von Espressif erwähnt . Ich habe auch ein paar andere Dokumente gefunden, die alle darüber sprechen, da es nur normal ist, aber ohne Beispielcode, den ich leicht verstehen könnte.

Wie konfiguriere ich das Netz so, dass es auch eine Verbindung zu einem Router herstellt? Ist es so einfach, dieselbe SSID und denselben Pass-Schlüssel für das Mesh-Netzwerk zu verwenden, die ich auf meinem Wi-Fi-Router verwende, oder muss ich so etwas wie einen Raspberry Pi-Teil des Wi-Fi-Meshs machen, der dann verbunden werden kann? zu meinem Router über die Ethernet-Verbindung? Ich denke nicht, dass Letzteres für die Forschung, die ich durchgeführt habe, erforderlich sein sollte.

Ich brauche dafür den Hallo-Welt-Beispielcode. AT-Befehle werden mir nicht helfen, denke ich.

Ingenieur
quelle
1
Haben Sie in Bezug auf das Beispiel mit 3 Knoten auch ein Webinterface eingerichtet, wie das auf dem Telefon in diesem Video ?
Bence Kaulics
1
@BenceKaulics Ich habe es nicht speziell getestet, seit ich das schon einmal gemacht habe und das ist kein Problem für mich. Warum fragst du? Ich dachte, dass dies eine Fallback-Option sein könnte, bei der ein "Server" einfach über REST-Aufrufe, die auf dem Mesh gehostet werden, auf das Mesh-Netzwerk zugreifen könnte, aber ich bin fasziniert von der Option ROOT NODE, die nach der richtigen Architektur (IMHO) klingt.
Gineer
1
Aha. Ich dachte das gleiche, dass es eine alternative Option sein kann, auf Ihr Netzwerk zuzugreifen. Nicht als Lösung vorschlagen, also nur ein Kommentar, was es war. Ich wusste nicht, dass Sie bereits darüber nachgedacht haben. ;)
Bence Kaulics

Antworten:

6

Eine weitere Option für ein einfaches Mesh ist die Verwendung von painlessMesh von BlackEdder und die Einführung einer Brücke zum Pendeln der Daten in die Außenwelt.

Es gibt ein Problem beim Herstellen einer Verbindung zu einem anderen Netzwerk über ein Netz in painlessMesh gitlab, das vier verschiedene Lösungen erklärt. Lösungen funktionieren möglicherweise auch in easyMesh, da das Problem ursprünglich dort angesprochen wurde, aber sicher in painlessMesh.

Ich habe sie mir angesehen und die am besten funktionierenden Lösungen benötigten beide zusätzlichen Geräte im Netz, um die eigentliche Verbindung zum äußeren Netzwerk herzustellen.

Der erste würde den vierten esp8266 für Ihr Projekt einführen. Es würde mit dem Internet verbunden sein und über eine serielle Verbindung mit einem Ihrer Knoten kommunizieren.

Ein anderer wäre die Verwendung eines Raspberry PI-Geräts, um die Daten zu sammeln und eine Verbindung mit einer anderen WLAN-Karte zu einem anderen Netzwerk herzustellen.

Die anderen beiden waren nicht gut, einer wurde vom Autor entmutigt und der andere mit esp8266 so kompliziert und eingeschränkt, dass ich es nicht versuchen würde.

Der ganze Führer in Gitlab .

mico
quelle
5

Ich würde die bestehende Implementierung von EasyMesh ein wenig modifizieren, da es derzeit keine Knotenrollen zu implementieren scheint. Jeder Knoten ist gleich und sie können nur Verbindungen untereinander aufbauen. Wie ich sehe, gibt es keine Möglichkeit, einen Server zu ihren Routing-Tabellen hinzuzufügen oder einen bestimmten Verbindungsdatensatz in den Tabellen zu markieren, der mit einem Server verbunden ist.

Die Knoten verwenden eine Verbindungsliste für das Weiterleiten / Weiterleiten von Nachrichten. Was Sie brauchen, ist ein Knoten, der einen Verbindungsdatensatz für den Server hat. Dies ist der Stammknoten.

Wenn ein Knoten derzeit mit Strom versorgt wird, scannt er die verfügbaren APs (Access Points), filtert diejenigen heraus, die nicht mit dem Netzpräfix beginnen, und stellt dann eine Verbindung zum AP mit dem besten RSSI her. Auch jeder Knoten schafft ihre eigene AP mit einem Namen Mesh - Präfix + eindeutige Knoten - Chip - ID .

Wenn kein anderer Knoten verfügbar ist, wartet er einfach darauf, dass andere eine Verbindung herstellen. Und dies ist der erste Punkt, an dem Änderungen angewendet werden sollten. Sie könnten einen eindeutigen AP mit einem Namen wie Mesh-Präfix + "Server" fest codieren oder irgendwie konfigurierbar machen. Wenn kein anderer EasyMesh-AP verfügbar ist, sollte der Knoten eine Verbindung zu diesem AP herstellen und ein vordefiniertes meshConnectionTypeObjekt in seiner Verbindungsliste speichern .

Die Datei dieses Objekts wird nicht durch Nachrichtenaustausch zwischen dem Server und dem Knoten bestimmt, sondern kann mit Ausnahme des espconnFeldes feste Werte sein . Das sollte wie in den anderen Fällen erworben werden. In der folgenden Struktur benötigen Sie nur die Variable first to member.

struct meshConnectionType {
    espconn             *esp_conn;
    uint32_t            chipId = 0;
    String              subConnections;
    timeSync            time;
    uint32_t            lastRecieved = 0;
    bool                newConnection = true;

    (...)
};

Das chipIdwird die Adresse des Servers in dem Mesh - Netzwerk sein. Sie sollten einen Wert auswählen, der keine ESP8266-Chip-ID sein kann.

Der erste Knoten, der in Ihrem Netzwerk eingeschaltet wird, ist also der "Root" -Knoten. Wenn andere Knoten Nachrichten an den Server senden möchten, wird die Nachricht basierend auf den Datensätzen für direkte Verbindungen (im Code als Unterverbindungen bezeichnet) an den "Root" -Knoten gesendet.

Der "Root" -Knoten stellt dann fest, dass er eine direkte Verbindung zum Server (zum Router / Internet) hat und als Nachricht an den Server, dass er diese Nachricht auf andere Weise weiterleiten soll (nicht auf netzartige Weise). . Offensichtlich werden hier zusätzliche Informationen benötigt, wie zum Beispiel die IP-Adresse des Servers und der verwendete Port. Diese sollten auch standardmäßig oder nach einer Konfigurationsmethode auf dem Knoten (auf jedem Knoten) gespeichert werden.

Zuletzt sendet der "Root" -Knoten eine IP-Nachricht an den Server. Diese sollte von Ihnen erneut implementiert werden.


TL; DR; Fazit:

  • Es sollte einen Server-AP geben und der erste Knoten (nur der erste Knoten, der eingeschaltet wird) sollte eine Verbindung dazu herstellen. Dies ist der Stammknoten.
  • Der Server sollte eine Adresse ( destId) haben, die im Mesh-Netzwerk beim Senden von Nachrichten an den Server verwendet wird. Diese Informationen sollten standardmäßig allen Knoten zur Verfügung stehen.
  • Der Stammknoten sollte wissen, dass er "direkt" mit dem Server / Internet verbunden ist. Dies kann erreicht werden, indem der Verbindungsliste des Stammknotens ein Verbindungsdatensatz mit dem Server hinzugefügt wird destId.
  • Der Stammknoten, der weiß, dass er mit dem Server verbunden ist, kann die Nachrichten entsprechend über das Internet weiterleiten.

Dies ist nur eine theoretische Idee, die mir durch das Lesen der Implementierung von EasyMesh einfällt. Ich habe möglicherweise eine wichtige Tatsache übersehen, die es schwierig oder unmöglich machen würde, dies umzusetzen. Es ist möglicherweise auch nicht der effizienteste Weg, um das Problem zu lösen. Ich bin kein Mesh-Netzwerkexperte.

Wenn ein Stammknoten im Netzwerk vorhanden ist, wird gefragt, was passiert, wenn die Verbindung zum Stamm getrennt wird. Wie wird ein neuer Stamm ausgewählt?

Bence Kaulics
quelle