Go Down

Topic: Arduino e IP Statico (Read 137 times) previous topic - next topic

Roby0303


Salve, mi sono appena avvicinato al "mondo" Arduino e avrei bisogno di un aiuto per fare
i primi esperimenti.

Sono partito con un sketch trovato in rete  per pilotare 4 relè, funziona perfettamente nella mia LAN ma adesso vorrei capire come poter pilotare i 4 relè collegati all' arduino anche da internet.

Ho aperto sul router la porta 80 dell' arduino

Il router è raggiungibile da un IP statico
(es.  https://robyarduino.no-ip.org )

Il mio arduino nella LAN ha questo IP 192.168.178.45


Potete aiutarmi a capire come dovrei modificare il codice per poter raggiungere
la pagina web di controllo anche per esempio dal cellulare?




Code: [Select]



#include <SPI.h>
#include <Ethernet.h>
 
boolean statop1 = false;
boolean statop2 = false;
boolean statop3 = false;
boolean statop4 = false;

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
byte ip[] = { 192, 168, 178, 45 }; // ip di ARDUINO in lan
byte gateway[] = { 192, 168, 178, 1 }; // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
EthernetServer server(80); //server port
 
String readString;
 
//////////////////////
 
void setup(){
 
  pinMode(7, OUTPUT); //pin selected to control N°7 Relè 1
  pinMode(6, OUTPUT); //pin selected to control N°6 Relè 2
  pinMode(5, OUTPUT); //pin selected to control N°5 Relè 3
  pinMode(4, OUTPUT); //pin selected to control N°4 Relè 4
  //start Ethernet
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
  Serial.begin(9600);
  Serial.println("Domotic Server test 1.0"); // so I can keep track of what is loaded
}
 
void loop(){
  // Create a client connection
  EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
 
        //read char by char HTTP request
        if (readString.length() < 100) {
 
          //store characters to string
          readString += c;
          //Serial.print(c);
        }
 
        //if HTTP request has ended
        if (c == '\n') {
 
          ///////////////
          Serial.println(readString); //print to serial monitor for debuging
 
          client.println("HTTP/1.1 200 OK"); //send new page
          client.println("Content-Type: text/html");
          client.println();
 
          client.println("<!DOCTYPE html><html><head><meta name='apple-mobile-web-app-capable' content='yes'><meta name='apple-mobile-web-app-status-bar-style' content='black-translucent'><link rel='stylesheet' type='text/css' href='http://homeautocss.net84.net/a.css'><TITLE>Domotic Home Controller</TITLE></HEAD><BODY><H1>Domotic Home Controller</H1><hr><br><ul><li><p align=\"left\">Relais 1:<a href=\"/?light1on\">Turn On</a><a href=\"/?light1off\">Turn Off</a></li></p><br><br><li><p align=\"left\">Relais 2:<a href=\"/?light2on\">Turn On</a><a href=\"/?light2off\">Turn Off</a></li></p><br><br><li><p align=\"left\">Relais 3:<a href=\"/?light3on\">Turn On</a><a href=\"/?light3off\">Turn Off</a></li></p><br><br><li><p align=\"left\">Relais 4:<a href=\"/?light4on\">Turn On</a><a href=\"/?light4off\">Turn Off</a></li></p><br><br></ul></BODY></HTML>");
 
          delay(1);
          //stopping client
          client.stop();
 
          ///////////////////// control arduino pin
          if(readString.indexOf("?light1on") >0)//checks for on
          {
            statop1 = true;
          }
          if(readString.indexOf("?light1off") >0)//checks for off
          {
            statop1 = false;
          }
          if(readString.indexOf("?light2on") >0)//checks for on
          {
            statop2 = true;
          }
          if(readString.indexOf("?light2off") >0)//checks for off
          {
            statop2 = false;
          }
          if(readString.indexOf("?light3on") >0)//checks for on
          {
            statop3 = true;
          }
          if(readString.indexOf("?light3off") >0)//checks for off
          {
            statop3 = false;
          }
          if(readString.indexOf("?light4on") >0)//checks for on
          {
            statop4 = true;
          }
          if(readString.indexOf("?light4off") >0)//checks for off
          {
            statop4 = false;
          }
         
         
          if(statop1 == true)
          {
            digitalWrite(7, LOW);           
          }
          if(statop1 == false)
          {
            digitalWrite(7, HIGH);           
          }
          if(statop2 == true)
          {
            digitalWrite(6, LOW);           
          }
          if(statop2 == false)
          {
            digitalWrite(6, HIGH);           
          }
          if(statop3 == true)
          {
            digitalWrite(5, LOW);           
          }
          if(statop3 == false)
          {
            digitalWrite(5, HIGH);           
          }
          if(statop4 == true)
          {
            digitalWrite(4, LOW);           
          }
          if(statop4 == false)
          {
            digitalWrite(4, HIGH);           
          }
          //clearing string for next read
          readString="";
 
        }
      }
    }
  }
}




gpb01

#1
Jan 24, 2015, 08:36 pm Last Edit: Jan 24, 2015, 08:39 pm by gpb01
Prima di tutto, essendo il tuo primo post, ti consiglio di presentarti QUI (spiegando quali conoscenze hai di elettronica e di programmazione) e di leggere con attenzione il REGOLAMENTO ...

... poi ... non devi cambiare nulla nel codice, ma devi programmare il tuo router perché faccia "IP forwarding" ovvero mappi il tuo IP statico + un port nel tuo IP locale di Arduino.

Ad esempio potresti scegliere il port 8080 e programmare una regola che preveda :

http://robyarduino.no-ip.org:8080  ----> 192.168.178.45:80

Verifica sul tuo router come programmare ciò.

Guglielmo
Search is Your friend ... or I am Your enemy !

nid69ita

... poi ... non devi cambiare nulla nel codice, ma devi programmare il tuo router perché faccia "IP forwarding" ovvero mappi il tuo IP statico + un port nel tuo IP locale di Arduino.

Ad esempio potresti scegliere il port 8080 e programmare una regola che preveda :

http://robyarduino.no-ip.org:8080  ----> 192.168.178.45:80

Verifica sul tuo router come programmare ciò.

Guglielmo
Aggiungo che purtroppo ogni router ha i suoi menu, quindi è difficile dire come agirci sopra. A volte lo chiamano NAT, a volte Virtual Server, etc.
my name is IGOR, not AIGOR

Roby0303

Innanzitutto mi scuso per non essere passato prima dall sezione presentazioni, adesso ho rimediato.


Per quanto riguarda il mio problema, grazie al vostro aiuto, sono riuscito a capire dove dovevo intervenre e ho risolto, adesso l'arduino è raggiungibile anche da internet oltre che da lan.


Ora mi si è presentato un'altro piccolo problema, cioè siccome adesso che ho fatto   
l' IP forwarding all' arduino questo è raggiugibile liberamente da internet da chiunque
conosca il mio IP.

Volevo quindi mettere una password per accedere alla pagina web di controllo dell'arduino.

Per fare questo presumo che bisogna modificare lo sketch .....giusto?
( in questo caso avrei bisogno del vostro aiuto)
oppure devo intervenire ancora sul router?

Grazie per l'aiuto


gpb01

#4
Jan 25, 2015, 07:23 pm Last Edit: Jan 25, 2015, 07:23 pm by gpb01
Per fare questo presumo che bisogna modificare lo sketch .....giusto?
( in questo caso avrei bisogno del vostro aiuto)
Si, devi intervenire sul programma, ma dato che non sei su un web server tipo "Apache" :D ... ho idea che dovrai inventarti tu un qualche meccanismo di sicurezza ...  :smiley-roll:

Magari qualche esperto di pagine WEB potrà suggerirti la giusta strada ...  ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

Roby0303

Grazie Guglielmo.


In questi giorni ho cercato diverse soluzioni per mettere sotto password
l'accesso all'Arduino, purtroppo quelle che ho trovato hanno incorporato nello sketch anche
tutte le altre istruzioni per il funzionamento e non sono riuscito a "scorporare" la parte di codice
per la protezione dell' acesso da tutto il resto.

Ho visto la libreria " webduino " (#include <Ethernet.h> )
ma non riesco ad integrarla al mio codice,
in particolare non riesco a fare in  modo che dopo l'autenticazione si apra la pagina web
del mio sketch.

Se qualcuno a voglia di darmi una mano....lo ringrazio fin da adesso  ;D

330R

Io l'arduino con la schedina ethernet lo vedo bene gestito all'interno della LAN; molto mento accessibile da internet. Non credo proprio che il microcontrollore abbia la potenza di calcolo per gestire una connessione sicura e criptata. Dovresti mettere l'arduino dietro un PC con doppia scheda di rete, che faccia da firewall. Oppure, devi limitare il potere dell'utente che si connette all'arduino: un conto è se un quidam viene a sapere che hai 20° in soggiorno e le luci accese ma non può cambiare nulla; un altro conto è se può spegnerti la caldaia e aprirti il cancello.

gpb01

#7
Today at 12:29 pm Last Edit: Today at 12:30 pm by gpb01
Ripeto, non sono un esperto di Web e non so bene come fare su Arduino a proteggere pagine HTML con password (anche perché su Arduino NON riesci ad implementare SSL e quindi il tutto viaggerebbe comunque in chiaro), ma puoi anche inventarti un TUO sistema che protegge l'esecuzione di comandi ...
... che poi è quello che ho fatto io sua una mia scheda che controlla dei relays e legge dei valori analogici. ;)

In pratica mi sono inventato un sistema di "autenticazione del messaggio" con una logica per cui, anche se lo intercetti e lo ritrasmetti, comunque non è più valido (... ogni messaggio è valido una sola volta).

Ovvio, bisogna masticare un po' di crittografia, checksum, codici di controllo, ecc., ma si arriva a fare, anche nello spazio limitato della memoria di Arduino, cosette piuttosto sicure. Naturalmente non lo userei per aprire/chiudere il "caveau" di una banca, ma per il resto ... il grado di sicurezza che mi offre ... è più che sufficiente   :D

Guglielmo
Search is Your friend ... or I am Your enemy !

330R

In pratica mi sono inventato un sistema di "autenticazione del messaggio" con una logica per cui, anche se lo intercetti e lo ritrasmetti, comunque non è più valido (... ogni messaggio è valido una sola volta).
Che cosa hai fatto, una sorta di codice revolving?

gpb01

Che cosa hai fatto, una sorta di codice revolving?
... per ogni messaggio chiedo prima ad Arduino un numero random di 32 bit e, assieme ad una mia password fissa ed al messaggio che voglio inviare, lo uso per calcolare un codice di autenticazione.

In questo modo, lo stesso identico messaggio genera ogni volta un codice di controllo diverso ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy