Я бы немного изменил существующую реализацию EasyMesh, так как в настоящее время кажется, что она не реализует роли узлов. Каждый узел равен, и они могут строить соединения только друг с другом. Как я вижу, нет способа добавить сервер в свои таблицы маршрутизации или пометить конкретную запись соединения в таблицах, которые имеют подключение к серверу.
Узлы используют список соединений для маршрутизации / пересылки сообщений. Вам нужен узел, у которого есть запись о соединении с сервером, это корневой узел.
Теперь, когда узел включен, он сканирует доступные точки доступа (точки доступа), отфильтровывает те, которые не начинаются с префикса сетки, и затем подключается к точке доступа с лучшим RSSI. Также каждый узел создает свою собственную точку доступа с префиксом имени сетки + уникальный идентификатор чипа узла .
Если другой узел недоступен, он просто будет ждать подключения других. И это первая точка, в которой следует применить изменения. Вы можете жестко закодировать или сделать каким-либо образом настраиваемую уникальную точку доступа с именем, таким как префикс сетки + «Сервер», и если нет другой точки доступа EasyMesh, узел должен подключиться к этой точке доступа и сохранить предварительно определенный 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; Вывод:
- Должна быть точка доступа сервера, и к ней должен подключаться первый узел (только первый включаемый узел), это будет корневой узел.
- Сервер должен иметь адрес (
destId
), который будет использоваться в ячеистой сети при отправке сообщений на сервер. Эта информация должна быть доступна для всех узлов по умолчанию.
- Корневой узел должен знать, что он подключен «напрямую» к серверу / интернету. Это может быть достигнуто путем добавления записи соединения с сервером в
destId
список соединений корневого узла.
- Корневой узел, зная, что он подключен к серверу, может соответствующим образом пересылать сообщения через Интернет.
Это просто теоретическая идея, с которой я столкнулся, прочитав реализацию EasyMesh. Возможно, я упустил какой-то важный факт, который сделал бы это трудным или невозможным для реализации. Также это может быть не самый эффективный способ решения проблемы. Я не эксперт по ячеистой сети.
Наличие корневого узла в сети спрашивает: «Что произойдет, если корень отключится? Как будет выбран новый корень?».