Я би трохи змінив існуючу реалізацію EasyMesh, оскільки, схоже, зараз вона не реалізує ролі вузлів. Кожен вузол рівний, і вони можуть будувати зв’язки лише один з одним. Як я бачу, немає способу додати сервер до їх таблиць маршрутизації, а також не позначити конкретний запис з'єднання в таблицях, які мають підключення до сервера.
Вузли використовують список з'єднань для маршрутизації / переадресації повідомлень. Вам потрібен вузол, який записує з'єднання для сервера, ось що є кореневим вузлом.
Тепер, коли вузол працює від мережі, він скануватиме доступні точки доступу (точки доступу), відфільтровує ті, які не починаються з сіткового префікса, а потім підключається до AP з найкращим RSSI. Також кожен вузол створює власний AP з префіксом mesh mes + унікальний ідентифікатор чіпа .
Якщо іншого вузла немає, він просто чекатиме підключення інших. І це перший пункт, коли слід застосувати зміни. Ви можете твердо кодувати або зробити яким-небудь чином настроюваний унікальний AP з таким ім'ям, як mesh prefix + "Server", і якщо немає жодної іншої програми EasyMesh AP, вузол повинен підключитися до цього AP і повинен зберігати заздалегідь визначений meshConnectionType
об'єкт у своєму списку з'єднань.
Поданий об'єкт не визначатиметься обміном повідомленнями між сервером та вузлом, але може бути фіксованим значенням, за винятком espconn
поля. Таку треба придбати, як і в інших випадках. У наступній структурі вам знадобиться лише змінна з першим членом.
struct meshConnectionType {
espconn *esp_conn;
uint32_t chipId = 0;
String subConnections;
timeSync time;
uint32_t lastRecieved = 0;
bool newConnection = true;
(...)
};
chipId
Буде адресу сервера в комірчастої мережі. Ви повинні вибрати одне значення, яке не може бути ідентифікатором чіпа ESP8266.
Отже, в основному першим вузлом, що працює у вашій мережі, буде «кореневий» вузол. Якщо інші вузли хочуть надсилати повідомлення на сервер, то повідомлення буде надіслано до "кореневого" вузла на основі записів прямого з'єднання (званих підз'єднаннями в коді).
Тоді "кореневий" вузол виявить, що він має пряме з'єднання з сервером (до маршрутизатора / Інтернету), і оскільки це повідомлення для сервера, що він повинен пересилати це повідомлення іншим способом (не таким, як сітка) . Очевидно, тут потрібна додаткова інформація, наприклад IP-адреса сервера та, наприклад, використовуваний порт. Вони також повинні зберігати вузол (на кожному вузлі) за замовчуванням або деяким способом конфігурації.
Отже, нарешті, "кореневий" вузол надішле IP-повідомлення на сервер, це вам слід знову реалізувати.
TL; DR; Висновок:
- Має бути AP-сервер, і перший вузол (тільки перший вузол, що підключається) повинен підключитися до нього, це буде кореневий вузол.
- Сервер повинен мати адресу (
destId
), яка буде використовуватися в мережевій мережі при надсиланні повідомлень на сервер. Ця інформація повинна бути доступною для всіх вузлів за замовчуванням.
- Кореневий вузол повинен знати, що він підключений «безпосередньо» до сервера / Інтернету. Цього можна досягти, додавши запис з'єднання із сервером
destId
до списку з'єднань кореневого вузла.
- Кореневий вузол, знаючи, що він підключений до сервера, може належним чином пересилати повідомлення через Інтернет.
Це просто теоретична ідея, яку я придумав, читаючи впровадження EasyMesh. Можливо, я пропустив якийсь важливий факт, який би зробив це важким або неможливим для реалізації. Також це може бути не найефективнішим способом вирішення проблеми. Я не експерт із мережевих мереж.
Наявність кореневого вузла в мережі запитує "Що станеться, якщо корінь буде відключена? Як буде обраний новий корінь?".