Pages: [1] 2 3 ... 5   Go Down
Author Topic: Ethernet.h e intercettare GET  (Read 3555 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 1
Posts: 166
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Arduino può facilmente collegarsi ad un sito internet e "leggerne" le pagine.
ma se questa pagina risiede  su Sd card?
file paginaSd.htm con un semplice form testo:
Code:
...
<form>
<input type="text" name="testo" value="">
</form>
...
1 dubbio ci vuole un action e se si cosa scrivere?
...  action="?nonso..?">    smiley-surprise

per lo Sketch
richiamare la pagina da sd card è abbastanza semplice non lo è
(almeno per me) intercettare il contenuto del form

ricevuto = get testo from paginaSd.htm
Serial.println(ricevuto);

per intenderci
quello che  in php è:
Code:
$ricevuto = $_GET['testo'];


Grazie Luca
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2755
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
Arduino può facilmente collegarsi ad un sito internet e "leggerne" le pagine.
e come? non ha ram sufficiente per scaricarla e scriverla in mem ... come lo fai?

Arduino è ingrado di collegarsi spontaneamente a un sito e inviare un dato a un php in ascolto. Normalmente è sempre un client remoto che lo fa per primo, gli fa la domanda attraverso la eth shield e poi lui risponde invianditi quello che vuoi. Nel tuo caso la index.htm
e aspetta che qualcuno gli faccia la domanda e poi risponde di conseguenza.

Quello che vorresti fare tu se ho capito bene è questo:

premessa:
nella sd c'e' una pagina statica html

-Ti colleghi tramite browser dal tuo pc remoto
-digiti http://192.168.1.100
- l'ip senza nulla a seguire viene interpretato come "mandami la pag iniziale index.htm"
- ora avendo la paginetta sul tuo browser remoto premendo i tastini invii le info ad arduino in metodo GET, POST se usi un jquery

« Last Edit: December 04, 2011, 01:08:58 pm by pablos71 » Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

Offline Offline
Full Member
***
Karma: 1
Posts: 166
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

premessa:
nella sd c'e' una pagina statica html

-Ti colleghi tramite browser dal tuo pc remoto
-digiti http://192.168.1.100/
- la / dopo l'ip puoi farla interpretare da arduino come "mandami la pag iniziale index.htm"
- ora avendo la paginetta sul tuo browser remoto premendo i tastini invii le info ad arduino in metodo GET,POST se usi un jquery

Ciao,
Io userei Arduino come Web  Server la pagina si trova su  Sdcard eg. paginaSd.htm
questa contiene un form con una casella testo.
 Vorrei che Arduino intercetti quanto sritto nella casella testo
quindi lato client sul mio Browser e lo trasmetta sulla seriale semplicemente Serial.println(ricevuto);
Ma non so propio come fare forse usando GET ma ....
Spero di essermi speigato meglio
Ti ringrazio       
Luca
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2755
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

si, ho capito ..... modifico un esempio e te lo posto, mi ci vuole un pochino devo finire un lavoro e poi mi ci metto.

ciao
Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

Monselice PD Italy
Offline Offline
Faraday Member
**
Karma: 25
Posts: 5480
фон Крыса
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

si, ho capito ..... modifico un esempio e te lo posto, mi ci vuole un pochino devo finire un lavoro e poi mi ci metto.

ciao
Si si che voglio scoprire anche io di cosa parlate smiley
Logged

Se corri veloce come un fulmine, ti schianterai come un tuono.

Offline Offline
Full Member
***
Karma: 1
Posts: 166
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Si si che voglio scoprire anche io di cosa parlate smiley

[size=20pt]Davvero!![/size] allora se vuoi cercherò di spiegarmi meglio  smiley-confuse
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2755
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ti premetto che uso una libreria con tinywebserver quasi uguale a webduino, ma fare pagine statiche con queste librerie è uno spasso fai tutto quello che vuoi

sai programmare in javascript? e un po' di html? se si non hai limiti con questo webserver.

scarica qui  http://www.webweavertech.com/ovidiu/weblog/archives/000484.html  arduino-tinywebserver-20101230.zip.

prendi da questo zip solo
- il tintwebserver.h e il .ccp e piazzali nella directory library di arduino come fai con le altre
- il file jquery.js che è compresso e occupa poco spazio 71k, c'e' anche quella da 300k ma arduino ci mette tanto a passartela

quindi metti nella sd in root
jquery.js
la tua pagina.htm

e aspetta ancora un po' ehehehhehe  smiley-grin

Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

Monselice PD Italy
Offline Offline
Faraday Member
**
Karma: 25
Posts: 5480
фон Крыса
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

io conosco Js e html fa proprio per me la cosa XDXD
llluca non intendevo dire che tiu spieghi male ma solo sottolineare che sono ignorante sull'argomento smiley
Logged

Se corri veloce come un fulmine, ti schianterai come un tuono.

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2755
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

eccomi ... dunque ho dovuto semplificare e testare......

Un ringraziamento va a questo tipo Ovidiu Predescu's, a me sconosciuto che ha pubblicato il suo lavoro e mi ha permesso di studiarlo e modificarlo facendomi spaccare la crapa tutte le sere per 1 mese!!.

oltre a questi 2 code postati qui sotto nella SD vi ricordo che ci va
jquery.js  possibilmente in formato compresso  http://docs.jquery.com/Downloading_jQuery io uso la 1.4.2 Minified abbastanza piccola e completa per quello che mi serve, le versioni successive non sempre servono per eliminare bug, ma per aggiungere funzionalità più complesse. Si tenga presente che quando ci colleghiamo ad arduino esso ci invia la index.htm e successivamente i file test.js e jquery.js richiedendo un po' di tempo direttamente proporzionale alle loro dimensioni.
in queste 2 righe dell'INDEX.HTM:
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="test.js"></script>  
Molti sviluppatori preferiscono caricarla fornendo il link internet della jquery e scaricarla da internet sul momento, a me non piace perchè se il link è momentaneamente sospeso arduino diventa inutile "non è più indipendente", ho 2 Gb di card !!

non dimenticate la libreria TinyWebServer.h l'ho scritto qualche post più in su da mettere dentro library di arduino 0022 o 0023

in questo esempio inviate stringhe ad arduino da web, e arduino risponde rinviandovi quello che avete mandato.
Ma nella risposta potete mettere quello che volete ad esempio lo status delle porte analog o digitali ecc

- Il # chiude la stringa e chiude il ciclo for nella lettura dei caratteri in  client.read(), cercare lo "\n" non funziona perche non esiste un a capo nell'invio da inputtext
-  ho messo  Serial.begin(9600); per vedere cosa accade nello scambio di dati come debug, ma toglierlo aumenta la velocità del 100%
- importante: le porte 4-10 non devono essere usate!

NB. la rottura è che ogni volta che modificate lo sketch dovete resettare la eth shield altrimenti non si connette""
Resettare mentre mozzilla sta girando a cercare l'ip di arduino incasinate solo la eth shield e non parte
Per informazioni comporre 800.123.456 smiley chiedete pure

File nominato   test.js  che va nella SD!!
Code:
var dato;
var msg="";
var ind= "/Istruzioni_da_web";

function elabora_dato()
{
    var testo=document.form1.testo3.value;
    dato= testo+"#";
    invia_dati (dato);
    document.form1.testo3.value  = ""; //pulisce la casella di input text  
}
 
function invia_dati (dato)
{
        if(msg=="Connessione.....#")
        {
          document.form1.areatesto.value  += "Connessione ad Arduino Attendere ......\n\n";
          dato=msg;        
}
     
  document.form1.areatesto.value  += "Inviato ad Arduino POST >> URL = "+ ind + ">> " + dato + "\n";    
  $.ajax({type: "POST", data: dato, dataType: "text", cache: false, url: ind,
   
      success: function(risposta)
      {
        msg="";              
        document.form1.areatesto.value  += risposta + "\n";
      },
   error: function()
      {
      document.form1.areatesto.value  += "Invio fallito!\n";
      }
   });
};

$(document).ready(
    function(){
    msg="Connessione.....#";
    invia_dati("/Istruzioni_da_web");
    });


File da nominare assolutamente index.htm che va nella SD!
Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
                                                            
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="test.js"></script>    
        
    <title>Web Port control</title>
  </head>
  <body>

    <form name="form1">

<textarea cols="100" rows="20" id="textareaname" name="areatesto">
Testo ERRORI - RESPONSE - COMANDI
</textarea>
      
    <p>comandi da INVIARE ad Arduino (Metodo POST -> max 30 caratteri)</p>
    <p><input type="text" SIZE=90 MAXLENGTH=30 name="testo3" id="testo3" >
    <input type="button" value="Invia > Arduino" id="invia"  onclick="elabora_dato()">  </p>
    
  </form>
  </body>
</html>


E' anche possibile volendo mettere il contenuto del test.js direttamente dentro a HEAD della pagina index.htm..... in questo modo

<head>
<script type="text/javascript">

cpiare qui codice contenuto in test.js

</script>
</head>

Questa seconda opzione obbliga l'eliminazione della linea  <script type="text/javascript" src="test.js"></script> in index.htm

sketch.pde
Code:
#include <SPI.h>
#include <Ethernet.h>
#include <Flash.h>
#include <SdFat.h>
#include <TinyWebServer.h>

Sd2Card card;
SdVolume volume;
SdFile root;
SdFile file;
String readString;
String web_comando;
int b;
int char_pos_a=0;

static uint8_t mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 2, 177 };
Server server(80);
 
