aggiornare l’ host no-ip tramite Arduino più ethernet shield

salve volevo poter aggiornare l'ip pubblico del router assegndolo a un link (ddns con no-ip) direttamente da arduino in modo da potervi accedere e comandarlo per accendere e spegnere 4 led tramite una pagina html che si trova nell sd dello shiel ehetrnet .
tutto questo funziona sia in rete che da remoto però è una scocciatura dover tenere sempre il compuiter acceso per far aggiornare l'ip ho visto su internet che si puo fare aggiungendo questo pezzo di codice nel setup pero non funziona.


if (client.connect("dynupdate.no-ip.com", 80)) {
Serial.println("connessione in corso...");
client.println("GET /nic/update?hostname=NOMEHOST HTTP/1.0");
client.println("Host: dynupdate.no-ip.com");
client.println("Authorization: Basic UTENTE:PASSWDbase64");
client.println("User-Agent: Arduino Sketch/1.0 user@host.com");
client.println();
}
else {
Serial.println("connessione fallita");
}


questo è lo skech per pilotare i 4 led

ll.ino (7.84 KB)

up!!!!!! XD XD

Hai gia visto qui?

https://students.uniparthenope.it/?q=node/536&language=it

ho visto su internet che si puo fare aggiungendo questo pezzo di codice nel setup pero non funziona.

lo sai che il setup() viene eseguito solo una volta all'avvio del micro?
se quel pezzo deve essere ripetuto ogni tanto, metterlo nel setup non è la soluzione.

ciao

Si ho già visto , comunque anch'io ho pensato di metterlo nel loop ma s leggi le guide dicono di inserirlo nel setup

Per logica così come è messo ti dovrebbe fare un aggiornamento al servizio solo quando fai il reset poi se resta acceso dei giorni e l'IP cambia non ha più niente che invia l'aggiornamento, però sposti quel pezzo di codice in un altro punto dello sketch e risolvi, il problema è ............. funziona almeno la prima volta o nemmeno quella?

Quando dici non funziona che significa?
controlli il serial? che ti scrive?
hai errori di compilazione?

Fai vedere lo sketch completo che stai provando?

Se apro il seriale dice connesso pero se mi collego alla pagina sia in rete locale che da remoto rimane una schermata bianca... se levo quel pezzo di codice relativo al servizio di no ip funziona tutto perfettamente, comunque il pezzo di codice citato prima lo inserito nel loop
questo è lo sketch:


#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
// size of buffer used to capture HTTP requests
#define REQ_BUF_SZ   60

// MAC address from Ethernet shield sticker under board
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 26); // IP address, may need to change depending on network
EthernetServer server(80);  // create a server at port 80
File webFile;               // the web page file on the 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
boolean LED_state[4] = {0}; // stores the states of the LEDs

void setup()
{
    // disable Ethernet chip
    pinMode(10, OUTPUT);
    digitalWrite(10, HIGH);
    
    Serial.begin(9600);       // for debugging
    
    // initialize SD card
    Serial.println("Initializing SD card...");
    if (!SD.begin(4)) {
        Serial.println("ERROR - SD card initialization failed!");
        return;    // init failed
    }
    Serial.println("SUCCESS - SD card initialized.");
    // check for index.htm file
    if (!SD.exists("index.htm")) {
        Serial.println("ERROR - Can't find index.htm file!");
        return;  // can't find index file
    }
    Serial.println("SUCCESS - Found index.htm file.");
    pinMode(6, OUTPUT);
    pinMode(7, OUTPUT);
    pinMode(8, OUTPUT);
    pinMode(9, OUTPUT);
    
    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.connect("dynupdate.no-ip.com", 80)) {
    Serial.println("connesso");
 
    client.println("GET /nic/update?hostname=NOMEHOST HTTP/1.0");
    client.println("Host: dynupdate.no-ip.com");
    client.println("Authorization: Basic UTENTE:PASSWDbase64");
    client.println("User-Agent: arduino_ethernet/1.0 info@gmail.com");
 
    client.println();
  }
  else
{
    //Problemi nella connessione
    Serial.println("connessione fallita!");
  }

    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
                // limit the size of the stored received HTTP request
                // 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");
                    // remainder of header follows below, depending on if
                    // web page or XML page is requested
                    // Ajax request - send XML file
                    if (StrContains(HTTP_req, "ajax_inputs")) {
                        // send rest of HTTP header
                        client.println("Content-Type: text/xml");
                        client.println("Connection: keep-alive");
                        client.println();
                        SetLEDs();
                        // send XML file containing input states
                        XML_response(client);
                    }
                    else {  // web page request
                        // send rest of HTTP header
                        client.println("Content-Type: text/html");
                        client.println("Connection: keep-alive");
                        client.println();
                        // send web page
                        webFile = SD.open("index.htm");        // open web page file
                        if (webFile) {
                            while(webFile.available()) {
                                client.write(webFile.read()); // send web page to client
                            }
                            webFile.close();
                        }
                    }
                    // display received HTTP request on serial port
                    Serial.print(HTTP_req);
                    // 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)
}

