Nodo raíz de red de malla ESP8266

11

Estoy trabajando en una red de malla basada en ESP8266 y todo parece estar funcionando bien usando el código de muestra de EasyMesh by Coopdis . En su ejemplo, 3 ESP8266 se inscriben en la malla y sirven una interfaz web simple. Esto también funciona perfectamente para mí.

Sin embargo, en mi solución, necesito que uno de estos nodos esté conectado a Internet para que toda la malla pueda acceder a él (o al menos se puede acceder a la malla). Esto también se menciona en la documentación de ESP8266 Mesh User Guid Documentation (página 4) de Espressif . También he encontrado un par de otros documentos que publican, todos hablando de esto, ya que es normal pero sin ningún código de ejemplo que pueda entender fácilmente.

¿Cómo configuro la malla para conectarse también a un enrutador? ¿Es tan simple como usar el mismo SSID y clave de acceso para la red de malla que estoy usando en mi enrutador Wi-Fi o necesito hacer que algo como Raspberry Pi forme parte de la red Wi-Fi que luego se puede conectar? a mi enrutador a través de la conexión Ethernet? Sin embargo, no creo que esto último deba ser requerido por la investigación que he hecho.

Necesito el código de muestra hello world para esto. Los comandos AT no me van a ayudar, creo.

Gineer
fuente
1
Con respecto al ejemplo de los 3 nodos, ¿tiene también una interfaz web en funcionamiento, como la del teléfono en este video ?
Bence Kaulics
1
@BenceKaulics No lo he probado específicamente desde que hice esto antes y esto no es un problema para mí. ¿Por qué preguntas? Estaba pensando que esta podría ser una opción alternativa donde un "Servidor" podría simplemente acceder a la red Mesh a través de llamadas REST alojadas en la malla, pero estoy intrigado por la opción ROOD NODE, que suena como la arquitectura correcta (en mi humilde opinión).
Gineer
1
Veo. Estaba pensando lo mismo que puede ser una opción alternativa para acceder a su red. Sin embargo, no sugiero como solución, por lo tanto, solo un comentario de lo que era. No sabía que ya lo habías pensado. ;)
Bence Kaulics

Respuestas:

6

Otra opción para la malla fácil es usar el software PainlessMesh by BlackEdder e introducir allí un puente para conmutar los datos al mundo exterior.

Hay un problema al conectarse a otra red desde una malla en indolitible gitlab que explica cuatro soluciones diferentes. Las soluciones tal vez funcionen también en easyMesh, porque el problema se planteó inicialmente allí, pero con seguridad en painlessMesh.

Los miré y la mayoría de las soluciones de trabajo necesitaban dispositivos adicionales a la malla para manejar la conexión real a la red externa.

El primero introduciría el cuarto esp8266 para su proyecto. Se conectaría a Internet y se comunicaría con uno de sus nodos a través de una conexión en serie.

Otro sería usar un dispositivo Raspberry PI para recopilar los datos y conectarse con otra tarjeta wifi a otra red.

Los otros dos no eran buenos, uno estaba desanimado por el autor y otro tan complicado y limitado con esp8266 que no lo intentaría.

Toda la guía en gitlab .

mico
fuente
5

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 meshConnectionTypeobjeto 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 espconncampo. 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 chipIdserá 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 destIda 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?".

Bence Kaulics
fuente