logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Zmiana ustawień LAN i zapis do EEPROM przez przeglądarkę WWW - przykład WT32-ETH01

robo1973 23 Sty 2025 20:33 459 40
Najlepsze odpowiedzi

Jak zmieniać ustawienia LAN (IP, maskę, bramę) przez stronę WWW i zapisywać je na stałe w WT32-ETH01/ESP32?

W WebConfig trzeba dodać pola do `params`, odebrać je przez `conf.handleFormRequest(&server)`, a zapisane wartości wczytać przy starcie przez `conf.readConfig()` i użyć do konfiguracji Ethernetu [#21407548] [#21409137] Dla IP nie można przekazać samego napisu do `ETH.config()`, tylko trzeba utworzyć obiekt `IPAddress` i zapełnić go z tekstu, np. `IPAddress myIP; myIP.fromString(conf.values[0]); ETH.config(myIP, myGW, mySN, myDNS);` [#21410963] [#21411120] Wartości konfiguracyjne są trzymane jako stringi, a biblioteka pozwala potem na ich ponowne odczytanie i użycie przy starcie urządzenia [#21407548] [#21410382] Jeśli chcesz ustawić domyślne wartości, użyj `conf.setValue("ssid", ...)`, `conf.setValue("myIP", "192.168.178.200")` i potem `conf.writeConfig()` [#21411408] [#21411518]
Wygenerowane przez model językowy.
  • #2 21406867
    jarekgol
    Poziom 40  
    Posty: 5113
    Pomógł: 641
    Ocena: 1132
    On tam zamieszcza kod, zły?
    Poza tym dowolne Arduino np. Uno nie posiada karty LAN, więc twoje pytanie jest marne.
  • #3 21406930
    robo1973
    Poziom 15  
    Posty: 679
    Pomógł: 2
    Ocena: 59
    jarekgol napisał:
    On tam zamieszcza kod, zły?
    Poza tym dowolne Arduino np. Uno nie posiada karty LAN, więc twoje pytanie jest marne.

    to że nie posiada LAN to każdy wie Poprawiłem temat Będziesz zadowolony
    Podany w przykładzie kod jest duży Chce zmodyfikować to https://github.com/GerLech/WebConfig
    tylko chce zapisywać konfiguracje LAN
    pozdrawiam !
  • #4 21407015
    JacekCz
    Poziom 42  
    Posty: 8670
    Pomógł: 760
    Ocena: 1460
    Ty nie szukasz przykładu. Szukasz gotowca.
    Masz prawie gotowy projekt.
    Znajdź przykłady "zapisywania" i złącz
  • #5 21407032
    robo1973
    Poziom 15  
    Posty: 679
    Pomógł: 2
    Ocena: 59
    Ta funkcja zapisuje do rekordu ?

    
    void handleRoot() {
      conf.handleFormRequest(&server);
      if (server.hasArg("SAVE")) {
        uint8_t cnt = conf.getCount();
        Serial.println("*********** Konfiguration ************");
        for (uint8_t i = 0; i<cnt; i++) {
          Serial.print(conf.getName(i));
          Serial.print(" = ");
          Serial.println(conf.values[i]);
        }
        if (conf.getBool("switch")) Serial.printf("%s %s %i %5.2f \n",
                                    conf.getValue("ssid"),
                                    conf.getString("continent").c_str(), 
                                    conf.getInt("amount"), 
                                    conf.getFloat("float"));
      }
    }
    
  • #6 21407068
    jarekgol
    Poziom 40  
    Posty: 5113
    Pomógł: 641
    Ocena: 1132
    To wygląda na wyświetlanie, nie zapis. Wszędzie masz get i print.
  • #7 21407290
    JacekCz
    Poziom 42  
    Posty: 8670
    Pomógł: 760
    Ocena: 1460
    jarekgol napisał:
    To wygląda na wyświetlanie, nie zapis. Wszędzie masz get i print.


    Ale koledze google wystawiło słowo "save" :)

    @robo1973 ciężko będzie, jak pięciu linijek prostego kodu nie umiesz przeczytać.
    Danie tzw "przykładu" nic ci nie pomoże.
  • #8 21407297
    robo1973
    Poziom 15  
    Posty: 679
    Pomógł: 2
    Ocena: 59
    Dziękuję za pomoc. Jak to ma tak wyglądać na nabijaniu, to lepiej się nie wypowiadajcie. Kol. JacekCz, nie każdy jest taki obeznany w temacie jak Ty.
  • #9 21407484
    jarekgol
    Poziom 40  
    Posty: 5113
    Pomógł: 641
    Ocena: 1132
    @robo1973
    Jednak jest szansa że pierwsza linijka robi robotę, z dokumentacji na githubie:
    void handleFormRequest(WebServer * server);
    function to respond a HTTP request for the form use the default filename to save

    Czy te przykłady z działu examples ci działają?
    https://github.com/GerLech/WebConfig/tree/master/examples

    Myślę że przyda ci się też zajrzeć do dokumentacji webserver, przy czym nie jestem pewien którego oni używają. Zakładam że ten:
    https://github.com/espressif/arduino-esp32/tree/master/libraries/WebServer

    ps. jak chcesz sprawdzić działanie jakiejś funkcji lub bloku instrukcji, to zawsze możesz wykomentować i zobaczyć co się stanie.
  • #11 21407548
    jarekgol
    Poziom 40  
    Posty: 5113
    Pomógł: 641
    Ocena: 1132
    Jeśli chodzi ci o:
    String params = "["
    to wygląda na szablon, informujący jakiego typu danych się spodziewać.
    Nie ma tam oddzielnej funkcji do zapisu, wszystko robi obsługa żądania http.

    Jak chcesz drążyć głębiej, zacznij tutaj https://github.com/GerLech/WebConfig/blob/master/src/WebConfig.cpp#L269

    Dobra, chyba wiem czego nie rozumiesz. Ten webconfig umożliwia zapisywanie parametrów z formularza (strony internetowej) do pliku. Możesz sobie sam zdefiniować jakie są to parametry (nazwy,typ). W przykładzie użyto części z nich do konfiguracji wifi w funkcji initWiFi(), przy czym najpierw w setup() jest ładowana konfiguracji z pliku do pamięci.
    Jeśli chcesz tym konfigurować kartę przewodową, musisz sam ogarnąć strukturę danych i przepisanie ich na starcie do owej karty.
  • #12 21407568
    robo1973
    Poziom 15  
    Posty: 679
    Pomógł: 2
    Ocena: 59
    ok kol jarekgol to już mi dużo pomogło
    Dziękuje

    Dodano po 5 [godziny] 24 [minuty]:

    czyli tak
    void setup() {
    conf.setDescription(params);//ładowane są parametry z pamięci ?

    a to
    server.on("/",handleRoot);???

    Serial.print(conf.values[0]); // gdzie jest zaisywany rekord z parametrami ?
  • #13 21408848
    jarekgol
    Poziom 40  
    Posty: 5113
    Pomógł: 641
    Ocena: 1132
    robo1973 napisał:
    conf.setDescription(params);//ładowane są parametry z pamięci ?

    Nie, tu przekazujesz jakich danych się spodziewać.


    server.on("/",handleRoot);???
    To jest część od WebServer - jaką funkcję wywołać, jak ktoś pobierze/wyśle? dokument z głównego katalogu.

    Serial.print(conf.values[0]); // gdzie jest zaisywany rekord z parametrami ?
    Print to nie zapis. Są zapisywane do pliku, jak pisałem post wcześniej.
  • #14 21408903
    robo1973
    Poziom 15  
    Posty: 679
    Pomógł: 2
    Ocena: 59
    jarekgol napisał:
    Print to nie zapis. Są zapisywane do pliku, jak pisałem post wcześniej.

    chodziło mi o conf.values[0])
    Która funkcja zapisuje do pliku ?
  • #15 21409137
    jarekgol
    Poziom 40  
    Posty: 5113
    Pomógł: 641
    Ocena: 1132
    jarekgol napisał:
    Nie ma tam oddzielnej funkcji do zapisu, wszystko robi obsługa żądania http.

    Jak już pisałem i jest w dokumentacji:
    conf.handleFormRequest(&server);

    Spróbuj w ramach ćwiczenia dodać sobie pole o nazwie "robo" typ liczba całkowita (odpowiedni INTEGER) zobacz czy ci się pojawi na stronie, zmień ją z przeglądarki, zapisz, wyłącz wszytko, włącz i zobacz czy pamięta.
  • #16 21409763
    robo1973
    Poziom 15  
    Posty: 679
    Pomógł: 2
    Ocena: 59
    czyli taj
    tutaj muszę wpisać IP odczytane z pliku
    
    ETH.config(myIP, myGW, mySN, myDNS);
    

    coś takiego

    
    ETH.config(conf.values[0].c_str(),conf.values[1].c_str(),conf.values[2].c_str(),conf.values[3].c_str())
    


    jak będzie wyglądało

    
    String params = "["
    
      "{"
      "'name':'???????',"
      "'lP Lan ',"
      "'type':"+String(INPUTDATE)+","
      "'default':''"
      "},"
    


    i chyba będzie problem z typem danych, ponieważ w parms zapisuję string a ETH.config wymaga unit_32 ?
  • #17 21410033
    jarekgol
    Poziom 40  
    Posty: 5113
    Pomógł: 641
    Ocena: 1132
    No, idziesz w dobrym kierunku. Ja nie wiem jakich danych wymaga użyta przez ciebie biblioteka.
    Najpierw zrób inicjalizację karty wpisując wartości na sztywno, potem powalcz żeby przyjęło to z configa.
    Zajrzyj do dokumentacji biblioteki, czasem jest kilka wersji tej samej funkcji, np. IP jako 4 osobne bajty, albo jako łańcuch znaków, ale sam poszukaj.

    To co proponujesz do params ma złą składnie. JSON składa się z par nazwa_klucza:wartość, przy czym musisz sobie ogarnąć cudzysłowy.
    https://stackoverflow.com/questions/22998177/store-hardcoded-json-string-to-variable
    https://github.com/GerLech/WebConfig/blob/master/README.md#parameter-definition-with-json *to jest o C#, ale możesz poczytać o jakie problemy chodzi.

    Tu jest opis JSON https://pl.wikipedia.org/wiki/JSON ale jakbym nie miał z tym do czynienia wcześniej i to zobaczył, to pewnie bym się wiele nie dowiedział ;) Zupełnie jak w szkole :)
  • #18 21410075
    robo1973
    Poziom 15  
    Posty: 679
    Pomógł: 2
    Ocena: 59
    Zrobiłem inicjacje kary na sztywno i działa

    Dotarłem do tego
    
    conf.setDescription(params);//ładowane są parametry z pamięci 
    
    conf.readConfig();//wyświetla zapisane parametrty  z String params = "["
    
    

    conf.values[0].c_str() odczytuje string i nie wiem jak przekształcić ten łańcuch np 191.168.1.1 żeby wpić do funkcji po niżej
      ETH.config(myIP, myGW, mySN, myDNS);// LAN Static IP, leave without this line to get IP via DHCP

    to by zadziało
  • #19 21410151
    jarekgol
    Poziom 40  
    Posty: 5113
    Pomógł: 641
    Ocena: 1132
    Aha, pisałem że nie wiem czego używasz do ETH. Ustal, napisz. Tzn link do źródeł na githubie, gdzie w plikach nagłówkowych są funkcje których faktycznie używasz.
    robo1973 napisał:
    odczytuje string

    Czyli co dokładnie?
    Odczytuje "191.168.1.1" i to ci nie pasuje, czy odczytuje coś i chcesz z tego zrobić "191.168.1.1"?

    Pisz, tak żeby nie trzeba było zgadywać co chcesz i tym bardziej co widzisz. Ja nie widzę ani twojego terminala, ani kodu.

    A zastanawiałeś się czy potrzebujesz na końcu .c_str() ?

    ps.
    Cytat:
    Zrobiłem inicjacje kary na sztywno i działa

    Jakbyś łaskawie wkleił, to pewnie mógł bym zobaczyć jakie parametry to potrzebuje :|
  • #20 21410382
    robo1973
    Poziom 15  
    Posty: 679
    Pomógł: 2
    Ocena: 59
    za pomocą
    conf.values[0].c_str())

    odczytuje łańcuch, który zapisałem do pliku za pomocą www, wynikiem jest 192.168.1.1

    Chcę ten odczytany IP zapisać do konfiguracji ETH
    ETH.config(myIP, myGW, mySN, myDNS);

    próbuje tak
    ETH.config(conf.values[0].c_str(), myGW, mySN, myDNS);
    

    Compilation error: conversion from 'const char*' to 'IPAddress' is ambiguous

    i tak:
    ETH.config(conf.values[0], myGW, mySN, myDNS);

    Compilation error: no matching function for call to 'ETHClass::config(String&, IPAddress&, IPAddress&, IPAddress&)'


    Niezgodność typów

    uint32_t first = ????????? (conf.values[0].c_str());
  • #21 21410562
    jarekgol
    Poziom 40  
    Posty: 5113
    Pomógł: 641
    Ocena: 1132
    Napisz jak wygląda działająca konfiguracja ręczna.
    Czemu nie poszukasz - jak pisałem - w dokumentacji funkcji ETH.config jaki dokładnie typ danych potrzebuje?
    Wrzuć jakie masz includy na początku pliku.

    Zajrzyj tu: https://github.com/espressif/arduino-esp32/blob/master/cores/esp32/IPAddress.h
    są tam funkcje
    IPAddress(const uint8_t *address); i
    bool fromString(const char *address);
    bool fromString(const String &address)
  • #22 21410776
    robo1973
    Poziom 15  
    Posty: 679
    Pomógł: 2
    Ocena: 59
     uint32_t first = atoi (conf.values[0].c_str());
    
      ETH.config(IPAddress(first), myGW, mySN, myDNS);


    wpisuje ale tylko pierwszą liczbe z IP 192.168.1.1 wpisuje 192 ?

    uzywam #include <WebServer_WT32_ETH01.h>
  • #23 21410918
    jarekgol
    Poziom 40  
    Posty: 5113
    Pomógł: 641
    Ocena: 1132
    https://github.com/khoih-prog/WebServer_WT32_...lob/main/examples/HelloServer/HelloServer.ino
    Musisz sobie powołać obiekt klasy IPAddress i jego przekazać do konfiguracji.
    Patrz linie 23-25 i co się po tym z tym dzieje.

    Wypisz na terminal Serial.println(conf.values[0]);
    i wklej tu efekt.

    ps. prawdopodobnie IPAddress myIP(conf.values[0])); zadziała, ale czemu ja znów muszę zgadywać co masz w zmiennej conf.values[0] ?
  • #24 21410941
    robo1973
    Poziom 15  
    Posty: 679
    Pomógł: 2
    Ocena: 59
    Serial.println(conf.values[0]);
    odpowiedź IP taki jak wpisałem :
    192,168,178,201

     IPAddress myIP(conf.values[0]); 
    
    błąd kompilacji
    Compilation error: no matching function for call to 'IPAddress::IPAddress(String&)'
    
  • #25 21410963
    jarekgol
    Poziom 40  
    Posty: 5113
    Pomógł: 641
    Ocena: 1132
    IPAddress myIP(conf.values[0].c_str());
    lub użyj co pisałem wyżej
    bool fromString(const String &address)

    a jak nadal ci nie zadziała, to zrób test:
    IPAddress myIP("192.168.0.1");

    Masz przecinki w IP zamiast kropek, tak ma być?
  • #26 21410970
    robo1973
    Poziom 15  
    Posty: 679
    Pomógł: 2
    Ocena: 59
    to działa IPAddress myIP(192, 168, 178, 212);

    IPAddress myIP(conf.values[0].c_str()); błąd kompilacji Compilation error: no matching function for call to 'IPAddress(const char*)'

    nie bardzo wiem jak użyć bool fromString(const String &address) ?
  • #27 21411013
    jarekgol
    Poziom 40  
    Posty: 5113
    Pomógł: 641
    Ocena: 1132
    robo1973 napisał:
    to działa IPAddress myIP(192, 168, 178, 212);

    dokładnie w takiej postaci, czy były tam cudzysłowy? To ważne :|

    robo1973 napisał:
    no matching function for call to 'IPAddress(const char*)'

    możesz spróbować cast-owania typów, dopisz przed (const uint8_t *) i musisz pokombinować z miejscem gwiazdki, bo ja nigdy nie pamiętam jak się to pisze

    robo1973 napisał:
    nie bardzo wiem jak użyć bool fromString(const String &address) ?

    spróbuj wywołać na tym, co już zadziało, czyli:
    IPAddress myIP(192, 168, 178, 212);
    myIP.fromString(conf.values[0]);

    lub powołaj nowy obiekt ipadres i użyj na nim.
    IPAddress myIP;
    myIP.fromString(conf.values[0]);
  • #28 21411120
    robo1973
    Poziom 15  
    Posty: 679
    Pomógł: 2
    Ocena: 59
    DZIAŁA !!!! DZIĘKUJE!!!!!!!

    IPAddress myIP;
    myIP.fromString(conf.values[0]);  
    
    ETH.config(myIP, myGW, mySN, myDNS);
    


    trzeba w www wpisywać 192.168.178.215 z kropkami

    Jak wpiszemy zamiast prawidłowego formatu IP jakieś bzdury to IP ma wartość 0.0.0.0
    ale mogę się łączyć na na IPv4: 192.168.178.122
    ETH MAC: 80:64:6F:EA:08:7B, IPv4: 192.168.178.122
    nie wiem skąd się bierze ten IP Może jakiś domyślny z biblioteki
    Pozdrawiam !!

    Dodano po 1 [godziny] 46 [minuty]:

    w jaki sposób wczytać domyślne ustawienia default ?
    "{"
      "'name':'myIP',"
      "'label':'IP LAN',"
      "'type':"+String(INPUTTEXT)+","
      "'default':'192.168.178.200'"
      "},"

    czy jest do tego jakaś funkcja ?
  • #29 21411408
    jarekgol
    Poziom 40  
    Posty: 5113
    Pomógł: 641
    Ocena: 1132
    setValue, potem writeConfig
    tylko wymyśl sobie kiedy chcesz żeby to się odbyło.
  • #30 21411518
    robo1973
    Poziom 15  
    Posty: 679
    Pomógł: 2
    Ocena: 59
    działa
    
      conf.setValue("ssid","moja_siec");
      conf.setValue("myIP","192.168.178.200");
      conf.writeConfig();
    

    pozdrawiam i dziękuje !!

Podsumowanie tematu

✨ Użytkownik poszukiwał przykładu zmiany ustawień LAN i zapisu do EEPROM za pomocą przeglądarki WWW dla modułu WT32-ETH01. W dyskusji poruszono kwestie dotyczące kodu, który umożliwia zapis konfiguracji LAN (adres IP, maska, brama) oraz interakcję z biblioteką WebConfig. Uczestnicy wymieniali się informacjami na temat funkcji do obsługi formularzy, konwersji typów danych oraz sposobów inicjalizacji i zapisu parametrów. Ostatecznie użytkownik z powodzeniem skonfigurował zapis do EEPROM oraz odczyt domyślnych ustawień IP, a także uzyskał pomoc w wyświetlaniu zmiennych na stronie WWW.
Wygenerowane przez model językowy.
REKLAMA