Modificherei un po 'l'implementazione esistente di EasyMesh, poiché al momento non sembra implementare ruoli di nodo. Ogni nodo è uguale e possono costruire connessioni solo tra loro. Come vedo, non c'è modo di aggiungere un server alle loro tabelle di routing né di contrassegnare un record di connessione specifico nelle tabelle con connettività a un server.
I nodi utilizzano un elenco di connessioni per l'instradamento / inoltro dei messaggi. Ciò di cui hai bisogno è un nodo che ha un record di connessione per il server, questo è il nodo principale.
Ora, attualmente quando viene alimentato un nodo, scansionerà gli AP disponibili (Access Point), filtrerà quelli che non iniziano con il prefisso mesh e quindi si connetterà all'AP con il miglior RSSI. Inoltre ogni nodo crea il proprio AP con un prefisso mesh nome + ID chip univoco nodo .
Se nessun altro nodo è disponibile, semplicemente aspetterà che gli altri si connettano. E questo è il primo punto in cui dovrebbero essere applicate le modifiche. È possibile codificare o rendere in qualche modo configurabile un AP univoco con un nome come prefisso mesh + "Server" e se nessun altro AP EasyMesh è disponibile, il nodo dovrebbe connettersi a questo AP e memorizzare un meshConnectionType
oggetto predefinito nel suo elenco di connessioni.
L'oggetto archiviato non sarà determinato dallo scambio di messaggi tra il server e il nodo ma può essere un valore fisso, ad eccezione del espconn
campo. Quello dovrebbe essere acquisito come negli altri casi. Nella seguente struttura avrai solo bisogno della prima variabile membro.
struct meshConnectionType {
espconn *esp_conn;
uint32_t chipId = 0;
String subConnections;
timeSync time;
uint32_t lastRecieved = 0;
bool newConnection = true;
(...)
};
Il chipId
sarà l'indirizzo del server nella rete mesh. È necessario scegliere un valore che non può essere un ID chip ESP8266.
Quindi in pratica il primo nodo ad accendersi nella tua rete sarà il nodo "root". Se altri nodi desiderano inviare messaggi al server, il messaggio verrà inviato al nodo "root" in base ai record di connessione diretta (chiamati sub-connessioni nel codice).
Il nodo "root" scoprirà quindi che ha una connessione diretta al server (al router / internet) e poiché è un messaggio al server che dovrebbe inoltrare questo messaggio in un altro modo (non in un modo simile a una mesh) . Ovviamente qui sono necessarie ulteriori informazioni come l'indirizzo IP del server e la porta utilizzata, ad esempio. Anche questi dovrebbero essere memorizzati nel nodo (su ogni nodo) per impostazione predefinita o con un metodo di configurazione.
Quindi, infine, il nodo "root" invierà un messaggio IP al server, questo dovrebbe essere implementato di nuovo da te.
TL; DR; Conclusione:
- Dovrebbe esserci un AP server e il primo nodo (solo il primo nodo da accendere) dovrebbe connettersi ad esso, questo sarà il nodo principale.
- Il server dovrebbe avere un indirizzo (
destId
) che verrà utilizzato nella rete mesh quando si inviano messaggi al server. Queste informazioni dovrebbero essere disponibili per tutti i nodi per impostazione predefinita.
- Il nodo principale dovrebbe sapere che è collegato "direttamente" al server / Internet. Ciò può essere ottenuto aggiungendo un record di connessione con il server
destId
all'elenco delle connessioni del nodo radice.
- Il nodo principale, sapendo che è connesso al server, può inoltrare i messaggi in modo appropriato via Internet.
Questa è solo un'idea teorica che mi viene in mente leggendo l'implementazione di EasyMesh. Potrei aver perso alcuni fatti importanti che renderebbero questo compito difficile o impossibile da attuare. Inoltre, potrebbe non essere il modo più efficiente per risolvere il problema. Non sono un esperto di reti mesh.
Avere un nodo radice nella rete chiede "Cosa succede se la radice viene disconnessa? Come verrà scelta una nuova radice?".