Go Down

Topic: Funzionamento parziale sotto dyndns (Read 263 times) previous topic - next topic

blulaserstar

Buongiorno,
sto sperimentando un po il mio ethernet shield, ma ho un problemino, ho caricato uno sketch di esempio molto standard e molto semplice per l'accensione di 3 led, fin qui tutto ok. Quando lavoro in rete locale funziona egregiamente!
Ma se prendo l'ip della shield, faccio il port mapping sul ruoter, e la associo al mio dyndns succede una cosa particolare.
Prendo il cellulare vado su rete 3G (spengo il wireless) e digito: miodominio.dyndns.it:80 raggiungo subito arduino, ma quando do un comando vedo che nella barra degli indirizzi compare l'ip della scehda, 192.168.1.10/comando ed ovviamente non funziona!
Devo modificare qualche cosa?
Io ho come il sospetto che l'errore possa risiedere qua:
          IPAddress serverIPAddress = Ethernet.localIP();
ho indovinato?

Code: [Select]

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


byte mac[] = { 0xDD, 0xAB, 0xCE, 0xFF, 0xEE, 0xED };
byte ip[] = { 192, 168, 1, 10};

EthernetServer server(80);

// Definisco i 3 LED
const int pinRosso   = 2;   
const int pinArancio = 3; 
const int pinVerde   = 4;     

void setup()
{
  Serial.begin(9600);         
  pinMode(pinRosso, OUTPUT);   
  pinMode(pinArancio, OUTPUT);
  pinMode(pinVerde, OUTPUT);
 

  Ethernet.begin(mac, ip);
  server.begin();
 
  digitalWrite(pinRosso, LOW);
  digitalWrite(pinArancio, LOW);
  digitalWrite(pinVerde, LOW);

  Serial.println("Circuito pronto!");
}

void loop()
{
  EthernetClient client = server.available();
 
  // Se esiste...
  if (client)
  {
    while (client.connected())
    {
      if (client.available())
      {
        if ( client.find("GET /") )
        {
         
          if(client.findUntil("?", "\n\r")){
            char type = client.read();
              if ( type == 'v' ) { toggle( pinVerde ); }
            if ( type == 'a' ) { toggle( pinArancio ); }
            if ( type == 'r' ) { toggle( pinRosso ); }
          }
         
          // Stampo la pagina HTML
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();

          // Leggo il valore dei LED
          int verde = digitalRead(pinVerde);
          int arancio = digitalRead(pinArancio);
          int rosso = digitalRead(pinRosso);

          // Stampo lo stato del pulsante Verde
          client.print("LED Verde: ");
          client.print(verde);
          client.print("<br />");

          // Stampo lo stato del pulsante Arancio
          client.print("LED Arancio: ");
          client.print(arancio);
          client.print("<br />");

          // Stampo lo stato del pulsante Rosso
          client.print("LED Rosso: ");
          client.print(rosso);
          client.print("<br />");

          // Indirizzo IP del server
          IPAddress serverIPAddress = Ethernet.localIP();
           
          // Verde
          client.print("<br />");
          client.print("<a href='http://");
          client.print(serverIPAddress);
          client.print("?v'>");
          client.print("Accendi Verde");
          client.print("</a>");

          // Arancio
          client.print("<br />");
          client.print("<a href='http://");
          client.print(serverIPAddress);
          client.print("?a'>");
          client.print("Accendi Arancio");
          client.print("</a>");

          // Rosso
          client.print("<br />");
          client.print("<a href='http://");
          client.print(serverIPAddress);
          client.print("?r'>");
          client.print("Accendi Rosso");
          client.print("</a>");
         
          break;
        }
      }
    }

    delay(1);
    client.stop();
  }
}

void toggle(int pin)
{
  int stato = digitalRead(pin);
  if ( stato == LOW ) { digitalWrite(pin, HIGH); }
  else if ( stato == HIGH ) { digitalWrite(pin, LOW); }
}

elpapais

Ho provato e in effetti non funziona...
secondo me devi formattare bene la pagina html che crei.
www.infoportal.it support at infoportal.it

vittorio68

Ciao,

in effetti il problema è "quasi" quello.

Il tuo codice Arduino restituisce una pagina HTML con URL assoluti del tipo "http://192.168.1.10?v". In questo caso un browser qualsiasi tenterà di collegarsi esattamente all'URL indicato.

Se invece usi un URL relativo del tipo "?v" il browser costruirà l'URL a cui collegarsi a partire da quello attuale. In pratica la pagina è stata presa da "http://miodominio.dyndns.it:80" lui quindi costruirà un URL del tipo "http://miodominio.dyndns.it:80?v" continuando quindi a collegarsi all'IP pubblico e non a quello privato. Nello specifico devi inviare un HTML del tipo <a href='?v'>Accendi il verde</a>.

Aggiungo pure che un URL sarebbe http://host:porta/risorsa?parametro1=valore1&parametro2=valore2&...&parametron=valoren

Nel tuo caso sembra mancare il nome risorsa (per esempio index.htm).

Tuttavia credo che per i tuoi scopi possa andare bene perchè il browser crea il comando GET dell'HTTP con tutto ciò che trova dopo il singolo "/" (non dopo i doppi "//"). Se proprio vuoi essere più standard aggiungi un nome risorsa anche fittizio che semplicementi scarti cercando il "?" e non il "/". Potrebbe però esserti utile se in futuro volessi gestire pagine diverse per attività diverse.

Ciao.
Vittorio.

blulaserstar

Grazie mille Funziona al 100%
Ho fatto la modifica qua: <a href='?v'>Accendi il verde</a> come indicato, ed ora il problema non sussiste più! Beh devo ancora imparare un pò di cose ma almeno ora per quel che mi serviva funziona alla grande!!! :) grazi

Go Up