Loading...
Pages: [1] 2 3 4   Go Down
Author Topic: Funzione GET x prendere valori dall'url di una pagina HTML  (Read 1049 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 39
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao Ragazzi,
ho nella SD di arduino un file index.htm.
Quando clicco nel pulsante salva della pagina htm, mi riporta nell'url tutti i parametri precedentemente impostati nella pagina stessa.
Tramite arduino dovrei andare a prendere questi dati nell'url della pagina html.
Come posso fare??
Negli esempi in internet ho visto che si usano server, ma questo non è un sito internet, è una pagina html nella SD

Grazie mille ragazzi
Confido in voi!!!!
Logged

Offline Offline
Jr. Member
**
Karma: 1
Posts: 74
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Guarda io ho fatto cosi..... ti posto quello che devi scrivere nel file HTM e quello che devi scrivere nello sketch per recuperare i parametri.

su Htm <form  method='get'><input  name='accendi5' type='submit' value='ON/OFF'></form>
su sketch es
Code:
if (query.indexOf("accendi37") > 0) {
            digitalWrite(37,HIGH);}

spero ti sia di aiuto.
Logged

Offline Offline
Jr. Member
**
Karma: 1
Posts: 74
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ah scusa naturalmente devi avere in tutti i punti la stessa numerazione....
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 39
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

scusa query.indexof    cosa fa????   ....mi daresti un po' più di codice che non riesco a capire??? grazie mille
Logged

Offline Offline
Jr. Member
**
Karma: 1
Posts: 74
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

query.indexOf non fa altro che recuperare la stringa che tu invii dal url...
Ovvero mettiamo che l'indirizzo della tua macchina sia http://192.168.2.179/?accendi5=ON l'ultima parte dopo il punto interrogativo verrà elaborata e prelevata da query.indexOf che accenderà il tuo led o altro
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 39
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho capito.....così però posso lavorarare solo con un paramentro per volta, oppure madare n parametri nell'url???
Cioè ti spiego....
quando schiacci SALVA, nel mio Url dovrei mandare più parametri in un sol colpo, e dovrei prenderli tutti tramite arduino.
Questo si può fare con il metodo sopra descritto??
Logged

Genova
Offline Offline
Edison Member
*
Karma: 14
Posts: 2442
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho capito.....così però posso lavorarare solo con un paramentro per volta, oppure madare n parametri nell'url???
Cioè ti spiego....
quando schiacci SALVA, nel mio Url dovrei mandare più parametri in un sol colpo, e dovrei prenderli tutti tramite arduino.
Questo si può fare con il metodo sopra descritto??
La cosa più logica per avere una quantità alta di dati nella get sarebbe mandare per es:
 http://192.168.2.179/?122,145,163,blabla,40,12,5,184,74,245,140,215,19 e farne poi lo split della ',' il tutto te lo ritroverai in una array
split[0] ci sarà 122
split[1] ci sarà 145
split[2] ci sarà 163
split[3] ci sarà blabla
...
...
split[12] ci sarà 19

la ',' è solo un simbolo usato come separatore, se servono numeri con la ',' si possono usare altri simboli a piacere ad es # o @ ecc

Es:  http://192.168.2.179/?122,14#145,45#163,74#blabla#40#12#5#184#74#245#140#215#19
« Last Edit: March 19, 2013, 04:29:22 am by pablos » Logged

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

Offline Offline
Newbie
*
Karma: 0
Posts: 39
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hai qualche codice per prenderci spunto???
Logged

Offline Offline
Jr. Member
**
Karma: 1
Posts: 74
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

si ma con get non hai solo 255 caratteri a disposizione da mandare?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 39
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

si ma mi bastano.......mi puoi mandare l'esempio???
Logged

Genova
Offline Offline
Edison Member
*
Karma: 14
Posts: 2442
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

si ma con get non hai solo 255 caratteri a disposizione da mandare?
nell'esempio sono meno di 60 char