// checks if received HTTP request is switching on/off LEDs
// also saves the state of the LEDs
void SetLEDs(void)
{
    // LED 1 (pin 6)
    if (StrContains(HTTP_req, "LED1=1")) {
        LED_state[0] = 1;  // save LED state
        digitalWrite(6, HIGH);
    }
    else if (StrContains(HTTP_req, "LED1=0")) {
        LED_state[0] = 0;  // save LED state
        digitalWrite(6, LOW);
    }
    // LED 2 (pin 7)
    if (StrContains(HTTP_req, "LED2=1")) {
        LED_state[1] = 1;  // save LED state
        digitalWrite(7, HIGH);
    }
    else if (StrContains(HTTP_req, "LED2=0")) {
        LED_state[1] = 0;  // save LED state
        digitalWrite(7, LOW);
    }
    // LED 3 (pin 8)
    if (StrContains(HTTP_req, "LED3=1")) {
        LED_state[2] = 1;  // save LED state
        digitalWrite(8, HIGH);
    }
    else if (StrContains(HTTP_req, "LED3=0")) {
        LED_state[2] = 0;  // save LED state
        digitalWrite(8, LOW);
    }
    // LED 4 (pin 9)
    if (StrContains(HTTP_req, "LED4=1")) {
        LED_state[3] = 1;  // save LED state
        digitalWrite(9, HIGH);
    }
    else if (StrContains(HTTP_req, "LED4=0")) {
        LED_state[3] = 0;  // save LED state
        digitalWrite(9, LOW);
    }
}

// send the XML file with analog values, switch status
//  and LED status
void XML_response(EthernetClient cl)
{
    int analog_val;            // stores value read from analog inputs
    int count;                 // used by 'for' loops
    int sw_arr[] = {2, 3, 5};  // pins interfaced to switches
    
    cl.print("<?xml version = \"1.0\" ?>");
    // checkbox LED states
    // LED1
    cl.print("<LED>");
    if (LED_state[0]) {
        cl.print("checked");
    }
    else {
        cl.print("unchecked");
    }
    cl.println("</LED>");
    // LED2
    cl.print("<LED>");
    if (LED_state[1]) {
        cl.print("checked");
    }
    else {
        cl.print("unchecked");
    }
     cl.println("</LED>");
    // button LED states
    // LED3
    cl.print("<LED>");
    if (LED_state[2]) {
        cl.print("on");
    }
    else {
        cl.print("off");
    }
    cl.println("</LED>");
    // LED4
    cl.print("<LED>");
    if (LED_state[3]) {
        cl.print("on");
    }
    else {
        cl.print("off");
    }
    cl.println("</LED>");
    
    cl.print("</inputs>");
}

// 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;
}

@ daniele_96 : come da REGOLAMENTO, punto 7. il codice DEVE essere inserito all'interno dei tag CODE (... che, in fase di edit, ti inserisce il bottone # ... terzultimo della seconda fila) ... altrimenti ... viene lo schifo che puoi ammirare nel tuo post, in cui alcuni caratteri vengono trasformati in smiles :~

Edita il tuo post e sistemalo, grazie.

Guglielmo

Fatto :slight_smile: Guglielmo .... Comunque nessuno sa come aiutarmi a risolvere il problema????

Scusa daniele, non per mettere in dubbio le tue capacità, ma sei sicuro di avere messo i tuoi dati corretti nella parte che hai aggiunto?

Ovvio non le ho messe nello sketch per non far vedere le mie informazioni

Se non sbaglio tu hai bisogno che lo sketch si comporti da client quando si connette a no-ip ed un server quando invece deve aspettare le connessioni di altri client.
Mi sembra invece che tu usi l'oggetto "client" sia per la connessione a no-ip che come server che accetta le connessioni. Forse si può fare ma credo che prima tu debba chiudere la connessione con no-ip.

E come si potrebbe fare ripeto se inserisco quello è mi collego all arduino rimane una pagina bianca

Sfortunatamente non lo so ma mi sembra di ricordare che ci dovrebbe essere qualche post riguardante il fatto che si voglia contemporaneamente un client e un server.
Una ricerca su questo forum mi ha fatto trovare questi:

Web server and web client together - Home Automation - Arduino Forum in inglese
Arduino1 Ethernet web-Server e Client insieme - Software - Arduino Forum in italiano e fa riferimento al primo

entrambi riportano esempi che però non ho provato.

questo servizio lo fanno anche i router, senza che vi sbattete tanto a farlo con arduino :smiley: .

però non hai ancora risposto, hai un account o no?

Pablos
dipende dai router, non tutti hanno questa funzione e inoltre non tutti lo fanno con no-ip. E se sei costretto ad usare il router del tuo ISP (pare sia il caso di Vodafone, ad esempio) non puoi metterne un altro.

Io uso la soluzione del router perché lo posso fare ma è utile sapere come avere contemporaneamente un client e un server, ad esempio per aggiornare i dati su un servizio online. Del resto l'esempio del secondo link l'hai scritto tu!

x iscrizione

Te lo compri se non lo hai serio :slight_smile: 26 euro ivato ... inoltre hai molteplici funzioni utilissime