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?
#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...
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
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 ?
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
ip publico ?!? noip.com?!? e cose del genere.
si centrano
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)
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:
#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(;;)
;
}
}
il router che hai dovrebbe gestire da solo il dynamic DNS, anche se probabilmente sara' limitato come operatore
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
quindi si puo fare??
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
Ho letto bene ora che è un Access point. :smiley-mr-green:
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?
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
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....
... 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
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
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!!!!
Ti senti bene? ahahahahahhahaha
off topic ( qualcuno di voi sa perchè quando mi loggo con ie 10 non mi fa visualizzare il furum invece da offline si? )
(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?
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
host6-175-static.199-31-b.business.telecomitalia.it
*.*.*.*
edit by mod
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.....
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
Bene, ti consiglio di rieditare il post precedente ed eliminare quell'IP per la tua privacy.
l'ho fatto io
non posso dire niente :) se ti dico qualcosa poi ti dovrei uccidere ahahahahaha :)
non posso dire niente :) se ti dico qualcosa poi ti dovrei uccidere ahahahahaha :)
lol ... ok :smiley-mr-green: :smiley-mr-green:
Grazie Leo :)
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....
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)
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!!!!
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
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?!?
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...
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
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?
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.
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