non ho un esempio fatto su uno sketch, io lo split lo uso dalla parte client sul jquery-javascript con 8 byte vedo lo status di 70 pin, al massimo rispedisco verso il server 1 byte che ne gestisce 8 alla volta per mia comodità, ma nessuno mi impedisce di mandarne di più, perchè dovrei mandarne di più? la paginetta web serve per la visualizzazione in realtime di quello che accade nel server, al massimo quando premo un tastino ne devo attivare uno mica 10 o 20.

se vuoi controllare 8 pin in uno solo byte tramite http usa la manipolazione dei registri.
inviando per es:  http://192.168.2.179/?255 posso assegnare il valore 255 al PORTD e accenderli tutti ... valore 0 spegnerli tutti oppure valori intermedi che accendono e spengono dei led secondo logica binaria.

dipende tutto da cosa uno vuole fare e scegliere la strada migliore e meno complessa, anche con indexof puoi gestire più chiavi contenute nella stessa stringa get, puoi mettere anche dei simboli differenti che ne delimitano le parti
es  http://192.168.2.179/?255@blabla#125*540§ e usare questi simboli @#*§ come separatori.

Ripeto, se non si sa quale deve essere il risultato non si può dare una risposta adeguata, i metodi sono illimitati nel trattare le stringhe si costruiscono si spediscono e si smontano

Se cerchi come usare lo split .... google "arduino split"

ciao
Logged

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

Offline Offline
Newbie
*
Karma: 0
Posts: 39
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Con tinywebserver è possibile prendere l'url e poi lavorarlo????
Logged

Genova
Offline Offline
Edison Member
*
Karma: 14
Posts: 2442
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Con tinywebserver è possibile prendere l'url e poi lavorarlo????
si, ma non lo fa solo quello

eccoti un esempio base presente anche nele cartelle dell'ide, ti ho aggiunto 2 pulsanti giusto per farti vedere il risultato dell'url sul serial.print
Code:
/*
  Web Server
 
 A simple web server that shows the value of the analog input pins.
 using an Arduino Wiznet Ethernet shield.
 
 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13
 * Analog inputs attached to pins A0 through A5 (optional)
 
 created 18 Dec 2009
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe
 
 */

#include <SPI.h>
#include <Ethernet.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,2, 177);

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);

void setup() {
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}


void loop() {
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
   String pacchetto;
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        pacchetto += (char)c;
        Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
                    // add a meta refresh tag, so the browser pulls again every 5 seconds:
          //client.println("<meta http-equiv=\"refresh\" content=\"5\">");
          // output the value of each analog input pin
          for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
            int sensorReading = analogRead(analogChannel);
            client.print("analog input ");
            client.print(analogChannel);
            client.print(" is ");
            client.print(sensorReading);
            client.println("<br />");          
          }
          client.println("</html>");
          client.print("<input type=\"button\" style=\"width:120px; height:80px\" value=\"On\" onclick =\" location.href='/?on_2'\">");
         client.print("<input type=\"button\" style=\"width:120px; height:80px\" value=\"Off\" onclick =\" location.href='/?off_2'\">");  
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
pacchetto="";
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disconnected");
  }
}

if (client.available()) {
        char c = client.read();
non si limita a leggere solo off_2 ma è un pacchtto con molte informazioni
- Tipo di richiesta GET,POST,PUT, ecc
- user-agent descrive il client che fa la richiesta, come vedi mi sono connesso con un windows nt6.1, windows a 64bit e il browser è Firefox
- accept ti descrive il content-type text/html
- language decodifiche ecc ecc
- se aggiungessimo i popup di autenticazione, qui dentro ci sarebbero anche le chiavi a base64 dell' username and passw

risultato nel serial dopo la pressione del tasto  da browser
Quote
server is at 192.168.2.177
new client
GET /?on_2 HTTP/1.1 >>>>>> GET attuale
Host: 192.168.2.177
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko/20100101 Firefox/19.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.2.177/?off_2 >>> GET precedente
Connection: keep-alive

client disconnected

scusa query.indexof    cosa fa????   ....mi daresti un po' più di codice che non riesco a capire??? grazie mille

La richiesta arriva sottoforma di caratteri seriali, uno alla volta e la riga "pacchetto += (char)c;" ha il compito di salvare tutti i char in un unica stringa. Questa stringa "pacchetto" come vedi è lunga e occupa molti byte mettendo a rischio la ram, andrebbe lavorata un po meglio e salvare solo il necessario, un altro accorgimento è quella di non dichiararla pubblica

"indexof" cerca in tutta la stringa il pezzo che tu vuoi vedere se esiste....
Se è contenuto all'interno della stringa ti restutisce la posizione inziale
Se non esiste la sequenza esatta ti restituisce -1

stringa = "ciao mondo e ciao universo";
int posizione = stringa.indexOf("mondo"); // cerchiamo mondo
il risultato sarà
5  quinto carattere dalla pos iniziale

se cerchi "ciao" essendocene 2 ti restituisce la posiz solo del primo

vedi:
indexOf
Substring
string.length()
LastIndexOf

Ultima cosa: se non vuoi vedere sulla barra degli indirizzi "http://192.168.2.177/?off_2" nell' html costruisci un form con metodo POST
« Last Edit: March 20, 2013, 12:45:26 pm by pablos » Logged

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

Offline Offline
Newbie
*
Karma: 0
Posts: 39
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

con la libreria Tinywebserver che mi carica anche le immagini della mia pagina html,come posso fare a prendere l'url???

Questo è il mio url iniziale:
192.168.0.12/index.htm

Questo è il mio url quando clicco nel pulsante SALVA:
http://192.168.0.12/index.htm?addr1=1&addr3=2&addr3=5&addr4=7

Io mi dovrei prendere i seguenti valori appunto con Tinywebserver:
addr1=1
addr1=3
addr1=4
addr1=7

Grazie mille
Logged

Genova
Offline Offline
Edison Member
*
Karma: 14
Posts: 2442
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Perchè usi la tiny che è pesante come lib per poi fare quello che fa un semplice esempio webserver. La tinywebserver non è stata pensata con questo criterio, lo fa tramite ajax metodo POST

la funzione che invia il dato potrebbe essere tipo questa
Code:
function send()
 {
    $.ajax({
      type: "POST",
   data: "addr1=1&addr3=2&addr3=5&addr4=7",
   dataType: "text",
   cache: false,
   url: "/SEND",
   success: function(r){ },
   error: function() {  }
  });
};

nello sketch ti ritrovi comunque nella stessa situazione identica che ho postato sopra cercare questa stringa  "addr1=1&addr3=2&addr3=5&addr4=7" nel pacchetto
Code:
if (client.available()) {
        char c = client.read();
        pacchetto += (char)c;
        Serial.write(c);
        ...
        ...

usi la tiny perchè carica  i file da SD?
ti basta aggiungere poche righe per inviare la pagina htm agli esempi webserver dentro l'IDE
Code:
void loop()
{
EthernetClient client = server.available();

    if (client) {  
        boolean currentLineIsBlank = true;
        while (client.connected()) {
            if (client.available()) {  
                char c = client.read();
                
                if (c == '\n' && currentLineIsBlank) {  
                    client.println("HTTP/1.1 200 OK");
                    client.println("Content-Type: text/html");
                    client.println("Connection: close");
                    client.println();
                    //------------------invia pagina index.htm------------------------------------
                    webFile = SD.open("index.htm");      
                    if (webFile) {
                        while(webFile.available()) {
                            client.write(webFile.read());
                        }
                        webFile.close();
                    //-------------------------------------------------------------------------------
                    }
                    break;
                }            
                if (c == '\n') {  
                    currentLineIsBlank = true;
                }
                else if (c != '\r') {    
                    currentLineIsBlank = false;
                }
            }
        }
        delay(1);    
        client.stop();
    }
}
« Last Edit: March 21, 2013, 05:27:58 am by pablos » Logged

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

Pages: [1] 2 3 4   Go Up
Print
 
Jump to: