comandare arduino.cc Mega da altervista e viceversa senza no-ip

edit: migliorato e (oltre al cambio automatico dell'IP) aggiunto l'invio automatico di una mail quando cambia l'IP.

sperando di fare cosa gradita spiego un modo di come fare ricevere ed inviare valori da un sito esterno come altervista senza no-ip ma usando tipo "mioip", è solo una base su cui lavorarci...senza password

arduino mega
shield wifi
connessione internet tramite router, shield wifi con ip statico e porta 80 aperta

attualmente funziona, gli sketch comunque necessitano di miglioramenti :slight_smile:
sul sito altervista si crea una cartella ad esempio

altervistaWifi

che contiene
3 file

  • .html/js
  • .php per ricevere valori
  • .php per ricevere il nuovo ip

base da salvare in html:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title> Values Wifi With Processing js and Php </title>
<script src=" processing.js" type="text/javascript"></script> 
</head> 
<script>   

function FileHelper()
{}
{
    FileHelper.readStringFromFileAtPath = function(pathOfFileToReadFrom)
    {
        var request = new XMLHttpRequest();
        request.open("GET", pathOfFileToReadFrom, false);
        request.send(null);
        var returnValue = request.responseText; 
        return returnValue;
  	}
}
 var text = FileHelper.readStringFromFileAtPath ( "newIp.txt" );
(function attiva() { 
  setTimeout(attiva, 4000);
  server = "http://"+text+"/arduino/stato/99";
 //alert(text); 
  richiesta = new XMLHttpRequest();
  richiesta.onreadystatechange = aggiornaValori;
  richiesta.open("GET", server, true);
  richiesta.send(null);
 })();
  function aggiornaValori() {
}
</script>
<body>
<!-----------------------inizio sketch Processing ------------------------->

in realtà così non si vede nulla perchè poi inserisco lo sketch Processing,
però decommentando //alert(text) se funziona appare una finestra con il numero ip pubblico che è arrivato.

file php ricezione valori da salvare in .php (getdata):

<?php
$localtemp = $_GET['TEMP'];
 $prova = $localtemp;
 //echo $prova;
if( $localtemp != null ){
	$File = "templog.txt"; 
	$Handle = fopen($File, 'w');
	fwrite($Handle, $localtemp);
	fclose($Handle);
 }

/* Read logged templog.txt to display*/
 $strFileName = "templog.txt";
$objFopen = fopen($strFileName, 'r');
if ($objFopen) {
   while (!feof($objFopen)) {
       $file = fgets($objFopen, 4096);
    echo $file;   
   }
   fclose($objFopen);
}
//print("℃");  
 
?>

file php ricezione nuovo IP da salvare in .php (newIp): :
è lo stesso del precedente cambiano i nomi del file.txt e la chiave di ricezione,
praticamente riceve il valore di 'newIp' e lo fa vedere nel file creato "newIp.txt"

<?php
$localtemp = $_GET['newIp'];
$prova = $localtemp; 
if( $localtemp != null ){
$File = "newIp.txt"; 
$Handle = fopen($File, 'w');
fwrite($Handle, $localtemp);
fclose($Handle);
}
/* Read logged templog.txt to disply*/
$strFileName = "newIp.txt";
$objFopen = fopen($strFileName, 'r');
if ($objFopen) {
  while (!feof($objFopen)) {
      $file = fgets($objFopen, 4096);
   echo $file;   
  }
  fclose($objFopen);
}
///////

if ($vecchioIp != $localtemp){

if(mail('a  me...@gmail.com','oggetto', $localtemp,'From: ..x..@hotmai.com'))
echo 'email inviata correttamente';
else echo 'Errore!';

$vecchioIp = $localtemp;
}
//print("℃");  
?>

se tutto funziona vengono creati i 2 file.txt

nota, i file php e la parte function FileHelper del html sono stati fatti su base di sketch presi dalla rete anzi..sono quasi pari pari :confused:

diciamo che ogni ora arduino manda su altervista il mio IP pubblico,
quando vado ad aprire la pagina web viene viene memorizzato nel file html il nuovo IP, ed inviato un comando ad arduino: ilMioIp/arduino/stato/99 , ma potrebbe essere/ciaociaomiciomicio

arduino quando riceve questo fa partire varie cose.
(sono un paio di giorni che provo e continua a funzionare)

passo 2 sketch arduino

Pablos, tu che stai sveglio sino a tarda notte come Einstein..
posso proseguire? ::slight_smile:

Pablos, tu che stai sveglio sino a tarda notte come Einstein..

ahahah .. si si continua :slight_smile: :slight_smile: ... (Einstein però è morto e non dietro a un forum) pensa se a quei tempi Einstein avesse avuto un forum, secondo me lo bannavano subito :slight_smile:
Oggi potresti avere Arduino=MGenuino al quadrato che è del tutto relativo

ecco la parte arduinica di cui sono andato in confusione.... e forse per miracolo funzia.

parte setup, è una shield wifi:

#include <SPI.h>
#include <WiFi.h>
int state = 0;
char ssid[] = "router"; //  your network SSID (name)
char pass[] = "password";
char  cc;
String message = "";
int status = WL_IDLE_STATUS;
WiFiServer server(80);
WiFiClient client;
String currentLine;
char sito[] = "www.xxxxx.altervista.org";
char newIp[] = "www.icanhazip.com";
void setup() {
  Serial.begin(9600);
  // pinMode(9, OUTPUT);
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present");
    while (true);       // don't continue
  }
  while ( status != WL_CONNECTED) {
    Serial.print("Attempting to connect to Network named: ");
    Serial.println(ssid);
    status = WiFi.begin(ssid, pass);
    delay(10000);
  }
  server.begin();                           // start the web server on port 80
  // printWifiStatus();                        // you're connected now, so print out the status
}

loop:

void loop() {
  client = server.available();   // listen for incoming clients
  if (client) {                             // if you get a client,
    currentLine = "";                // make a String to hold incoming data from the client
    while (client.connected()) {            // loop while the client's connected
      if (client.available()) {             // if there's bytes to read from the client,
        char c = client.read();             // read a byte, then
        if (c == '\n') {                    // if the byte is a newline character
          if (currentLine.length() == 0) {
            break;
          }
          else {      // if you got a newline, then clear currentLine:
            currentLine = "";
         //   delay(1);
          }
        }
        else if (c != '\r') {    // if you got anything else but a carriage return character,
          currentLine += c;      // add it to the end of the currentLine 
        }
        if (currentLine.endsWith("GET /arduino/stato/99")) {
          client.stop();
          invioValori();
        }
      }
    } 
  }
  if (millis() % 50000 == 0) { //50 secondi,sarà 1 ora
  client.stop();
    ican();
  }
}

richiesta ip: (ican)

void ican() {
  if (client.connect(newIp, 80)) {
    //  Serial.println(F("connected to server ican"));
    client.println("GET / icanhazip.com");
    client.println("Connection: close");
    client.println();
  }
  delay(10000);
  while (client.available()) {
    char   cc = client.read();
    if (cc != '\n') {
      message += cc;
    }
    else {
      sendIp(message);
      message = "";
    }
  } 
}

invio ip ad altervista

void sendIp(String x) {
  if (client.connect(sito, 80)) {
    client.print("GET //altervistaWifi/getIp.php?newIp=");
    client.print (x);
    client.println(" HTTP/1.0");
    client.println("Host:www.xxxxx.altervista.org");
    client.println("Accept-Encoding: 0");
    client.println("Cache-Control: no-cache");
    client.println("Connection: close");
    client.println();
  }
  delay(5000);
  client.stop();
  client.flush();
}

invio valori arduino

void invioValori() { 
  if (client.connect(sito, 80)) {
    client.print("GET //alterVistaWifi/getdata.php?TEMP=");
    client.print (1);
    client.print (",");
    client.print(random(63,103)); // send value
    client.print (",");
    client.print(random(43, 103)); //potrebbe essere analogRead(A0)
    client.println(" HTTP/1.0");
    client.println("Host:www.xxxxx.altervista.org"); // Server URL
    client.println("Accept-Encoding: 0");
    client.println("Cache-Control: no-cache");
    client.println("Connection: close");
    client.println();
    client.stop();
    client.flush();
  } 
}

sono sicuro che va migliorato negli stop e nei flush e nei tempi di coocrdinamento tra le funzioni nonch{ altre parti :stuck_out_tongue_closed_eyes:

edit, modificato negli stop e flush

Interessante. Faccio solo notare che la password wifi è in chiaro, quindi spero sia fittizia.
Spero altrettanto che la shield wifi non mandi in chiaro la password quando comunica con access point/router...

ciao, hai consigli su come rendere più sicuro il sistema?

migliorato gli sketch :o

speedyant:
Interessante. Faccio solo notare che la password wifi è in chiaro, quindi spero sia fittizia.
Spero altrettanto che la shield wifi non mandi in chiaro la password quando comunica con access point/router...

modificato....

Purtroppo temo che se a livello di librerie non esista un modo per crittografare password ci sia poco da fare.