TinyWebServer::PathHandler handlers[] =
{
  {"/", TinyWebServer::GET, &index_handler },
  {"/Istruzioni_da_web", TinyWebServer::POST, &istruzioni_da_web},
  {"/" "*", TinyWebServer::GET, &file_handler },
  {NULL},
};
    
const char* headers[] = {"Content-Length", NULL};
TinyWebServer web = TinyWebServer(handlers, headers);

boolean index_handler(TinyWebServer& web_server)
{
  send_file_name(web_server, "INDEX.HTM");
  return true;
}

boolean file_handler(TinyWebServer& web_server)
{
  char* filename = TinyWebServer::get_file_from_path(web_server.get_path());
  send_file_name(web_server, filename);
  free(filename);
  return true;
}

void send_file_name(TinyWebServer& web_server, const char* filename)
{
  if (!filename)
  {
    web_server.send_error_code(404);
    web_server << F("Could not parse URL");
  }
  else
  {
    TinyWebServer::MimeType mime_type = TinyWebServer::get_mime_type_from_filename(filename);
    web_server.send_error_code(200);
    web_server.send_content_type(mime_type);
    web_server.end_headers();
    if (file.open(&root, filename, O_READ))
    {
      Serial.println(filename);
      web_server.send_file(file);
      file.close();
    } else {
      web_server << F("Could not find file: ") << filename << "\n";      
    }
  }
}

//-------------------questo pezzo riceve stringhe da web con metodo post e risponde-----------------
boolean istruzioni_da_web(TinyWebServer& web_server)
{
  web_server.send_error_code(200);
  web_server.send_content_type("text/plain");
  web_server.end_headers();
   Client& client = web_server.get_client();
  
          if (client.available())
          {
            for(b = 0; b <= 30 ; b++)
            {
              //qui in fase test limito 30 caratteti
              char c = (char)client.read();
              readString.concat(c);
              if(c=='#') b=30;  
            }
          }
          
    char_pos_a = readString.indexOf("#");
    web_comando = readString.substring(0,char_pos_a);    
          
            Serial.println("---------------ecco la riga che hai immesso da web ----------->>  " + String(web_comando)  );
            client.println("Risposta di Arduino...mi hai inviato:    " + String(web_comando));
            
  
 readString=""; //svuota la stringa del client.read        
 delay(1);
  client.flush();
 client.stop();  
  
}
//----------------------------------------------------------------------------------------

void setup()
{
 Serial.begin(9600);
 pinMode(10, OUTPUT); // set the SS pin as an output (necessary!)
 digitalWrite(10, HIGH);
 card.init(SPI_FULL_SPEED, 4);
 volume.init(&card);
 root.openRoot(&volume);
 Ethernet.begin(mac, ip);
 web.begin();
 delay (2000);
}

