Arduino Forum

International => Italiano => Software => Topic started by: 2aza on Apr 28, 2014, 12:48 am

Title: Web server remoto
Post by: 2aza on Apr 28, 2014, 12:48 am
Salve a tutti, ho cominciato a sperimentare con l'ethernet shield e scopiazzando un po di codice ho creato un web server locale leggero e perfettamente funzionante, ora vorrei vomitare tutto in remoto.. Ho visto qualcosina googlando ma ci ho capito ben poco...

Qualcuno di voi di santa pazienza potrebbe spiegarmi bene come funziona (a livello molto basilare)?
Mi potete indicare come va modificato questo codice?
Code: [Select]

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

// size of buffer used to capture HTTP requests
#define REQ_BUF_SZ   20

// MAC address from Ethernet shield sticker under board
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 20);   // IP address, may need to change depending on network
EthernetServer server(80);       // create a server at port 80
File webFile;                    // handle to files on SD card
char HTTP_req[REQ_BUF_SZ] = {0}; // buffered HTTP request stored as null terminated string
char req_index = 0;              // index into HTTP_req buffer

void setup()
{
    // disable Ethernet chip
    pinMode(10, OUTPUT);
    digitalWrite(10, HIGH);
   
 
   
   SD.begin(4);
 
    Ethernet.begin(mac, ip);  // initialize Ethernet device
    server.begin();           // start to listen for clients
}

void loop()
{
    EthernetClient client = server.available();  // try to get client

    if (client) {  // got client?
        boolean currentLineIsBlank = true;
        while (client.connected()) {
            if (client.available()) {   // client data available to read
                char c = client.read(); // read 1 byte (character) from client
                // buffer first part of HTTP request in HTTP_req array (string)
                // leave last element in array as 0 to null terminate string (REQ_BUF_SZ - 1)
                if (req_index < (REQ_BUF_SZ - 1)) {
                    HTTP_req[req_index] = c;          // save HTTP request character
                    req_index++;
                }
               
                // last line of client request is blank and ends with \n
                // respond to client only after last line received
                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("Connnection: close");
                    client.println();
                    // open requested web page file
                    if (StrContains(HTTP_req, "GET / ")
                                 || StrContains(HTTP_req, "GET /index.htm")) {
                        webFile = SD.open("index.htm");        // open web page file
                    }
                    if (StrContains(HTTP_req, "GET /page2.htm")) {
                        webFile = SD.open("page2.htm");        // open web page file
                    }
                    if (StrContains(HTTP_req, "GET /page3.htm")) {
                        webFile = SD.open("page3.htm");        // open web page file
                    }
                    if (StrContains(HTTP_req, "GET /page4.htm")) {
                        webFile = SD.open("page4.htm");        // open web page file
                    }
                    // send web page to client
                    if (webFile) {
                        while(webFile.available()) {
                            client.write(webFile.read());
                        }
                        webFile.close();
                    }
                    // reset buffer index and all buffer elements to 0
                    req_index = 0;
                    StrClear(HTTP_req, REQ_BUF_SZ);
                    break;
                }
                // every line of text received from the client ends with \r\n
                if (c == '\n') {
                    // last character on line of received text
                    // starting new line with next character read
                    currentLineIsBlank = true;
                }
                else if (c != '\r') {
                    // a text character was received from client
                    currentLineIsBlank = false;
                }
            } // end if (client.available())
        } // end while (client.connected())
        delay(1);      // give the web browser time to receive the data
        client.stop(); // close the connection
    } // end if (client)
}

// sets every element of str to 0 (clears array)
void StrClear(char *str, char length)
{
    for (int i = 0; i < length; i++) {
        str[i] = 0;
    }
}

// searches for the string sfind in the string str
// returns 1 if string found
// returns 0 if string not found
char StrContains(char *str, char *sfind)
{
    char found = 0;
    char index = 0;
    char len;

    len = strlen(str);
   
    if (strlen(sfind) > len) {
        return 0;
    }
    while (index < len) {
        if (str[index] == sfind[found]) {
            found++;
            if (strlen(sfind) == found) {
                return 1;
            }
        }
        else {
            found = 0;
        }
        index++;
    }

    return 0;
}



Grazie in anticipo...
Title: Re: Web server remoto
Post by: pablos71 on Apr 28, 2014, 01:26 am
Fare tutto da remoto penso intendi raggiungere il tuo webserver da internet, da un altra rete.
Non devi fare nulla sul codice, va bene così com'è se funziona da lan locale, devi solo avere un router, un ip statico (o un servizio dinamico DNS), configurare gli instradamenti forwarding con porte correttamente nel tuo router.
Ma non dicendo come è composta la tua rete locale e che apparati possiedi sarà dura dirti come fare, ogni rete ha le sue caratteristiche, è già una rottura  per chi queste  config le mastica tutti i giorni, figurati con le tue informazioni :) :) :)

Ps: cosa hai letto che non hai capito?

ciao
Title: Re: Web server remoto
Post by: 2aza on Apr 28, 2014, 01:41 am
Si hai capito perfettamente chiedo scusa se mi sono spiegato male....

Ho letto articoli che parlavno di: ip publico ?!? , noip.com?!? ; cose del genere... non centrano nulla con quello che voglio fare ?
Title: Re: Web server remoto
Post by: pablos71 on Apr 28, 2014, 01:48 am
espresso in modo molto basilare
http://forum.arduino.cc/index.php?topic=226773.msg1685678#msg1685678 reply 7

che cosa hai alice-infostrada-pinco pallino adsl-fastweb fibra- fastweb adsl?
hai un router fornito dal gestore ?
lo hai comprato tu il router?
oltre a quello, in cascata ci sono altri apparati tipo altri router o switch?
sei in un appartamento?
sei in una rete di un aziendale?
Queste sono le info che servono per capire che tipo di rete hai :), alcuni servizi potresti già averli e non saperlo

Quote
ip publico ?!?  noip.com?!? e cose del genere.

si centrano

Title: Re: Web server remoto
Post by: 2aza on Apr 28, 2014, 02:07 am
Guarda come è combinata la rete non lo so perchè è un gestore privato che me la fornisce... nel mio paese no c'è linea e me la sparano con dei ponti wifi..... per quanto riguarda la mia linea locale :
linea che mi sparano 192.168.1.254------------A.P. bridge 192.168.1.10-----------------arduino 192.168.1.20

Acces point: digicom wave gate 150r        (CACCA)


Title: Re: Web server remoto
Post by: 2aza on Apr 28, 2014, 02:38 am
Spulcialdo un po su google e leggendo quello che mi hai linkato.... Ho capito!!!
allora l'importante è rendere accessibile arduino  limitando le restrinzioni del router....DMZ?? o apertura porte.... verso l'indirizzo ip interno..... poi mi avvalgo del sevizio noip e faccio loggare arduino al sito facendo in modo che prenda in automatico l'ip pubblico assegnato....
Giusto?????
Ho trovato questo:
Code: [Select]

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

byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //mac ethernet
byte ip[] = { 192,168,1,190 }; //indirizzo locale dell'Arduino
byte server[] = {8,23,224,120}; //dynupdate.no-ip.com

//creo un client che punta al
//servizio dynupdate.no-ip.com sulla porta 80
Client client(server, 80);

void setup() {
  //Avvio la connessione
  Ethernet.begin(mac, ip);
  //inizializzo la seriale
  Serial.begin(9600);
  //aspetto che il chip wiznet sia inizializzato
  delay(1000);

  Serial.println("Connessione in corso...");

  //se la connessione avviene con successo
  //invio la richiesta http
  if (client.connect()) {
    Serial.println("Connesso");

    client.println("GET /nic/update?hostname=host.no-ip.com HTTP/1.0");
    client.println("Host: dynupdate.no-ip.com");
    client.println("Authorization: Basic aW86YW1vIGlsIHRhZWt3b25kbw==");
    client.println("User-Agent: arduino_ethernet/1.0 info@gmail.com");

    client.println();
  }
  else
{
    //Problemi nella connessione
    Serial.println("connessione fallita!");
  }
}

void loop()
{
  //restituisco il messaggio inviato dal servizio
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  //Quando il server si disconnette fermo il client
  if (!client.connected()) {
    Serial.println();
    Serial.println("Disconessione");
    client.stop();

    //ciclo infinito
    for(;;)
      ;
  }
}
Title: Re: Web server remoto
Post by: brunello22 on Apr 28, 2014, 09:22 am
il router che hai dovrebbe gestire da solo il dynamic DNS, anche se probabilmente sara' limitato come operatore
Title: Re: Web server remoto
Post by: nid69ita on Apr 28, 2014, 09:27 am
Traduzione di quello che dice @Brunello per @2aza:
http://it.wikipedia.org/wiki/Dynamic_DNS

Molti router ormai possono gestire in automatico questo ip pubblico assegnato da un servizio tipo no-ip
Purtroppo ogni router ha i suoi menu. E a volte i vari menu per i servizi che si possono configurare hanno nomi diversi (mi pare che su alcuni router il NAT venga chiamato DMZ).

Se il tuo router è questo (dalla sigla che hai dato):
http://www.digicom.it/digisit/prodotti.nsf/itprodottiidx/Wavegate150RBundle
nelle caratteristiche c'e':   - Dynamic DNS e Firewall integrato
Title: Re: Web server remoto
Post by: 2aza on Apr 28, 2014, 10:41 am
quindi si puo fare??
Title: Re: Web server remoto
Post by: pablos71 on Apr 28, 2014, 12:53 pm
avete letto bene?

è un gestore privato che me la fornisce... me la sparano con dei ponti wifi.....
la linea che mi sparano 192.168.1.254------------A.P. bridge 192.168.1.10-----------------arduino 192.168.1.20

Acces point: digicom wave gate 150r  


lui è un client che ha come indirizzo di uscita 192.168.1.10 verso il roter del gestore privato, le impostazioni non le deve fare nel suo digicom, non ha un ip pubblico, questo si trova nel router che trasmette a lui, le impostazioni vanno fatte la.


quindi si puo fare??

Si se contatti l'amministratore di rete e spieghi la situazione, ti fai impostare i forward verso il tuo accespoint

ciao
Title: Re: Web server remoto
Post by: nid69ita on Apr 28, 2014, 01:14 pm
Ho letto bene ora che è un Access point.  :smiley-mr-green:
Title: Re: Web server remoto
Post by: brunello22 on Apr 28, 2014, 01:21 pm

avete letto bene?



ora si
Title: Re: Web server remoto
Post by: 2aza on Apr 28, 2014, 01:29 pm
Intanto grazie a tutti per la pazienza, mi state facendo capire molte cose utili.....
Vi spiego un po meglio la situazione....
Supponendo che io questo arduino lo voglio portare in giro per il mondo con me e quindi sfruttare diversi gestori (fastweb, telecomm ecc)...

Posso  richiedere tramite arduino a un servizio tipo "mioip" il mio IP pubblico e di conseguenza creare da arduino un dns bypassando il router con un DMZ o quant'altro?
Title: Re: Web server remoto
Post by: gpb01 on Apr 28, 2014, 01:37 pm
Non credo che tu possa implementare tutto il protocollo di DynamicDNS su Arduino, ma ... io vedo una soluzione moooolto più semplice che ti svincola da questi problemi ...

Ti compri un piccolo router WiFi che programmi per connettersi con il servizio di DynamicDNS e con il routing fisso verso il tuo Arduino ... quando poi sei in giro, alla rete NON connetti il tuo Arduino, ma il router che ti porti dietro.
Sarà lui ad aggiornare il servizio di IP e a ruotarti la connessione ... ;)

Guglielmo
Title: Re: Web server remoto
Post by: 2aza on Apr 28, 2014, 02:02 pm
Guglielmo grazie per la risposta... si è un ottima soluzione .... devo fare un po di ricerche e valutare...
Secondo me non è tanto impossibile creare ddns direttamente da arduino.... ma chi sono io per dire cosa è, e non è fattibile.... ora ci studio un po e vediamo cosa ne viene fuori.... intanto grazie mille a tutti.... se qualcuno altri consigli sono ben accettati.... vi tengo aggiornati negli sviluppi....
Title: Re: Web server remoto
Post by: gpb01 on Apr 28, 2014, 02:20 pm

... ma chi sono io per dire cosa è, e non è fattibile.... ora ci studio un po e vediamo cosa ne viene fuori....


... attento, qui "nessuno è chissà chi" e nessuno ha la pretesa di conoscere "la verità assoluta", quindi ... non sminuirti, sei uno di noi ;)

Il mio dubbio è perché, se ben ricordo, alcuni provider di DynamicDNS richiedono HTTPS ovvero connessione sicura SSL che ... vedo dura mettere in piedi su Arduino ;)

Se invece tu trovi una soluzione semplice ed un provider che accetta una connessione in chiaro ... ben venga, anzi, rendici partecipi che la cosa sicuramente interessa a moltissimi  :D

Guglielmo
Title: Re: Web server remoto
Post by: pablos71 on Apr 28, 2014, 02:22 pm
Quote
Supponendo che io questo arduino lo voglio portare in giro per il mondo con me e quindi sfruttare diversi gestori (fastweb, telecomm ecc)...

Ogni volta troverai sempre il problema di impostare correttamente la rete per far si che il tuo apparato sia raggiungibile da qualsiasi parte del mondo.

Vuoi creare qualcosa commerciabile che dato in mano a un incopetente funzioni? che senso ha portarsi dietro arduino in giro per il mondo e collegarlo alla prima rete che trovi?
dicci dicci :)

a parte scherzi:
Non so cosa vuoi fare, però un altra soluzione potrebbe esserti utile creando una paginetta web su un server free o a pagamento, al massimo sono 30-60 euro l'anno (dipende da cosa chiedi), arduino trasmette al server i dati e tu li leggi collegandoti ad esempio a www.2aza.net, ripeto bisogna sempre vedere cosa vuoi fare, la frequenza dei dati che vuoi vedere, la banda che usi, il numero di database che chiedi su mysql, alcuni protocolli di comunicazione che non sono implementati nel free,  ecc ecc

