due web server differenti-uguali !

Salve a tutti
sulla base di quanto sto imparando e dando ormai la dovuta importanza al discorso "garbage collector", sto cercando, con non poca fatica - ma con grande determinazione mentale - di non usare String all'interno dei miei sketches.

Debbo costruire un web server (su esp32) : ho dato una guglata in giro ed è pieno zeppo di esempi (tutti uguali, praticamente)
Tutti, tranne uno, usano String.

Nello specifico, tutti usano questo gruppo di istruzioni quando debbono controllare l'arrivo di una info dal client

void loop(){
 WiFiClient client = server.available();
 
  if (client) {
    Serial.println("New Client.");
    String currentLine = "";
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        if (c == '\n') {
 
          if (currentLine.length() == 0) {
            client.println("HTTP/1.1 200 OK");
    .................

La mosca bianca in proposito usa questo pezzo di codice differente

void loop() 
{
  WiFiClient client = server.available();
  if (client) 
  {
    Serial.println("New client");
    memset(linebuf,0,sizeof(linebuf));
    charcount=0;
    boolean currentLineIsBlank = true;
    while (client.connected()) 
    {
      if (client.available()) 
      {
        char c = client.read();
        Serial.write(c);
        linebuf[charcount]=c;
        if (charcount<sizeof(linebuf)-1) charcount++;
 
        if (c == '\n' && currentLineIsBlank) 
        {
          client.println("HTTP/1.1 200 OK");
...............

Cioè utilizza memset
la domanda: è questo il metodo corretto o esistono altri criteri per fare in modo che non si crei zozzeria inutile all'interno della memoria ?
Come sempre chiedo, a chi già ci è passato, un eventuale link di riferimento.
Grazie infinite

memset() è una funzione che trovi in <string.h> che si trova in AVR libc (... libreria SEMPRE automaticamente presente quando, con Arduino, si compila per MCU AVR). E' un modo molto rapido di riempire un'area di memoria (tipicamente un array) tutta con lo stesso valore. Nel tuo esempio va a riempire l'array "linebuf" con il valore 0 (0x00), partendo dall'inizio, per un numero di bytes pari a "sizeof(linebuf)" ovvero alle dimensioni di "linebuf".

Se ben usato è il modo migliore e più veloce di azzerare completamente un array ... l'alternativa è scriversi un ciclo FOR che fa la stessa cosa carattere a carattere :slight_smile:

Guglielmo

Credo che il secondo pezzo citato
A parte variazioni sul tema
Sia la maniera migliore

Standardoil:
la maniera migliore

Secondo me invece, il modo migliore e più efficiente è definire in flash un array di byte "raw" che rappresenta la pagina in formato zip: utilizzo ai minimi termini della SRAM, caricamento veloce e reattivo (se è una paginetta non si percepisce differenza, ma con progetti complessi eccome!).

const uint32_t WEBPAGE_HTML_SIZE = 98034;
const char WEBPAGE_HTML[] PROGMEM = { 31,139,8,0,0,0,0,0,2,3,188,87,89,123,163,184,18,1................};

// Quando viene richiesta la pagina:
server.sendHeader(PSTR("Content-Encoding"), "gzip");
server.send_P(200, "text/html", WEBPAGE_HTML, WEBPAGE_HTML_SIZE);

Di sicuro però è quello meno "pratico" da sviluppare, nel senso che richiede di sviluppare la parte HTML + Javascript in separata sede e solo alla fine "inglobarla" nel firmware C++ finale del micro.

Questo approccio però consente di concentrarsi per bene su quegli aspetti che di solito si tende a tralasciare nei progetti Arduino: aspetto estetico della webpage e "responsiveness" (di solito le pagine HTML che si vedono nei tutorial sono proprio orribili).
In rete si trovano degli script python che a partire dal codice HTML "in chiaro" generano l'array gzip C like da importare nel firmware Arduino (di solito producono un file .h)

>fotosettore: ... scusa, ma ... invece di impazzire dietro alla gestione di un web server, perché non usi un'ottima libreria che fa già tutta da sola e ti concentri sul problema reale che devi risolvere/gestire?

Sto parlando di webbino, è sia in megatopic che su github dove l'autore, l'utente sukkopera di questo forum, ultimamente ha aggiunto anche tutto il WiKi di documentazione. La puoi installare dal "Library Manager" di Arduino ... mi raccomnado, in tal caso installa la versione 0.9.97 e non quella che ti viene proposta. Per capire come si usa, bisogna studiare gli esempi e leggere il suddetto Wiki :slight_smile:

Io ci ho fatto varie applicazioni anche con pagine piuttosto articolate, è multipiattaforma (ultimamente l'ho usata persino su Teensy 4.1 con la sua ethernet integrata) e ... capito come si usa, ti levi tutte le rotture di scatole della parte HTML e ti concentri sul problema vero e proprio :wink:

Guglielmo

Da github ...

• Compatible with many network interfaces:
◦ WizNet W5100: Original Ethernet Shield
◦ WizNet W5500: Ethernet Shield 2
◦ ENC28J60: KMTronic DINo (first version)
◦ Teensy 4.1 Native Ethernet
◦ WINC1500 (Wi-Fi): WiFi Shield 101, MKR1000 - EXPERIMENTAL, MIGHT NOT WORK!
◦ ESP8266 (Wi-Fi): Either as an add-on to Arduino, like the MLT shield, or standalone like NodeMCU, WeMos D1/D1 Mini, etc...
◦ ESP32 (Wi-Fi)
• HTML pages and other data can be embedded in the code. This avoids the need of an SD card for simple sites.
• If you prefer, HTML pages can also be stored on an SD card (long file names are supported!)
• Tags like $WHATEVER$ in HTML pages can be replaced at page request time, allowing the delivery of dynamic contents.
• Arbitrary functions can be associated to a page, to perform any needed actions: turn on LEDs, relays, save data to EEPROM, etc.
• Supports HTTP Basic Authentication.

Guglielmo

cotestatnt:
Secondo me invece, il modo migliore e più efficiente è definire in flash un array di byte "raw" che rappresenta...

Ma che c'entra?
Si parlava di 'ricevere'
Con o senza l'uso di oggetti String

fotosettore:
quando debbono controllare l'arrivo di una info dal client

Standardoil:
Si parlava di 'ricevere'

Mi era sfuggita "la particolarità" della richiesta... pensavo fosse più generica.

Comunque, se vuole fare un webserver prima o poi dovrà anche inviare immagino :smiley: 8)

In verità il problema iniziale era quello di non creare immondizia dentro la memoria dell'esp e quindi in pratica l'obiettivo principale sarebbe quello di non vedere "frizzato" il device per chissà quale motivo, con conseguente perdita di credibilità sulla giusta realizzazione del software-hardware del device stesso.
Che poi questo obiettivo "costi" lacrime e sangue nel suo raggiungimento poco mi interessa. Finora i pochi mini webserver che ho fatto li ho costruiti a suon di codice a manina e copia-incolla di html fatti con frontpage, in modo da avere in un solo pezzo di codice anche gli eventuali css e script di varia natura.
Ha sempre funzionato tutto. Certo ... paginette misere graficamente, ma assolutamente funzionali.

Nel caso di questo post, il problema principale si moltiplica alla n perchè l'utente userebbe spesso il web server (e non di rado come finora mi è successo) con conseguente accumulo di "monnezza".

Di certo debbo anche inviare ma non era la mia preoccupazione principale.

Proverò il tool di succopera, anche se il wiki dice le stesse cose della homepage.
Occorre provare gli esempi, come consigliato.

fotosettore:
... anche se il wiki dice le stesse cose della homepage.

Ahi, ahi, ahi ... letto con disattenzione ... sulla destra c'è l'indice alle varie pagine ... dove c'è mooooolto di più ! :smiling_imp:

Guglielmo

Ahi, ahi, ahi ... letto con disattenzione ...

siamo arrivati a milioni di kilolitri di birra da offrire qui, ::slight_smile:

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.