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

ESP01, GCC, Eclipse – jak wygodnie przesłać rozbudowany HTML z wieloma cudzysłowami?

zbynio_k 06 Maj 2025 15:57 792 12
REKLAMA
  • #1 21541069
    zbynio_k
    Poziom 10  
    Posty: 169
    Ocena: 2
    Witam.
    Programuję w gcc na Eclipsie.
    Postawiłem web serwer na ESP01, mniemam, że kompletny.
    Potrafię wysłać dane na stronkę, do przeglądarki, przez funkcję
    websocket_write_all(buf, strlen(buf), WEBSOCKET_TEXT);

    jako kod HTML strony jest zdefiniowane
    #define HTML_INDEX_PAGE wysyłane funkcją
    http_send_string(con, HTML_INDEX_PAGE, "text/html");

    Problem pojawia się gdy chcę zdefiniować HTML_INDEX_PAGE jako kod bardziej rozbudowanej stronki, w kodzie jest mnóstwo cudzysłowów co skutecznie uniemożliwia mi zdefiniowanie kodu HTML jako stringa.

    Proszę o podpowiedź, jak mam przesłać rozbudowany kod HTML do przeglądarki.
    Załączam screenshot'y oraz szczegóły / ciała funkcji w załączniku.
    Pozdrawiam

    edit - przykładów dla Arduino IDE są tony w necie.
    edit2 - kod na ESP w NOTA i NONOS, ważne !

    Zrzut ekranu z przeglądarki przedstawiający prostą stronę HTML generowaną przez ESP01, z komunikatami po polsku na temat połączenia z websocket i listą liczników oraz czasów.
    Zrzut ekranu strony WWW do testowania wysyłania i odbierania danych na Wemos-D1 mini PRO z przyciskami DIRECT-1 i DIRECT-2 oraz polami wyboru.
    Załączniki:
    • załącznik.txt (1.55 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #2 21541115
    JacekCz
    Poziom 42  
    Posty: 8670
    Pomógł: 760
    Ocena: 1462
    Chaos. Zupełnie nie rozumiem co chcesz.

    #define nie jest (choć wiem że głupie przykłady małpio kopiowane to preferują) najlepszych środkiem definiowania stałych czy zmiennych

    A już #define w #define to nie może sie dobrze skończyc

    Gdzie ten rzekomo dojrzały webserwer, skoro nadal patrzysz strasznie niskopoziomowo i z dumą stukasz kod, jakby go nie było?
    Mityczny webserwer ma właśnie od takich bzdur uwolnić, i ma to udokumentowane dla użytkownika
  • REKLAMA
  • #3 21541122
    zbynio_k
    Poziom 10  
    Posty: 169
    Ocena: 2
    1. niskopoziomowo bo kod web serwera jest w gcc
    2. tekst HTML akurat w przykładowo jako #define - nie widzę problemu

    w jednym zdaniu > jak wysłać kod strony w HTML do przeglądarki jako STRING ?
  • #4 21541133
    JacekCz
    Poziom 42  
    Posty: 8670
    Pomógł: 760
    Ocena: 1462
    zbynio_k napisał:
    w jednym zdaniu > jak wysłać kod strony w HTML do przeglądarki jako STRING ?


    W jednym zdaniu: wysyłasz prawidłowo (zakładajac że nie ma tam \0, ale chyba nie).

    Tylko nie rozumiesz czym jest C-string sam w sobie (dowolna sekwencja znaków aż do \0 ) , a czym od niego się różni literał stringowy (zapis stałej w języku)
    Niestety, programowanie JEST PEŁNE zróżnicowanych abstrakcji, i robiąc coś bardziej skomplikowanego a nie odróżniając mamy problem.

    zbynio_k napisał:
    kod web serwera jest w gcc

    Daj linka, bo nie znam

    Dodano po 27 [minuty]:

    zbynio_k napisał:
    #define - nie widzę problemu


    A ja widziałem wiele problemów
  • #5 21541179
    zbynio_k
    Poziom 10  
    Posty: 169
    Ocena: 2
    postaram się być mniej chaotyczny, bardziej rzeczowy

    1. może nie jestem super biegły w języku C(gcc) ale zawsze definiowałem zmienną tekstową ASCII tak
    uint8_t *nazwa ={"ESP_MASTER"}; lub
    uint8_t nazwa ={"ESP_MASTER"};
    ew. char zamiast uint8_t

    i akurat z takim ciągiem znaków ASCII niema problemu

    2. w przykładowej stronie, ESP wysyła ciąg ASCII

    "<!DOCTYPE HTML><html><head>OK > jest TU: #define HTML_INDEX_PAGE</head><body><div style='width: 400px; height: 800px; overflow:auto;' id='wdata'></div><script src='websocket_test.js'></script></body></html>"
    temat więc prosty,

    3. ja chcę wysłać do przeglądarki kod HTML strony (w załączeniu) i wydaje mi się, że tym sposobem nie jest to możliwe

    4. link do "postawionego" web serwera
    https://github.com/zyperpl/esp8266-websocket-server

    Tak w ogóle to programuję AVR'y a w ESP dopiero wchodzę
    ale zrobiłem parę działających projektów
    zegary różnej maści z synchronizacją czasu po NTP, stacje pogodowe, komunikację po esp_now ...

    edit - może podpowiesz jak to zrobić
    Załączniki:
    • page3.rar (1.78 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #7 21541238
    zbynio_k
    Poziom 10  
    Posty: 169
    Ocena: 2
    na razie dzięki
    widzę, że wysłanie kodu html do przeglądarki nie jest takie proste
    chyba, że istnieje inna metoda niż wysyłanie ciągu ASCII ?
  • REKLAMA
  • #8 21541385
    miszczo997
    Poziom 28  
    Posty: 1052
    Pomógł: 134
    Ocena: 159
    Użyj makefsdata, który wygeneruje Ci tablice z Twojej paczki plików na serwer.
    Tak to mniej więcej wygląda
    https://github.com/plawnik/stm32f407_live_chart/tree/main/socket_test/LWIP/App
    W www znajdują się pliki, które mają zostać umieszczone na serwerze, plik fsdata_custom.c to system plików w postaci tablic.
    Jeżeli pracujesz na windowsie szukaj narzędzie makefsdata.exe, powinien być dostępny gdzieś z przykładami od ST. Będziesz też potrzebował jakieś dll, którą musisz umieścić w tym samym folderze co narzędzie, już nie pamiętam, która to dokładnie była, ale chyba coś od netframeworka - dostaniesz informację o brakującym pliku dll, gdy spróbujesz użyć narzędzia. Plik wynikowy dostaniesz po przeciągnięciu paczki plików serwera na plik exe.
    Jeżeli pracujesz na linuxie, dostępny jest skrypt perla makefsdata.pl, który bez problemu powinieneś uruchomić.
  • #9 21541395
    fred_onizuka
    Poziom 20  
    Posty: 291
    Pomógł: 42
    Ocena: 102
    W kodzie HTML, różne nietypowe znaki można zapisać w postaci kodów. Jest kilka wersji zapisu takich znaków, np. cudzysłów to "&_#_34_;" lub "&_quot_;" (musiałem dodać znaki podkreślenia "_", bo nie dało się ich tutaj inaczej zapisać).
  • Pomocny post
    #10 21541447
    miszczo997
    Poziom 28  
    Posty: 1052
    Pomógł: 134
    Ocena: 159
    Znalazłem swoje notki jak to zautomatyzować w eclipse na windowsie, przy każdej kompilacji zawartość folderu www będzie automatycznie generowana do pliku fsdata.c. Musisz sobie dostosować pod swój projekt, ja tego używałem z stm32.
    1. Project->properties->C/C++ Build->Settings->Build Steps->PreBuild steps->Command
    cmd /c "..\utils\makefsdata.bat"
    2. Copy makefsdata.exe to main project folder, add msvcr100d.dll if needed to this same location
    3. Make script in this same location ->makefsdata.bat
    SET "mypath=%~dp0"
    echo %mypath:~0,-1%
    "%mypath:~0,-1%\makefsdata.exe" "%mypath:~0,-1%\stronaWWW"
    move fsdata.c "%mypath:~0,-1%\Middlewares\Third_Party\LwIP\src\apps\httpd"
    4. Tune folders with source, and output file
  • #11 21541719
    JacekCz
    Poziom 42  
    Posty: 8670
    Pomógł: 760
    Ocena: 1462
    fred_onizuka napisał:
    cudzysłów to "&_#_34_;" lub "&_quot_;"



    Ciągle czekamy na mityczny kod serwera HTTP który jakoby jest zawarty w GCC. Takie przekodowania to elementarz.
    Chyba że to typowy kod arduinowy kopiowany od słabych programistów przez słabych programistów.

    ESP to już ma wystarczajaco mocy obliczeniowej, aby to zrobić bez dziwnych kompromisów, i intuicja mi mówi że istnieje w ekosystemie wysokiej jakości (tzn trzymajacy standardy) choć prosty serwer http

    Dodano po 12 [minuty]:

    zbynio_k napisał:
    wysłanie kodu html do przeglądarki


    Nawet samo określenie wpuszcza w mailny.
    To nie jest samoistna wysyłka, a DRUGA faza cyklu zapytanie-odpowiedź (request-response), i każdy jakościowy serwer HTTP zrobi to dobrze (łącznie z pierwszą)
  • #12 21544559
    zbynio_k
    Poziom 10  
    Posty: 169
    Ocena: 2
    dzięki, używam eclipse z 03.25 i niema tam tych opcji, które pokazałeś
    1. Project->properties->C/C++ Build->Settings->Build Steps->PreBuild steps->Command
    nie mogę też znaleźć w necie pliku makefsdata.exe

    ale Twoja podpowiedź naprowadziła mnie na trop > można konwertować np. online tekst HTML do tablicy HEX

    wyświetliłem tą tablicę i ... działa
    nie tak jakbym chciał bo przesyłam jako zwykły tekst
    popróbuję przesłać jako
    http_send_string(con, HTML_INDEX_PAGE, "text/html");

    pozdro
  • #13 21544649
    miszczo997
    Poziom 28  
    Posty: 1052
    Pomógł: 134
    Ocena: 159
    zbynio_k napisał:
    dzięki, używam eclipse z 03.25 i niema tam tych opcji, które pokazałeś
    1. Project->properties->C/C++ Build->Settings->Build Steps->PreBuild steps->Command

    Gdzieś na 100% musi być w opcjach, poszukaj. Jak nie to możesz to ręcznie odpalać zawsze przeciągając paczkę plików na makefsdata

    zbynio_k napisał:
    nie mogę też znaleźć w necie pliku makefsdata.exe

    https://github.com/DuinOS/FreeRTOS/tree/maste.../httpserver_raw_from_lwIP_download/makefsdata

    zbynio_k napisał:
    wyświetliłem tą tablicę i ... działa
    nie tak jakbym chciał bo przesyłam jako zwykły tekst
    popróbuję przesłać jako
    http_send_string(con, HTML_INDEX_PAGE, "text/html");


    Potrzebujesz dodać nagłówki plus content type na początku tablicy którą utworzyłeś. Przejrzyj ten przykład z githuba który wysłałem, rzeczywista strona zaczyna się od komentarza raw data, wcześniej masz wszystkie dodatkowe dane które muszą być wysłane wcześniej, które możesz sobie skopiować do swojej tablicy dla testu.
    Jak uruchomisz makefsdata to będzie generowane automatycznie.

Podsumowanie tematu

✨ Dyskusja dotyczy problemu wygodnego przesyłania rozbudowanego kodu HTML zawierającego wiele cudzysłowów z mikrokontrolera ESP01 (ESP8266) do przeglądarki, programowanego w GCC na Eclipse. Autor stosuje definicję strony HTML jako makro #define, co powoduje trudności z poprawnym zapisem złożonych ciągów znaków zawierających cudzysłowy. Poruszono kwestie różnicy między literałami łańcuchowymi w C a ciągami znaków oraz ograniczeń związanych z ręcznym definiowaniem dużych stron HTML w kodzie źródłowym. Zaproponowano użycie narzędzia makefsdata, które konwertuje pliki HTML i zasoby do tablic bajtów w formacie odpowiednim dla serwera HTTP działającego na ESP, co pozwala na łatwe zarządzanie i przesyłanie złożonych stron. Wskazano także na możliwość automatyzacji procesu generowania pliku fsdata.c w Eclipse poprzez prebuild scripts. Alternatywnie, zasugerowano kodowanie znaków specjalnych w HTML za pomocą encji (np. "). Podkreślono, że ESP ma wystarczającą moc obliczeniową, aby obsłużyć takie rozwiązania bez kompromisów. Dyskusja zawierała linki do repozytoriów i przykładów implementacji serwera HTTP z wykorzystaniem makefsdata oraz wskazówki dotyczące konfiguracji środowiska i narzędzi na Windows i Linux.
REKLAMA