ciao
Title: Re: Web server remoto
Post by: 2aza on Apr 28, 2014, 02:48 pm
illuminazione!!! eureka!!!! datemi dieci minuti perchè ho disegnato su carta, e i miei disegni appartengono a un altra galassia (non di umana comprensione)....
Vai di paint!!!!
Title: Re: Web server remoto
Post by: pablos71 on Apr 28, 2014, 02:53 pm
Ti senti bene? ahahahahahhahaha
Title: Re: Web server remoto
Post by: 2aza on Apr 28, 2014, 02:59 pm
off topic ( qualcuno di voi sa perchè quando mi loggo con ie 10 non mi fa visualizzare il furum invece da offline si? )
Title: Re: Web server remoto
Post by: 2aza on Apr 28, 2014, 03:24 pm
(http://i60.tinypic.com/2i7ti6d.jpg)

Loop ogni 3 min{
                             Arduino richiede l'ip publico alla pagina web su alter;

                             La pagina esegue uno script e restituisce l'ip ad arduino;

                             Arduino si imposta l'ip restituito dalla pagina;

                             Anche la pagina alter immagazzina l'ip in un database assegnandolo a un nome utente e password;
}

Il client si collega alla pagina alter, effettua il login e viene rindirizzato  al ip pubblico correlato ;

Arduino si sente chiamato in causa e restituisce le pagine presenti nel SD;



Come vi sembra?
Title: Re: Web server remoto
Post by: pablos71 on Apr 28, 2014, 07:53 pm
Che IP pubblico dovrebbe darti la web page su alter?

Quando vai su internet attraversi un ip pubblico che però non è in mano tua. Prova a fare http://www.ipmy.it/index.php?lang=it e dimmi cosa ti scrive pls
Title: Re: Web server remoto
Post by: 2aza on Apr 28, 2014, 08:06 pm
host6-175-static.199-31-b.business.telecomitalia.it

*.*.*.*

edit by mod
Title: Re: Web server remoto
Post by: 2aza on Apr 28, 2014, 08:12 pm
Quote
Che IP pubblico dovrebbe darti la web page su alter?

arduino fa la richiesta, la pagina esegue uno script(tipo mioip.it) per immagazzinare l'ip di arduino e allo stesso tempo gli fornisce l'ip immagazzinato.....
Title: Re: Web server remoto
Post by: pablos71 on Apr 28, 2014, 09:08 pm
Bene, ti consiglio di rieditare il post precedente ed eliminare quell'IP per la tua privacy.
Per quanto riguarda l'intreccio che vuoi fare "chi sono io per dirti che non funziona?" :) a mio modesto parere il server ti potrebbe dare solo i dati di rete di se stesso che non hanno nulla a che vedere con arduino che hai a casa, comunque bando alle ciance :) non hai risposto alla domanda : "perchè dovresti portare un arduino in giro per il mondo e connetterlo alla prima rete che trovi? e per giunta raggiungibile dal mondo con uno schiocco di dita?" ... sono curioso dai dimmelo :)
Perchè io che installo DVR, telecamere-ip, router, connessioni remote varie ... sono proprio un picio a fare tutti sti sbattimenti di porte, forward, dmz ecc ecc  se c'è un metodo migliore per raggiungere gli apparati da qualunque punto della rete mondiale.

ciao
Title: Re: Web server remoto
Post by: leo72 on Apr 28, 2014, 09:13 pm

Bene, ti consiglio di rieditare il post precedente ed eliminare quell'IP per la tua privacy.

l'ho fatto io
Title: Re: Web server remoto
Post by: 2aza on Apr 28, 2014, 09:26 pm
non posso dire niente :)  se ti dico qualcosa poi ti dovrei uccidere ahahahahaha :)
Title: Re: Web server remoto
Post by: pablos71 on Apr 28, 2014, 09:32 pm

non posso dire niente :)  se ti dico qualcosa poi ti dovrei uccidere ahahahahaha :)

lol ... ok  :smiley-mr-green: :smiley-mr-green:

Grazie Leo :)
Title: Re: Web server remoto
Post by: 2aza on Apr 28, 2014, 09:40 pm
se tu ti colleghi a un servizio tipo mioip lui restituisce l'ip del client che ha effettuato la richiesta, nel mio caso il client è arduino ma allo stesso tempo è un server web....
Title: Re: Web server remoto
Post by: pablos71 on Apr 28, 2014, 10:05 pm
Allora, per capirci, il tuo gestore privato paga un contratto 20MB-100MB quello che è, si offre di dividerlo con 100 abitanti del paese via wifi fornendo ip statici, a te da 192.168.1.10, al tuo vicino gli da 192.168.1.11, fino a quello che sta in cima alla collina che ha 192.168.1.100, a questo punto tutti e 100 i cittadini escono verso internet con un unico gateway 31.xxx.xxx.xxx (ip pubblico probabilmente dinamico), ora io piazzo un arduino (webserver) in casa di uno qualsiasi di questi 100 cittadini ... avendo quell'unico ip conosciuto (31.xxx.xxx.xxx), che è la porta di entrata verso la vostra rete locale, mi spieghi come raggiungo la casa di Armando che ha il 192.168.1.50 da Newyork?  :D :D  ......  (attenzione anche l'IP di Armando conosci)
Title: Re: Web server remoto
Post by: 2aza on Apr 28, 2014, 10:23 pm
in questo caso no ma ho chiesto al gestore un ip publico solo per me , con 3 euro in piu al mese me lo dà.... LADRI!!!!
Title: Re: Web server remoto
Post by: pablos71 on Apr 28, 2014, 11:08 pm
ahahahhahahahhaha io sono Genovese, ma tu sei di Camogli .....
comunque non hai risolto il problema. Vuoi piazzare il tuo arduino in giro per le reti senza chiedere nulla ai gestori della rete in cui "inzicchi" il tuo dispositivo.
PS: traduzione "inzicchi" >>>> infili  ]:D
Title: Re: Web server remoto
Post by: 2aza on Apr 29, 2014, 12:34 am
penso che solo io sto nel terzo mondo con questa connessione di merda :)...... gli altri gestori non condividono gli ip con 100 abitanti... almeno la maggior parte.....sbaglio?!?
Title: Re: Web server remoto
Post by: elpapais on Apr 29, 2014, 12:23 pm
la rete fastweb usa la classe 10. quindi tutti quelli che hanno fastweb s'attaccano come fai tu....
molti dei provider Wi-Fi, GSM, HSDPA, HiperLan  ma anche su ADSL, usano classe di rete privata e hanno un paio di ip pubblici che non danno ai 3mila clienti o magari (come fastweb) vendono il servizio di ip pubblico.
Per aggirare il problema puoi far dialogare il tuo arduino con un server fuori dalla rete dove si trova arduino...

Title: Re: Web server remoto
Post by: pablos71 on Apr 29, 2014, 12:41 pm

la rete fastweb usa la classe 10. quindi tutti quelli che hanno fastweb s'attaccano come fai tu....

Hai ancora la classe 10? strano perchè sono tutti passati alla 2 già da qualche anno, ma parli di fastweb fibra o adsl?


penso che solo io sto nel terzo mondo con questa connessione di merda :)...... gli altri gestori non condividono gli ip con 100 abitanti... almeno la maggior parte.....sbaglio?!?

Non sei l'unico, nei paesi e nelle periferie c'è spesso molto disagio, causato da cavi vecchi e obsoleti che sono sempre di proprietà telecom, questa le affitta ad altri gestori e se ne frega altamente se i cavi fanno schifo e non ci pensa nemmeno di cambiarli.
Sembra però che telecom cominci a organizzarsi con le fibre

ciao
Title: Re: Web server remoto
Post by: 2aza on Apr 29, 2014, 01:15 pm
Arduino ha anche un mac.... quindi, se io faccio una richiesta alla mia pagina con ip a,b,c,d e il mio vicino fa la stessa richiesta con stesso ip posso sfruttare la questinone mac per differenziare i client....

Se   mac == a,b,c,d,e,f
{ è arduino!!! registro il tuo ip e te lo rimando per fartelo conoscere}
altrimenti
{non è arduino ti faccio solo visualizzare la pagina}

possibile?

Title: Re: Web server remoto
Post by: elpapais on Apr 29, 2014, 04:27 pm
il problema non e' quello che ci fai tu identificando mac o ip.... il problema sono i routers a monte del tuo.
se al router che da al tuo router la connettivita' non e' stato detto che la chiamata dall'esterno deve indirizzarla al tuo ruter, col cavolo che arriva qualche cosa...guarda l'indirizzo ip rilasciato al tuo router e li ti accorgi subito...
altra cosa che puoi fare e' quella di fare un tracert a un sito tipo nasa.gov oppure google.it, se i primi 5 indirizzi ip che vedi sono di classe privata allora sei fregato... se invece il primo e' di classe privata ma il secondo e' pubblico allora probabilmente non avrai problemi.

Pero' data l'esperienza che ho con sistemi di distribuzione wireless difficilmente l'antenna sopra il tuo tetto, e' stata configurata per ruotare nella tua rete privata un ip pubblico.
se non sono state aperte le porte e ruotate verso la sotto-rete non avrai alcuna possibilita' di ruotare un ip pubblico come dyndns oppure no-ip sulla tua rete.

Title: Re: Web server remoto
Post by: 2aza on Apr 30, 2014, 03:58 am
ragazzi, allora che dire, intanto grazie a tutti per la pazienza e soprattutto per non avermi mandato al quel paese quando ho detto castronerie... pablos mi spiace ma per ora non posso parlare, dovrei uscire dal silenzio stampa entro qualche mese di test, collaudi, rifiniture, ecc.. la parte web è una implementazione che farò in seguito ma intanto ho realizzato una congettura che piu o meno potrebbe andare, bisogna solo sperimentare.... vi farò sapere....
grazie ancora