Węzeł główny sieci ESP8266

11

Pracuję nad siecią opartą na ESP8266 i wszystko wydaje się działać dobrze, używając przykładowego kodu z EasyMesh firmy Coopdis . W jego przykładzie 3 ESP8266 zarejestrowało się w siatce i obsługuje prosty interfejs WWW. To też działa idealnie dla mnie.

Jednak w moim rozwiązaniu potrzebuję jednego z tych węzłów, aby połączyć się z Internetem, aby cała siatka mogła uzyskać do niego dostęp (lub przynajmniej dostęp do siatki). Jest to również wspomniane w dokumentacji ESP8266 Mesid User Guid (strona 4) z Espressif . Znalazłem również kilka innych dokumentów, które publikują, wszystkie mówią o tym, ponieważ jest to po prostu normalne, ale bez żadnego przykładowego kodu, który mógłbym łatwo zrozumieć.

Jak skonfigurować siatkę, aby łączyła się również z routerem. Czy to tak proste, jak użycie tego samego identyfikatora SSID i klucza dostępu do sieci kratowej, tak jak w przypadku routera Wi-Fi, czy też muszę zrobić coś takiego jak Raspberry Pi jako część sieci Wi-Fi, którą można następnie podłączyć do mojego routera przez połączenie Ethernet? Nie sądzę jednak, aby ta ostatnia była wymagana od badań, które przeprowadziłem.

Potrzebuję do tego przykładowego kodu hello world. Wydaje mi się, że polecenia AT mi nie pomogą.

Gineer
źródło
1
Jeśli chodzi o przykład z 3 węzłami, czy masz również uruchomiony interfejs internetowy, taki jak ten na telefonie w tym filmie ?
Bence Kaulics
1
@BenceKaulics Nie testowałem tego specjalnie, ponieważ robiłem to wcześniej i nie stanowi to dla mnie problemu. Dlaczego pytasz? Myślałem, że może to być opcja rezerwowa, w której „serwer” może po prostu uzyskać dostęp do sieci Mesh za pośrednictwem wywołań REST hostowanych na siatce, ale intryguje mnie opcja ROOT NODE, która brzmi jak poprawna architektura (IMHO).
Gineer
1
Widzę. Tak samo myślałem, że może to być alternatywna opcja dostępu do twojej sieci. Nie sugeruję jednak rozwiązania, więc po prostu skomentuj, co to było. Nie wiedziałem, że już o tym pomyślałeś. ;)
Bence Kaulics

Odpowiedzi:

6

Inną opcją łatwej siatki jest użycie bezbolesnej siatki BlackEdder i wprowadzenie mostu do dojazdów do świata zewnętrznego.

Występuje problem z połączeniem z inną siecią z siatki w bezbolesnym gitlabie, który wyjaśnia cztery różne rozwiązania. Rozwiązania mogą również działać w easyMesh, ponieważ problem był początkowo tam poruszany, ale na pewno w bezbolesnyMesh.

Spojrzałem na nie, a najbardziej działające rozwiązania wymagały obu dodatkowych urządzeń do siatki, aby obsłużyć faktyczne połączenie z siecią zewnętrzną.

Pierwszy wprowadziłby czwarty esp8266 dla twojego projektu. Zostałby podłączony do Internetu i komunikował się z jednym z twoich węzłów poprzez połączenie szeregowe.

Innym byłoby użycie urządzenia Raspberry PI do zbierania danych i łączenia się z inną kartą Wi-Fi do innej sieci.

Pozostałe dwa nie były dobre, jeden był zniechęcony przez autora, a drugi tak skomplikowany i ograniczony przez esp8266, że nie spróbowałbym.

Cały przewodnik w gitlab .

mico
źródło
5

Zmodyfikowałbym trochę istniejącą implementację EasyMesh, ponieważ obecnie nie wydaje się ona implementować ról węzłów. Każdy węzeł jest równy i mogą budować połączenia tylko ze sobą. Jak widzę, nie ma sposobu, aby dodać serwer do ich tabel routingu, ani zaznaczyć konkretnego rekordu połączenia w tabelach, które mają łączność z serwerem.

