Nœud racine de réseau maillé ESP8266

11

Je travaille sur un réseau maillé basé sur ESP8266 et tout semble bien fonctionner en utilisant un exemple de code d' EasyMesh par Coopdis . Dans son exemple, 3 ESP8266 s'inscrivent dans le maillage et servent une interface Web simple. Cela fonctionne parfaitement pour moi aussi.

Cependant, dans ma solution, j'ai besoin que l'un de ces nœuds soit connecté à Internet pour que tout le maillage puisse y accéder (ou au moins le maillage soit accessible). Ceci est également mentionné dans la documentation ESP8266 Mesh User Guid (page 4) d' Espressif . J'ai également trouvé quelques autres documents qu'ils publient tous en parlant de cela car c'est juste normal mais sans aucun exemple de code que je pourrais facilement comprendre.

Comment configurer le maillage pour qu'il se connecte également à un routeur. Est-ce aussi simple que d'utiliser le même SSID et la même clé de passe pour le réseau maillé que j'utilise sur mon routeur Wi-Fi ou dois-je faire quelque chose comme une partie Raspberry Pi du maillage Wi-Fi qui peut ensuite être connecté à mon routeur via la connexion Ethernet? Je ne pense pas que ce dernier devrait être exigé des recherches que j'ai faites.

J'ai besoin de l'exemple de code hello world pour cela. Les commandes AT ne vont pas m'aider, je pense.

Gineer
la source
1
En ce qui concerne l'exemple des 3 nœuds, avez-vous également une interface Web en place, comme celle sur le téléphone dans cette vidéo ?
Bence Kaulics
1
@BenceKaulics Je ne l'ai pas testé spécifiquement depuis que je l'ai déjà fait et ce n'est pas un problème pour moi. Pourquoi demandez-vous? Je pensais que cela pourrait être une option de secours où un "serveur" pourrait simplement accéder au réseau Mesh via des appels REST hébergés sur le maillage, mais je suis intrigué par l'option ROOT NODE, qui ressemble à l'architecture correcte (à mon humble avis).
Gineer
1
Je vois. Je pensais la même chose que cela peut être une option alternative pour accéder à votre réseau. Ne pas suggérer cependant une solution, donc juste un commentaire de ce que c'était. Je ne savais pas que vous y aviez déjà pensé. ;)
Bence Kaulics

Réponses:

6

Une autre option pour un maillage facile consiste à utiliser painlessMesh par BlackEdder et à y introduire un pont pour faire la navette entre les données et le monde extérieur.

Il y a un problème de connexion à un autre réseau à partir d'un maillage dans painlessMesh gitlab qui explique quatre solutions différentes. Les solutions fonctionnent peut-être aussi dans easyMesh, car le problème a été soulevé au départ, mais à coup sûr dans painlessMesh.

Je les ai regardés et les solutions les plus efficaces nécessitaient à la fois des périphériques supplémentaires au maillage pour gérer la connexion réelle au réseau externe.

Le premier introduirait le quatrième esp8266 pour votre projet. Il serait connecté à Internet et communiquerait avec l'un de vos nœuds via une connexion série.

Un autre serait d'utiliser un appareil Raspberry PI pour collecter les données et se connecter avec une autre carte wifi à un autre réseau.

Les deux autres n'étaient pas bons, l'un était découragé par l'auteur et l'autre si compliqué et limité avec esp8266 que je n'aurais pas pu l'essayer.

Tout le guide dans gitlab .

mico
la source
5

Je modifierais un peu l'implémentation existante d'EasyMesh, car actuellement il ne semble pas implémenter les rôles de nœuds. Chaque nœud est égal et ils ne peuvent établir des connexions qu'entre eux. Comme je le vois, il n'y a aucun moyen d'ajouter un serveur à leurs tables de routage ni de marquer un enregistrement de connexion spécifique dans les tables connectées à un serveur.

Les nœuds utilisent une liste de connexions pour le routage / transfert de messages. Ce dont vous avez besoin, c'est d'un nœud qui a un enregistrement de connexion pour le serveur, c'est ce que le nœud racine est.

Maintenant, actuellement, lorsqu'un nœud est alimenté, il analyse les points d'accès disponibles (points d'accès), filtre ceux qui ne commencent pas par le préfixe de maillage , puis se connecte à l'AP avec le meilleur RSSI. De plus, chaque nœud crée son propre point d'accès avec un préfixe de maillage de nom + un ID de puce unique de nœud .

Si aucun autre nœud n'est disponible, il attendra simplement que d'autres se connectent. Et c'est le premier point où les changements doivent être appliqués. Vous pouvez coder en dur ou rendre en quelque sorte configurable un AP unique avec un nom comme préfixe de maillage + "Serveur" et si aucun autre AP EasyMesh n'est disponible, le nœud doit se connecter à cet AP et doit stocker un meshConnectionTypeobjet prédéfini dans sa liste de connexions.

Le dossier de cet objet ne sera pas déterminé par l'échange de messages entre le serveur et le nœud mais peut être des valeurs fixes, à l'exception du espconnchamp. Celui-là doit être acquis comme dans les autres cas. Dans la structure suivante, vous n'aurez besoin que de la première variable membre.

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

    (...)
};

Le chipIdsera l'adresse du serveur dans le réseau maillé. Vous devez choisir une valeur qui ne peut pas être un identifiant de puce ESP8266.

Donc, fondamentalement, le premier nœud à démarrer dans votre réseau sera le nœud "racine". Si d'autres nœuds veulent envoyer des messages au serveur, le message sera envoyé au nœud "racine" sur la base des enregistrements de connexion in-directe (appelés sous-connexions dans le code).

Le nœud "racine" découvrira alors qu'il a une connexion directe avec le serveur (au routeur / Internet) et comme c'est un message au serveur qu'il doit transmettre ce message d'une autre manière (pas comme un maillage) . De toute évidence, des informations supplémentaires sont nécessaires ici, comme l'adresse IP du serveur et le port utilisé par exemple. Ceux-ci doivent également être stockés sur le nœud (sur chaque nœud) par défaut ou par une méthode de configuration.

Donc, enfin, le nœud "racine" enverra un message IP au serveur, vous devez à nouveau l'implémenter.


TL; DR; Conclusion:

  • Il doit y avoir un serveur AP et le premier nœud (seul le premier nœud à alimenter) doit s'y connecter, ce sera le nœud racine.
  • Le serveur doit avoir une adresse ( destId) qui sera utilisée dans le réseau maillé lors de l'envoi de messages au serveur. Ces informations doivent être disponibles par défaut pour tous les nœuds.
  • Le nœud racine doit savoir qu'il est connecté "directement" au serveur / à Internet. Ceci peut être réalisé en ajoutant un enregistrement de connexion avec le serveur destIdà la liste de connexion du nœud racine.
  • Le nœud racine sachant qu'il est connecté au serveur peut transmettre les messages de manière appropriée via Internet.

Ce n'est qu'une idée théorique que je trouve en lisant la mise en œuvre d'EasyMesh. J'ai peut-être manqué un fait important qui rendrait cela difficile ou impossible à mettre en œuvre. De plus, ce n'est peut-être pas le moyen le plus efficace de résoudre le problème. Je ne suis pas un expert en réseaux maillés.

Avoir un nœud racine dans le réseau demande "Que se passe-t-il si la racine est déconnectée? Comment une nouvelle racine sera choisie?".

Bence Kaulics
la source