Recuperare tutti i parametri get dalla stringa user agent

Salve

Utilizzo la libreria Ethercard con l'enc 28j60 Non sono molto pratico. Sto facendo le prime prove ...

recupero la stringa UserAgent e la visualizzo, a scopo di debug, così:

Serial.print((char *)Ethernet::buffer+pos);

questo è il risultato tipico

GET /?md=2&ed=1 HTTP/1.1
Host: 192.168.1.208
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: it-IT,it;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://192.168.1.208/?md=2&ed=1
Connection: keep-alive
Upgrade-Insecure-Requests: 1

e fin qui tutto ok ..

secondo voi qual'è il sistema mgliore per recuperare il contenuto della prima riga GET

cioè dovrei separa i parametri passati nella stringa GET .... nel caso di sopra i parametri che mi servono sono md .... e ...... ed

cosa mi suggerite?? Grazie

paolosanna:
cosa mi suggerite??

… che se usi Webbino, ci pensa lui ;).

oppure strtok() (magari Webbino la usa) http://www.cplusplus.com/reference/cstring/strtok/

nid69ita:
oppure strtok() (magari Webbino la usa)
strtok - C++ Reference

Nid, nid … altro che il link a “cplusplus” … >:(

… basta il link alla libreria AVR libc, visto che è li dentro che si trovano le funzioni per manipolare le stringhe, modulo <string.h>, funzione strtok() :grin:

AVR libc è una libreria sempre inclusa e disponibile in Arduino e che contiene un’infinità di funzioni utili !!! :smiley:

Guglielmo

Grazie a tutti…

SukkoPera:
… che se usi Webbino, ci pensa lui ;).

Grazie sukko … ho provato a leggere velocemente il post (c’è molta roba) … ma non ho trovato indicazioni veloci su come traslitterare il codice già scritto per ethercard per webbino … ma se tu mi aiuti perchè no… provo senzaltro …

nid69ita:
oppure strtok() (magari Webbino la usa)
strtok - C++ Reference

gpb01:
Nid, nid … altro che il link a “cplusplus” … >:(

… etc…
Guglielmo

Ho capito che mi tocca lavorare con le strighe …l’ho fatto altre volte ma sicuramente ci vuole molto lavoro prima che funzioni …

@sukko
E facile trascrivere questo codice per adattarlo a webbino???

  bfill.emit_p(PSTR(
  "HTTP/1.0 503 test page"
  "Content-Type: text/html\r\nPragma: no-cache\r\n\r\n"
     "<html><head><title>COR test page</title></head>\n"
     "<body style='background-color:rgb(255,255,255);'>\n"
         "<h2 style='text-align: center;'><span style='color: rgb(153, 23, 128);'>COR test page</span></h2>\n"

          "<table>\n"
          "<tr><td> Mode: $D </td><td><a href='\?cod=up'> up </a></td><td><a href='\?cod=dw'> down </a></td></tr>\n" 
          "</table>\n" 

          "<table border='1'>\n"
          "<tr bgcolor='#ACFF78'><td></td><td>sql</td><td>ptt</td><td>rit</td><td>blocco 1</td><td>blocco 2</td><td>blocco 3</td><td></td></tr>\n" 
          //                                     sql        ptt        rit        az1        az2        az3
          "<tr><td  bgcolor='#A0bb78'>1</td> <td>$S</td><td>$S</td><td>$S</td><td>$S</td><td>$S</td><td>$S</td><td><a href='\?md=$D&ed=1'> edit </a></td></tr>\n" 
          "<tr><td  bgcolor='#A0bb78'>2</td> <td>$S</td><td>$S</td><td>$S</td><td>$S</td><td>$S</td><td>$S</td><td><a href='\?md=$D&ed=2'> edit </a></td></tr>\n" 
          "<tr><td  bgcolor='#A0bb78'>3</td> <td>$S</td><td>$S</td><td>$S</td><td>$S</td><td>$S</td><td>$S</td><td><a href='\?md=$D&ed=3'> edit </a></td></tr>\n" 
          "</table>\n"   
                      
      "</body>\n</html>"),
       repeaterMode,
       riga[0].sql, riga[0].ptt, riga[0].rit, riga[0].az1, riga[0].az2, riga[0].az3, repeaterMode,
       riga[1].sql, riga[1].ptt, riga[1].rit, riga[1].az1, riga[1].az2, riga[1].az3, repeaterMode,
       riga[2].sql, riga[2].ptt, riga[2].rit, riga[2].az1, riga[2].az2, riga[2].az3, repeaterMode
     );

E’ la parte che costruisce la pagina, usando anche le variabili, da inviare poi al client …
attendo nuove …
saluti

paolosanna: ... Ho capito che mi tocca lavorare con le strighe ...l'ho fatto altre volte ma sicuramente ci vuole molto lavoro prima che funzioni ....

... la strtok() è di uso banale e dal funzionamento assicurato ! E' la normale funzione che si usa per fare il parsing di stringhe ;)

Guglielmo

Webbino nasce dalla constatazione che, nonappena le pagine HTML si complicano un minimo (e basta davvero molto poco!), gestirle come stai facendo tu, ovvero incorporandole direttamente nel codice, è estremamente scomodo e inutilmente complesso, come immagino ti starai accorgendo da solo.

Per questo, in Webbino la pagina HTML e il codice sono completamente separati. La prima la realizzi come vuoi, e salvi come file HTML.

Poi devi scegliere se mettere le pagine che hai creato su una SD, oppure includerle nel codice. Se non hai problemi di flash piena, non c'è motivo per scomodare una SD.

Quindi devi gestire i contenuti dinamici, ossia quelle parti della pagina che devono essere "riempite" da Arduino ad ogni caricamento. Webbino identifica queste parti della pagina tramite i "tag", ossia stringhe tipo #TEMPERATURA#, racchiuse tra cancelletti, che hai inserito nella pagina. La scrittura di uno sketch con Webbino consiste essenzialmente nell'associazione di ogni tag ad una funzione, che verrà chiamata automaticamente, e il cui valore di ritorno andrà a sostituire il tag.

Vedi tu quanto ti sembra fattibile ;).