Węzły używają listy połączeń do kierowania / przekazywania wiadomości. Potrzebny jest węzeł, który ma rekord połączenia z serwerem, taki właśnie jest węzeł główny.

Teraz, gdy węzeł jest zasilany, skanuje dostępne punkty dostępowe (punkty dostępu), odfiltrowuje te, które nie zaczynają się od prefiksu siatki, a następnie łączy się z punktem dostępowym z najlepszym RSSI. Również każdy węzeł tworzy swój AP z nazwą prefiksu siatki + unikalnym identyfikatorem chipa węzła .

Jeśli żaden inny węzeł nie jest dostępny, będzie po prostu czekał na połączenie innych. I to jest pierwszy punkt, w którym należy zastosować zmiany. Możesz zaprogramować na stałe lub w jakiś sposób skonfigurować unikalny AP o nazwie takiej jak prefiks siatki + „Serwer”, a jeśli żaden inny AP EasyMesh nie jest dostępny, węzeł powinien połączyć się z tym AP i zapisać wcześniej zdefiniowany meshConnectionTypeobiekt na liście połączeń.

espconnPole tego obiektu nie zostanie określone na podstawie wymiany komunikatów między serwerem a węzłem, ale można ustalić stałe wartości, z wyjątkiem pola. Ten należy nabyć jak w innych przypadkach. W poniższej strukturze będziesz potrzebować tylko zmiennej pierwszy do członka.

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

    (...)
};

chipIdBędzie adres serwera w sieci kratowej. Powinieneś wybrać jedną wartość, która nie może być identyfikatorem układu ESP8266.

Tak więc w zasadzie pierwszym węzłem, który włącza się w twojej sieci, będzie węzeł „root”. Jeśli inne węzły chcą wysyłać wiadomości do serwera, wiadomość zostanie wysłana do węzła „root” na podstawie rekordów połączeń bezpośrednich (nazywanych podpodłączami w kodzie).

Węzeł „root” dowie się wtedy, że ma bezpośrednie połączenie z serwerem (z routerem / Internetem) i ponieważ jest to komunikat do serwera, że ​​powinien przekazać tę wiadomość w inny sposób (nie w sposób podobny do siatki) . Oczywiście potrzebne są tutaj dodatkowe informacje, takie jak adres IP serwera i użyty port. Powinny one również być przechowywane domyślnie lub za pomocą jakiejś metody konfiguracji w węźle (na każdym węźle).

Zatem na koniec węzeł „root” wyśle ​​wiadomość IP do serwera, którą należy ponownie wdrożyć.


TL; DR; Wniosek:

  • Powinien istnieć serwer AP, a pierwszy węzeł (tylko pierwszy węzeł, który ma zostać włączony) powinien się z nim połączyć, będzie to węzeł główny.
  • Serwer powinien mieć adres ( destId), który będzie używany w sieci kratowej podczas wysyłania wiadomości do serwera. Informacje te powinny być domyślnie dostępne dla wszystkich węzłów.
  • Węzeł główny powinien wiedzieć, że jest podłączony „bezpośrednio” do serwera / Internetu. Można to osiągnąć, dodając rekord połączenia z serwerem destIddo listy połączeń węzła głównego.
  • Węzeł główny, wiedząc, że jest podłączony do serwera, może odpowiednio przekazywać wiadomości przez Internet.

To tylko teoretyczny pomysł, który wpadłem na pomysł, czytając implementację EasyMesh. Mogłem przeoczyć jakiś ważny fakt, który uczyniłby to trudnym lub niemożliwym do wdrożenia. Może to również nie być najskuteczniejszym sposobem rozwiązania problemu. Nie jestem ekspertem od sieci kratowych.

Posiadanie węzła głównego w sieci pyta „Co się stanie, jeśli root zostanie rozłączony? Jak zostanie wybrany nowy root?”.

Bence Kaulics
źródło