Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

ESP8266 Wemos D1 - przepełnienie stringu, restart.

jaskol 28 Jan 2022 10:01 360 16
  • #1
    jaskol
    Level 12  
    Witam wszystkich.
    Męczę się sam, ale na pewno ktoś już miał ten problem i coś podpowie. Wczytuje plik, 20kB, do stringa (SPIFFS czy LittleFS - bez różnicy), podmieniam pewne ciągi znaków i zapisuje w drugim pliku. Póki plik był mały (nie pamiętam, może 10kB, ale zgaduję), to wszystko działało poprawnie. Teraz widzę, że raz na kilka zapisów procesor się restartuje. Włączyłem debug i mam co jakiś czas komunikat:
    [String] Reallocating large String(191 -> 192 bytes) [.......] Później się chyba stos przepełnia, w każdym razie następuje restart.
    Mogę podzielić ten plik na kilka mniejszych, ale to zepsuje mi koncepcje. Wolałbym wiedzieć jak to obsłużyć. Nie jestem programistą, a na pewno jest tutaj ktoś, kto od razu wie, czy wsadzić to w jakąś tablicę czy jeszcze inaczej rozwiązać.

    Nie jestem programistą, proszę nie krzyczeć ;)
    Wczytuje po prostu zawartość pliku do zmiennej string:

    String Config_Webpage = "";



    File file_init = LittleFS.open("/config_init.html","r");
    file_init.setTimeout(5000); // moze byc 1000, moze byc 5000, bez różnicy - uprzedzam pytanie czemy tak dużo

    if (file_init) {
    Config_Webpage = file_init.readString();
    }

    Myślałem, że program się wysypuje przy zapisie do pliku, ale zrobiłem pułapki i debug po RS-ie wykazał, że to się wysypuje już na etapie odczytu z pliku. Czy ktoś wie ile można "zmieścić" w zmiennej typu String ?

    Dodam tylko, że jak zadeklaruję tablicę o stałym rozmiarze,to też nie do końca rozwiąże problem, bo ten plik może mieć różną wielkość (+/- 1kB). Nie chciałbym alokować na stałe jakiegoś obszaru pamięci, bo wiadomo, że tego ciągle jest za mało. Chyba, że jakoś zgrabnie alokować i zwalniać.
    Proszę o pomoc, bo nie chcę się dłużej kompromitować, a coś mi mówi, że takie problemy rozwiązywało się już wieki temu...

    Pozdrawiam,
    Mariusz
  • #2
    mpier
    Level 28  
    Witam,
    teraz właśnie próbujesz "zgrabnie alokować i zwalniać". Wczytaj całe dane do bufora wcześniej zarezerwowanego, ale go nie zwalniaj po użyciu. W ogóle potrzebny Ci cały plik w RAM, żeby kilka bajtów zamienić?

    Pozdrawiam.
  • #3
    jaskol
    Level 12  
    mpier wrote:
    Witam,
    teraz właśnie próbujesz "zgrabnie alokować i zwalniać". Wczytaj całe dane do bufora wcześniej zarezerwowanego, ale go nie zwalniaj po użyciu. W ogóle potrzebny Ci cały plik w RAM, żeby kilka bajtów zamienić?

    Pozdrawiam.

    Cześć.
    Tak coś czułem, ale bałem się wypowiadać głośno ;)
    Już zacząłem robić ten bufor, bo nikt nie odpowiadał, zobaczymy.
    Jak nie zwolnię, to przynajmniej nic nie zajmie tego obszaru pamięci i może będzie mniejsza szansa na "wysypanie" się w przyszłości.
    Nie wiem jak to inaczej ugryźć.
    Zrobiłem tak, że mam plik wzorcowy html (config_init.html), w którym mam strone www z konfiguracją urządzenia.
    Mam w niej słowa-klucze, w których podmieniam wartości i zapusuję już nowe do drugiego pliku, tego wyświetlanego user-owi.
    Wprowadzasz zmianyna WWW, wysyła się formularz, ESP go łyka do Stringu, funkcja "replace" zmienia w tym stringu, to co musi ( w zależności od tego, co zmieniłeś na stronie WWW) i zapisuje do pliku config.html
    Kombinowałem, żeby wczytywać po kilka linijek, ale to bez sensu, bo długo trwa, a i tak się String może przepełnić.
    Na www wprowadzasz np. swój email, więc wielkość tego pliku się mogła zmieniać.
    Zadeklarowałem String i myślałem, że będę miał spokój, bo procesor już o to zadba, żeby go "upchnąć" właściwie w RAM-ie.
    No i upycha, ale do pewnego momentu ;)
    Pytanie czy wiadomo ile się tam zmieści bajtów, bo może mógłbym to kontrolować i wtedy wkraczać ?
    Robię ten bufor, ale chętnie bym się dowiedział, czy nie ma lepszego sposobu na mój problem, czasami człowiek ma klapki na oczach...

    M.
  • #4
    mpier
    Level 28  
    Jeśli z góry wiadomo, że pamięci jest za mało, to można śmiało przyjęć, że program i tak nie będzie działał prawidłowo, a jeśli działa, to pamięci nie jest za mało.

    Powinno się zmieścić tyle ile zarezerwujesz. Zobacz reserve(). Sądząc po nazwie ma sens, trzeba w źródłach sprawdzić czy będzie ok.

    Nie możesz zapisać danych osobno? Mógłbyś wtedy w locie uzupełnić te dane, a szablon HTML zostawić tylko do odczytu. Musi być do tego jakaś gotowa biblioteka.
  • #5
    jaskol
    Level 12  
    mpier wrote:
    Jeśli z góry wiadomo, że pamięci jest za mało, to można śmiało przyjęć, że program i tak nie będzie działał prawidłowo, a jeśli działa, to pamięci nie jest za mało.

    Powinno się zmieścić tyle ile zarezerwujesz. Zobacz reserve(). Sądząc po nazwie ma sens, trzeba w źródłach sprawdzić czy będzie ok.

    Nie możesz zapisać danych osobno? Mógłbyś wtedy w locie uzupełnić te dane, a szablon HTML zostawić tylko do odczytu. Musi być do tego jakaś gotowa biblioteka.


    Robię testy i odpalam program z:
    Free heap size: 20992 (bytes)
    Z tego co wyczytałem, to właśnie moja ilość wolnego RAM-u.
    20kB, to trochę mało. Czytam, że na starcie ESP8266 ma 80kB.
    Czyli rzeczywiście cudu nie będzie. Albo podzielę plik na mniejsze części, albo przesiądę się na ESP32.
    Nie wiem jak miałbym dane uzupełniać w locie, mam je zapisane w tablicy i tak właśnie je z niej wyciągam,
    szukam ciągu znaków we wczytanym do Stringu pliku, zamieniam ciąg na te dane i tak aż do końca wyszukiwania.
    Później całość zapisuje do pliku.
    Muszę wczytać cały plik, żeby go przeszukać i zamienić dane za jednym razem, funkcja replace().
    Mógłbym linijka po linijce, ale i tak muszę później wszystko złożyć w całość, żeby zapisać do pliku - zapisywanie po każdej zmianie raczej
    byłoby czasochłonne.
    Mogę jeszcze na sztywno zrobić ten plik i będę wiedział, w której linijce jaką mam zmienną do podmiany, ale to mnie ograniczy, bo każda rozbudowa tego pliku będzie się wiązała z ponowna analizą, co w której linijce się znajduje, co się przesunęło, itd.
    Jedyne na co wpadłem teraz, to że zrobię znacznik początku i końca danych "właściwych" i zamiast wczytywać plik od początku, to wczytam, ale odrzucę wszystko, co było przed znacznikiem początku (nagłówki html i inne takie).
    Tylko ile zaoszczędzę ? Jakieś drobne :(
    Testuje dalej, ale widzę, że to jest poważne ograniczenie.
    Piszesz sobie program, pamięci ubywa, chociaż myślisz, że dane zajmują wg. kompilatora 66%.
    Później liczysz i się okazuję, że zostało kilka K i śmierć.
    Mam wersje z ESP32 i PSRAM, chyba czas się zainteresować...

    Mariusz
  • #6
    mpier
    Level 28  
    Przecież nie musisz wczytywać całego pliku na raz. Nie masz miejsca na 20kB, ale już 2kB spokojnie zmieścisz. Tekst z pliku z podstawionymi zmiennymi możesz wysłać bezpośrednio do klienta, albo zapisać do pliku.
    Nie masz czego analizować po zmianie zawartości pliku, jeśli napiszesz np. tak:
    Code: html
    Log in, to see the code
  • #7
    khoam
    Level 41  
    Czemu korzystasz z file_init.readString()? W ten sposób faktycznie może przepełnić stertę przy operacjach na długich String, a przy wielokrotnym wczytywaniu stringów następuje też fragmentacja tej stery. Lepiej użyć file_init.readBytes() i wczytywać dane do statycznej tablicy (alokacja na stosie).
    Link
  • #8
    jaskol
    Level 12  
    mpier wrote:
    Przecież nie musisz wczytywać całego pliku na raz. Nie masz miejsca na 20kB, ale już 2kB spokojnie zmieścisz. Tekst z pliku z podstawionymi zmiennymi możesz wysłać bezpośrednio do klienta, albo zapisać do pliku.
    Nie masz czego analizować po zmianie zawartości pliku, jeśli napiszesz np. tak:
    Code: html
    Log in, to see the code

    Problem w tym, że ten plik ma dosyć dużo tekstu w HTML+javascript, żeby to jakoś wyglądało.
    Stąd się bierze 20kB.
    Nie chce wysyłać bezpośrednio, bo to taki plik z MENU i zakładkami - różne opcje z podziałem na sekcje, przełączają się zakładki, ale wszystko się dzieje w jednym pliku. Jest tam np. 5 czy 6 niezależnych formularzy. Generalnie, to rzadko się coś zmienia w konfiguracji urządzenia i można sobie pozwolić, żeby wtedy poczekać np. 3 sekundy na pełny zapic i informacje na OLED, że "zapisano".
    Gdybym to dzielił na kawałki po 2kB, to nie dosyć, że czas, to mimo wszystko kolejny kod do obsługi.
    A jak w tych 2kB trafie w połowę nazwy jakiejś mojej zmiennej i przeczytam %NAZ, a w drugim 2kB będzie reszta, czyli WISKO% ?
    Można po kilka linijek wczytywać, czekając na "\n", ale już widzę, że za chwilę braknie mi pamięci na inne rzeczy.
    Zapuściłem program, który mi pokazuje zajętość z każdą wczytaną linijką z pliku i widzę jak się to wysypuje - np. po przepełnieniu zadeklarowanej tablicy String buffer[500]. Wczyta się >500 i pada. Jak dam 600, to i tak będzie za mało i się wysypie, ale później.
    Jest nawet tak, że jak mam cały wsad docelowy i tak sprawdzam, to już przy RAM na poziomie 400B robi się restart, a jak wszystko wyrzucę i zostawię tylko procedurę do testowania, to potrafię zejść do 4B pamięci i jeszcze działa.
    Trochę się już przesiadam na ESP32, ale znowu mnie dobija, bo co prawda zajętości RAM mam 14%, ale pamięci programu 72% ! A to ten sam program. I o ile pamiętam, to w ESP8266 miałem Flash 4MB, a w ESP32 mam LOLIN D32 PRO i 16MB Flash ! Partition scheme zmieniam, ale jakoś ciągle mam wrażenie, że zostaje jakaś nędza. 16MB i taka zajętość ?

    Chip is ESP32-D0WD-V3 (revision 3)
    Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
    Crystal is 40MHz
    Auto-detected Flash size: 16MB

    Ktoś mnie pocieszy, że coś źle robię lub czytam, czy się okaże, że zyskam RAM, a za chwile skończy mi się FLASH ?

    Dzięki,
    Mariusz

    Dodano po 1 [minuty]:

    khoam wrote:
    Czemu korzystasz z file_init.readString()? W ten sposób faktycznie może przepełnić stertę przy operacjach na długich String, a przy wielokrotnym wczytywaniu stringów następuje też fragmentacja tej stery. Lepiej użyć file_init.readBytes() i wczytywać dane do statycznej tablicy (alokacja na stosie).
    Link[/quote

    Dzięki, sprawdzę jak się to zachowa, ale tak czy owak, to miejsce na te 20kB się musi znaleźć, wcześniej czy później.
    Da się jakoś zwolnić zajmowaną przestrzeń w tablicy, kiedy jest mi już niepotrzebna ?
    Na szybko to robiłem, ale mam wrażenie, że jak zapełniłem taka tablicę String buffer[600] tą zawartościa pliku,
    to późniejsze String buffer[600]="" nic nie dało.
    Jest jakaś instrukcja, to "wyczyszczenia" w całości takiej tablicy i zwolnienia pamięci ?

    Mariusz
  • #9
    khoam
    Level 41  
    jaskol wrote:
    khoam wrote:
    Da się jakoś zwolnić zajmowaną przestrzeń w tablicy, kiedy jest mi już niepotrzebna ?

    Jak często ten obszar pamięci w programie będziesz wykorzystywał? Tylko raz? Można alokować i zwalniać dynamicznie (za pomocą new/delete) żądany obszar pamięci, ale w wypadku 20kB "cienko" to widzę na ESP8266 (sam program też używa sterty). Na pewno lepiej jest korzystać z tablicy char[] zamiast obiektów klasy String.

    jaskol wrote:
    String buffer[500].

    W ten sposób to na pewno będą problemy. Każdy String może mieć różną długość , będzie alokowanych 500 obszarów o różnym rozmiarze na stercie i zabraknie na niej miejsca.
  • Helpful post
    #10
    janek_wro
    Level 28  
    jaskol wrote:
    Problem w tym, że ten plik ma dosyć dużo tekstu w HTML+javascript, żeby to jakoś wyglądało.
    Stąd się bierze 20kB.
    Nie chce wysyłać bezpośrednio, bo to taki plik z MENU i zakładkami - różne opcje z podziałem na sekcje, przełączają się zakładki, ale wszystko się dzieje w jednym pliku.

    Może podchodzisz do tego od złej strony. Po co manipulować sporym plikem na tym ESP?
    Zrób jeden plik (hmtl+js), w pełni statyczny treścią. Zmienne wpakuj w osobny plik js. Mniejszy.
  • #11
    mpier
    Level 28  
    jaskol wrote:
    A jak w tych 2kB trafie w połowę nazwy jakiejś mojej zmiennej i przeczytam %NAZ, a w drugim 2kB będzie reszta, czyli WISKO% ?

    Nie trafisz w połowę bo %NAZ będzie zawsze na początku bufora, a %NAZWA_ZMIENNEJ% będzie dużo krótsza od długości tego bufora.

    Jeśli piszesz w JS, to zmienne możesz podstawić też w przeglądarce.

    Musisz mieć jakieś inny duży błąd w programie, że takie problemy wychodzą.
  • #12
    janek_wro
    Level 28  
    mpier wrote:
    Nie trafisz w połowę bo %NAZ będzie zawsze na początku bufora
    Uzasadnij to twierdzenie. Bo jakoś nie czuję co masz na myśli. Przecież taki placeholder może wystąpić w dowolnym miejscu pliku template, w tym również w miejscu gdzie wypadnie późniejsze "przełamanie" po wczytaniu stałej ilości bajtów w bufor.
    Chyba żeby zrealizować czytanie do bufora tylko do wystąpienia % (czy jakiegolokwiek znaku/-ów jaki używa template). A resztę przy kolejnej rundzie.
    Albo czytać po 1 linii, tj. do CRLF. O ile template posiada CRLF, bo nie musi.

    mpier wrote:
    Jeśli piszesz w JS, to zmienne możesz podstawić też w przeglądarce.
    Jeśli przewidziane korzystanie zakłada że klient będzie online, w sensie dostępu do świata, to nawet można wziąć podlinkować jquery/ui z CDN, i korzystać z jego dobrodziejstw. Bo w device to chyba za mało miejsca żeby wbudować?
  • #13
    jaskol
    Level 12  
    janek_wro wrote:
    jaskol wrote:
    Problem w tym, że ten plik ma dosyć dużo tekstu w HTML+javascript, żeby to jakoś wyglądało.
    Stąd się bierze 20kB.
    Nie chce wysyłać bezpośrednio, bo to taki plik z MENU i zakładkami - różne opcje z podziałem na sekcje, przełączają się zakładki, ale wszystko się dzieje w jednym pliku.

    Może podchodzisz do tego od złej strony. Po co manipulować sporym plikem na tym ESP?
    Zrób jeden plik (hmtl+js), w pełni statyczny treścią. Zmienne wpakuj w osobny plik js. Mniejszy.

    TAK, to może być rozwiązanie mojego problemu !
    No i będzie szybkie.
    Dzięki, sprawdzę, chociaż już się przesiadłem na ESP32 i jak tylko wywalę jakieś zapędy tamtego webserwera, żeby wszystko serwować w "gz" i w filesystem dodawać jakieś prefixy (ustawiłem co trzeba na "1", a nadal dodaje "/littlefs", to może już zostanę przy ESP32.
    Jak się jednak okaże, ze przy ESP8266 i 4MB Flash miałem zajętość na poziomie 60%, a przy ESP32 i 16MB mam na poziomie 70%, to się naprawdę wścieknę. Zaraz zacznę wdrażać Twój pomysł, na tym ESP32, tutaj też lepiej mieć mniej do zapisu i szybciej działający kod.

    Dzięki,
    Mariusz

    Dodano po 4 [minuty]:

    khoam wrote:
    jaskol wrote:
    khoam wrote:
    Da się jakoś zwolnić zajmowaną przestrzeń w tablicy, kiedy jest mi już niepotrzebna ?

    Jak często ten obszar pamięci w programie będziesz wykorzystywał? Tylko raz? Można alokować i zwalniać dynamicznie (za pomocą new/delete) żądany obszar pamięci, ale w wypadku 20kB "cienko" to widzę na ESP8266 (sam program też używa sterty). Na pewno lepiej jest korzystać z tablicy char[] zamiast obiektów klasy String.

    jaskol wrote:
    String buffer[500].

    W ten sposób to na pewno będą problemy. Każdy String może mieć różną długość , będzie alokowanych 500 obszarów o różnym rozmiarze na stercie i zabraknie na niej miejsca.

    Rozumiem, tylko ten char mi coś w praktyce "nie wychodził".
    Nawet jak już będzie ok, to się martwię, że za chwilę zostanie mi 10kB wolnej pamięci i będzie po sprawie.
    Jak zwolnię pamięć, a później ją czymś innym wykorzystam i będzie za mało, żeby wczytać plik, to też się wszystko wysypie.
    Jakby nie mogli dać trochę więcej tego RAM-u, przecież bym dopłacił ;)

    Mariusz

    Dodano po 8 [minuty]:

    janek_wro wrote:
    mpier wrote:
    Nie trafisz w połowę bo %NAZ będzie zawsze na początku bufora
    Uzasadnij to twierdzenie. Bo jakoś nie czuję co masz na myśli. Przecież taki placeholder może wystąpić w dowolnym miejscu pliku template, w tym również w miejscu gdzie wypadnie późniejsze "przełamanie" po wczytaniu stałej ilości bajtów w bufor.
    Chyba żeby zrealizować czytanie do bufora tylko do wystąpienia % (czy jakiegolokwiek znaku/-ów jaki używa template). A resztę przy kolejnej rundzie.
    Albo czytać po 1 linii, tj. do CRLF. O ile template posiada CRLF, bo nie musi.

    Używam string.replace() i to chyba działa tak, że szuka wystąpienia zadanego ciągu znaków w stringu.
    Tak podmieniam zmienne na wartości. Czyli musi odszukać cały ciąg znaków %NAZWISKO%, żeby to zamienić na KOWALSKI.
    Tak, pisałem o tym, że można wczytywać linijka po linijce, ale jak będę przeszukiwał za każdym razem każdą linijkę i wczytywał kolejną, to całość się raczej koszmarnie wydłuży.

    mpier wrote:
    Jeśli piszesz w JS, to zmienne możesz podstawić też w przeglądarce.
    Jeśli przewidziane korzystanie zakłada że klient będzie online, w sensie dostępu do świata, to nawet można wziąć podlinkować jquery/ui z CDN, i korzystać z jego dobrodziejstw. Bo w device to chyba za mało miejsca żeby wbudować?

    Tak, mam w nagłówku jquery, bo się okazało, że szybciej to działa, jak jest brane z netu, niż jak jest czytane z systemu plików.
    Chciałem być niezależny, wszystko miałem lokalnie i działało zdecydowanie wolniej, niż jak było "z netu".
    Chodzi też o buforowanie stron, o cache przeglądarki i inne takie, więc się okazuje, że sprawniej jest wczytywać z sieci.
    Jak sieci braknie, to się zaczną problemy, to tez będę jeszcze testował, bo każdy zakłada, że sieć działa zawsze...

    Mariusz
  • #14
    kaczakat
    Level 33  
    Ja mam stronę WWW zapisaną w pliku INO tak:
    Code:
    WebSocketsServer webSocket = WebSocketsServer(81);
    

    static const char PROGMEM INDEX_HTML[] = R"rawliteral(
    <!DOCTYPE html>
    <html>
    <head>
    ......
    </html>
    )rawliteral";

    Mój pierwszy działający przykład jest TU

    Przekazuje ją w całości klientowi, a potem to klient sobie podmienia zawartość przez Websockets. Można też ją przenieść do osobnego pliku projektu i wygodnie podmieniać na inną. Można też użyć w ESP po prostu pliku html wrzuconego na SPIFFS, wtedy strona może być w ogóle podzielona na osobne pliki. W załączniku gierka zrobiona na WWW wg kursu HTML kanału Youtube "Pasja informatyki", htm, css, js, grafiki, core ESP 2.5.0. ze SPIFFS osobno wrzuca się kod ESP i osobno zawartość dysku flash.
  • #15
    jaskol
    Level 12  
    kaczakat wrote:
    Ja mam stronę WWW zapisaną w pliku INO tak:
    Code:
    WebSocketsServer webSocket = WebSocketsServer(81);
    

    static const char PROGMEM INDEX_HTML[] = R"rawliteral(
    <!DOCTYPE html>
    <html>
    <head>
    ......
    </html>
    )rawliteral";

    Mój pierwszy działający przykład jest TU

    Przekazuje ją w całości klientowi, a potem to klient sobie podmienia zawartość przez Websockets. Można też ją przenieść do osobnego pliku projektu i wygodnie podmieniać na inną. Można też użyć w ESP po prostu pliku html wrzuconego na SPIFFS, wtedy strona może być w ogóle podzielona na osobne pliki. W załączniku gierka zrobiona na WWW wg kursu HTML kanału Youtube "Pasja informatyki", htm, css, js, grafiki, core ESP 2.5.0. ze SPIFFS osobno wrzuca się kod ESP i osobno zawartość dysku flash.



    Dzięki, super, przejrzę, ale z metody wykorzystującej PROGMEM, czy w ogóle trzymanie tego w samym MCU (mówiąc w skrócie, bo system plików też jest przecież w tym samym flash-u), nie do końca mi pasuje, bo stronę WWW modyfikuję błyskawicznie, sprawdzam od razu jak wygląda i dopiero jak wszystko jest ok, to wrzucam ją do SPIFFS. Na dodatek w javascript generuje w pętli np. tabele z 20 wierszy, a tak naprawdę w pliku jest tylko kilka linijek i pętla "for". Pewnie, że w MCU tez by można, ale testowanie byłoby żmudne, wprowadzanie zmian też.
    Przez PROGMEM robię np. odpowiedzi do klienta, że coś się udało lub nie. Proste i powtarzalne rzeczy.
    Wdrożyłem pomysł ze zmiennymi w javascript i działa to wyśmienicie. Cała strona może być ogromna i wyglądać ładnie (z wykorzystaniem np. Bootstrap), a po załadowaniu HTML-a wkracza javascript i w locie podmienia zmienne, na wartości. Przejrzyste, szybkie, proste. Już przy tym pozostanę, ale dzięki za odzew, zajrze oczywiście z ciekawości do Twoich plików i postaram się wyłowić coś dla siebie ;)
    Teraz walczę z zapisywaniem struktur do EEPROM-u, bo o ile put i get mi do tej pory na pojedynczych zmiennych działało, o tyle jak zapisuje całe sruktury, to po odczycie nie mam tego, co zapisałem...ale jeszcze to "badam", bo może znowu być problem z zachodzącymi na siebie adresami i takie tam.
    A tak w ogóle, to jak już coś działa, to zaczynam odnajdować przyjemność w optymalizowaniu kodu i nagle się okazuje, że to tych wszystkich zmianach, pamięci wcale nie jest tak mało ;)

    Pozdrawiam,
    Mariusz
  • #17
    jaskol
    Level 12  
    kaczakat wrote:
    Tak do testów to strona WWW może być i na PC w pliku HTML, wystarczy tylko w niej zmienić linijkę na "websock = new WebSocket('ws://192.168.1.30:81/');" i dane wyświetla gadając z tym ESP o ip 30.


    Bedę testował, bo na pewno jest to idealne do wysyłanie w czasie rzeczywistym danych z czujników.
    Co od reszty, to tez przetestuje, bo póki co, w tej mojej wersji, wszystko działa, ale nie ukrywam, że powoli.
    Może z websockets byłoby szybciej, a to już może być kuszące....
    Czytam, oglądam, sprawdzam. Na pewno coś z tego wykorzystam ;)

    Dzięki,
    Mariusz