@sukko

cosa devo installare per webbino: webbino.h webbino_config.h ....

eppoi?

c'è qualche istruzione in italiano ???

Basta installarlo dal LIbrary Manager e guardare gli esempi inclusi!

installato. ... sperimentando ..... :o

dove si definisce l’interfaccia??? …

scusa ma io sono un newbie…

mi da questo errore senza aver toccato nulla sull’esempio caricato …

Arduino:1.6.7 (Windows 7), Scheda:"Arduino/Genuino Uno"

In file included from C:\Users\Admin\Documents\Arduino\libraries\Webbino\src/Webbino.h:21:0,

                 from C:\Users\Admin\Documents\Arduino\libraries\Webbino\examples\ReplacementTags\ReplacementTags.ino:20:

C:\Users\Admin\Documents\Arduino\libraries\Webbino\src/WebbinoCore/WebServer.h:28:21: fatal error: PString.h: No such file or directory

 #include <PString.h>

                     ^

compilation terminated.

exit status 1
Errore durante la compilazione

  Questo report potrebbe essere più ricco di informazioni con
  "Mostra un output dettagliato durante la compilazione"
  abilitato in "File > Impostazioni"

Devi installare anche la libreria PString.

Dai anche un'occhiata a webbino_config.h nella directory della libreria, dovrai abilitare l'ENC, di default è configurata per l'Ethernet shield ufficiale.

@sukko
Ok … funge …

ma ho bisogno di info …

La pagina la costruisco così …

const char index_html[] PROGMEM = {
	"HTTP/1.0 503 test page"
  "Content-Type: text/html\r\nPragma: no-cache\r\n\r\n"
     "<html><head><title>COR test page</title></head>\n"
     "<body style='background-color:rgb(255,255,255);'>\n"
         "<h2 style='text-align: center;'><span style='color: rgb(153, 23, 128);'>COR test page</span></h2>\n"
          "<table>\n"
          "<tr><td> Mode: </td><td><a href='\?cod=up'> up </a></td><td><a href='\?cod=dw'> down </a></td></tr>\n" 
          "</table>\n" 

          "<table border='1'>\n"
          "<tr bgcolor='#ACFF78'><td></td><td>sql</td><td>ptt</td><td>rit</td><td>blocco 1</td><td>blocco 2</td><td>blocco 3</td><td></td></tr>\n" 
          "</table>\n"   
      "</body>\n</html>"
};

pero la prima riga viene visualizzata così comè… in particolare mi serve che venga trasmesso il “no-cache” … insomma non mi deve stampare sul client web questo:

HTTP/1.0 503 test pageContent-Type: text/html Pragma: no-cache

poi dovrei inserire tutte queste variabili tabellate

       repeaterMode,
       riga[0].sql, riga[0].ptt, riga[0].rit, riga[0].az1, riga[0].az2, riga[0].az3, repeaterMode,
       riga[1].sql, riga[1].ptt, riga[1].rit, riga[1].az1, riga[1].az2, riga[1].az3, repeaterMode,
       riga[2].sql, riga[2].ptt, riga[2].rit, riga[2].az1, riga[2].az2, riga[2].az3, repeaterMode

come faccio???

poi … come faccio ad inserire un controllo che invii la risposta al client solo se cè una richiesta??
insomma qui webserver.loop ();
dovrebbe esserci una condizione che gira il controllo al web server solo se arriva una richiesta http …??..

scusa sukko … spero di non essere troppo pesante …

La risposta è gestita automaticamente da Webbino, non ci devi pensare tu. Idealmente tu dovresti solo pensare a disegnare le pagine web e a riempirle di contenuti, tutto il resto è affare della libreria.

MI duole però informarti che il No-Cache al momento non c’è modo di aggiungerlo :(.

Salve

... ho risolto così:

if (getIntArg(data, "mn")){ mn = getIntArg(data, "mn");}
if (getIntArg(data, "az")){ az = getIntArg(data, "az");}
if (getIntArg(data, "sb")){ sb = getIntArg(data, "sb");}

con questa funzione:

    static int getIntArg(const char* data, const char* key, int value =-1) {
    char temp[10];
    if (ether.findKeyVal(data + 6, temp, sizeof temp, key) > 0)
        value = atoi(temp);
    return value;
}

recupero sempre bene il valore passato (per esempio /?mn=3&az=6&sb=2) .. mi pare che funzioni bene... scopiazzato dagli esempi della libreria ethercard ..

adesso ho un'altro problema e metto un altro post ..

saluti