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 meshConnectionType
objet 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 espconn
champ. 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 chipId
sera 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?".