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 meshConnectionType
obiekt na liście połączeń.
espconn
Pole 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;
(...)
};
chipId
Bę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
destId
do 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?”.