void loop()
{
 web.process();
    delay (1);
}  
resettare tutto e provare!
« Last Edit: December 03, 2011, 10:16:43 am by pablos71 » Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

Offline Offline
Full Member
***
Karma: 1
Posts: 166
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

WOW ...

Fantastico

Anche se tu hai
< smiley >  Organizzato un numero verde per aiuti Se questo risultasse  occupato < / smiley >
 Posso comunque usare questo forum per dubbi o delucidazioni?
Mi piace  il fatto che tu abbia separato il file test.js  
Grazie

Luca
« Last Edit: December 03, 2011, 04:52:09 am by llluca » Logged

Monselice PD Italy
Offline Offline
Faraday Member
**
Karma: 25
Posts: 5480
фон Крыса
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

+1 per il WOW
davvero ora mi meto a lavoro smileysmileysmileysmiley
Logged

Se corri veloce come un fulmine, ti schianterai come un tuono.

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2755
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@lluca, visto che parlavi di php, tu hai un Hosting Web su un server da qualche parte?
ciao
Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2755
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok, il prossimo post sarà far diventare questo esempio in un webserver persistente, ovvero vedremo in "tempo reale" sul browser ciò che accade in arduino con aggiornamento continuo e automatico sulla stessa pagina . Magari con delle

- progressbar per vedere variare i valori analogici
- dei quadratini che cambiano colore in base allo stato delle porte I/O digitali
- degli slider per variare le uscite 0-5v delle porte digitali PWM
- caricare i file presenti nella sd modificarli e rispedirglieli ... su questo ci sto ancora lavorando e ho qualche difficoltà)

(la pagina web non fa un reload, ma legge solo i dati)

ma se lo avete già fatto ditelo così non mi sbatto a fare modifiche smiley smiley

ciao  
« Last Edit: December 03, 2011, 06:09:41 pm by pablos71 » Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

Monselice PD Italy
Offline Offline
Faraday Member
**
Karma: 25
Posts: 5480
фон Крыса
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sto provando ad implementare il reload in una mia pagina js che non ha nulla a che fare con arduino ma mi pare un poco ostica come la cosa ma se riesco ti do il pezzo di codice...
Logged

Se corri veloce come un fulmine, ti schianterai come un tuono.

Offline Offline
Full Member
***
Karma: 1
Posts: 166
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quanto hai fatto per me è molto complesso per ora ho
tre domande per capire se sono sulla strada giusta:
nello sketch:

leggo quello che mi arriva  dal client:

Code:
   char c = (char)client.read();
              readString.concat(c);

che si trovano nella libreria  Ethernet.h

ma perchè usi

Code:
boolean index_handler(TinyWebServer& web_server)
{
  send_file_name(web_server, "INDEX.HTM");
  return true;
}
usando appunto la TinyWebServer.h

se invece usassi la SD.h

 htmlFile = SD.open("index.htm");
....

quali vantaggi porta?


poi lato web devo capire come funziona  jQuery.post()

 $.ajax({type: "POST", data: dato, dataType: "text", cache: false, url: ind,


...

non capisco  url: ind, cioè "/Istruzioni_da_web";
e non un indirizzo?

Ti ringrazio per il tempo e la pazienza che mi dedichi e
Sepro di aver espresso correttaemnte i imiei dubbi da Newbie


Luca


Logged

Pages: [1] 2 3 ... 5   Go Up
Jump to: