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 meshConnectionType
Objekt in seiner Verbindungsliste speichern .
Die Datei dieses Objekts wird nicht durch Nachrichtenaustausch zwischen dem Server und dem Knoten bestimmt, sondern kann mit Ausnahme des espconn
Feldes 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 chipId
wird 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?