ESP8266 Сетевой корневой узел

11

Я работаю над ячеистой сетью на основе ESP8266, и, кажется, все работает нормально, используя пример кода от EasyMesh от Coopdis . В своем примере 3 ESP8266 регистрируются в сетке и обслуживают простой веб-интерфейс. Это работает отлично для меня тоже.

В моем решении, однако, мне нужно, чтобы один из этих узлов был подключен к Интернету, чтобы вся сетка могла получить к нему доступ (или, по крайней мере, получить доступ к сетке). Это также упоминается в Руководстве пользователя ESP8266 Mesh (стр. 4) от Espressif . Я также нашел пару других документов, которые они публикуют, все говорят об этом, поскольку это просто нормально, но без примера кода, который я мог бы легко понять.

Как настроить сетку для подключения к роутеру. Это так же просто, как использовать тот же SSID и ключ доступа для ячеистой сети, что я использую на своем маршрутизаторе Wi-Fi, или мне нужно сделать что-то вроде Raspberry Pi как часть сетки Wi-Fi, которую затем можно подключить к моему маршрутизатору через соединение Ethernet? Я не думаю, что последнее должно требоваться из исследования, которое я сделал, хотя.

Мне нужен пример кода Hello World для этого. AT команды мне не помогут, я думаю.

Gineer
источник
1
Что касается примера с 3 узлами, у вас есть и работает веб-интерфейс, такой как тот, что показан на телефоне в этом видео ?
Бенс Кауликс
1
@BenceKaulics Я не проверял это специально, так как я делал это раньше, и это не проблема для меня. Почему ты спрашиваешь? Я думал, что это может быть запасной вариант, когда «Сервер» может просто получить доступ к сети Mesh через вызовы REST, размещенные в сетке, но я заинтригован опцией ROOT NODE, которая звучит как правильная архитектура (IMHO).
Gineer
1
Понимаю. Я думал так же, что это может быть альтернативным вариантом для доступа к вашей сети. Не предлагая в качестве решения, хотя, просто комментарий, что это было. Я не знал, что ты уже думал об этом. ;)
Бенс Кауликс

Ответы:

6

Другой вариант для легкого создания сетки - это использование painlessMesh от BlackEdder и введение там моста для передачи данных во внешний мир.

Существует проблема при подключении к другой сети из сетки в gestlab без боли, которая объясняет четыре различных решения. Решения могут работать и в easyMesh, потому что проблема была поднята изначально, но наверняка в безболезненном.

Я посмотрел на них, и большинству рабочих решений потребовалось подключить к сети дополнительные устройства, чтобы обеспечить фактическое соединение с внешней сетью.

Сначала представим четвертый esp8266 для вашего проекта. Он будет подключен к Интернету и подключен к одному из ваших узлов через последовательное соединение.

Другой будет использовать устройство Raspberry PI для сбора данных и подключения с другой картой Wi-Fi к другой сети.

Два других не были хорошими, один был обескуражен автором, а другой настолько сложным и ограниченным с esp8266, что я не буду пытаться.

Весь гид в Гитлаб .

Мико
источник
5

Я бы немного изменил существующую реализацию 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. Возможно, я упустил какой-то важный факт, который сделал бы это трудным или невозможным для реализации. Также это может быть не самый эффективный способ решения проблемы. Я не эксперт по ячеистой сети.

Наличие корневого узла в сети спрашивает: «Что произойдет, если корень отключится? Как будет выбран новый корень?».

Бенс Кауликс
источник