Modificaría un poco la implementación existente de EasyMesh, ya que actualmente no parece implementar roles de nodo. Cada nodo es igual y pueden construir conexiones solo entre sí. Como veo, no hay forma de agregar un servidor a sus tablas de enrutamiento ni de marcar un registro de conexión específico en las tablas que tiene conectividad a un servidor.
Los nodos usan una lista de conexión para el enrutamiento / reenvío de mensajes. Lo que necesita es un nodo que tenga un registro de conexión para el servidor, esto es lo que es el nodo raíz.
Ahora, cuando se alimenta un nodo, escaneará los AP (puntos de acceso) disponibles, filtrará los que no comiencen con el prefijo de malla y luego se conectará al AP con el mejor RSSI. Además, cada nodo crea su propio AP con un prefijo de malla de nombre + ID de chip único de nodo .
Si no hay otro nodo disponible, simplemente esperará a que otros se conecten. Y este es el primer punto donde se deben aplicar los cambios. Podría codificar o hacer de alguna manera configurable un AP único con un nombre como prefijo de malla + "Servidor" y si no hay otro AP EasyMesh disponible, el nodo debe conectarse a este AP y debe almacenar un meshConnectionType
objeto predefinido en su lista de conexiones.
Este objeto archivado no se determinará mediante el intercambio de mensajes entre el servidor y el nodo, pero puede tener valores fijos, excepto el espconn
campo. Esa debe ser adquirida como en los otros casos. En la siguiente estructura solo necesitará la primera variable miembro.
struct meshConnectionType {
espconn *esp_conn;
uint32_t chipId = 0;
String subConnections;
timeSync time;
uint32_t lastRecieved = 0;
bool newConnection = true;
(...)
};
La chipId
será la dirección del servidor en la red de malla. Debe elegir un valor que no pueda ser una ID de chip ESP8266.
Básicamente, el primer nodo que se encenderá en su red será el nodo "raíz". Si otros nodos desean enviar mensajes al servidor, el mensaje se enviará al nodo "raíz" en función de los registros de conexión directa (llamadas sub-conexiones en el código).
El nodo "raíz" descubrirá que tiene una conexión directa con el servidor (al enrutador / internet) y, como es un mensaje para el servidor, debe reenviar este mensaje de otra manera (no como una malla) . Obviamente, se necesita información adicional aquí, como la dirección IP del servidor y el puerto utilizado, por ejemplo. Estos también deben almacenarse en el nodo (en cada nodo) de forma predeterminada o mediante algún método de configuración.
Así que, por último, el nodo "raíz" enviará un mensaje de IP al servidor, esto debe ser implementado por usted nuevamente.
TL; DR; Conclusión:
- Debe haber un AP de servidor y el primer nodo (solo el primer nodo que se encenderá) debe conectarse a él, este será el nodo raíz.
- El servidor debe tener una dirección (
destId
) que se utilizará en la red de malla al enviar mensajes al servidor. Esta información debería estar disponible para todos los nodos de forma predeterminada.
- El nodo raíz debe saber que está conectado "directamente" al servidor / internet. Esto se puede lograr agregando un registro de conexión con el servidor
destId
a la lista de conexiones del nodo raíz.
- El nodo raíz que sabe que está conectado al servidor puede reenviar los mensajes adecuadamente a través de Internet.
Esta es solo una idea teórica que se me ocurre leyendo la implementación de EasyMesh. Puede que me haya perdido algún hecho importante que haría que esto fuera difícil o imposible de implementar. Además, puede que no sea la forma más eficiente de resolver el problema. No soy un experto en redes de malla.
Tener un nodo raíz en la red pregunta "¿Qué pasará si la raíz se desconecta? ¿Cómo se elegirá una nueva raíz?".