enc28J60 and Arduino (6)

luca 28/04/2012 46

In this blog post, I’m going to show you how to write a sketch to update a DNS record hosted by one of the most famous Dynamic DNS service providers, no-ip.

Dynamic IP addresses

If you connect to Internet using a home or mobile connection, you’ll probably have a dynamic public IP address, that is it changes everytime you connect.

If you need to talk to a device on Internet, you need to write – in the message you send on the net – its public IP address: if this IP is dynamic, you may not know it.

Dynamic DNS

In Internet you can find free Dynamic DNS (DDNS) services: they allow you to associate a name you choose with an IP address and they allow you to keep that association updated.

The update could be done in different ways:

  • using a client running on your PC;
  • with a feature present in your router:

  • asking Arduino to do it for us ;)

No-IP

One of the most used site offering dynamic DNS service is No-IP.

If you register for free to No-IP Free service, you can configure up to 5 hosts for Hosts/Redirects feature:

For this tutorial, I registered the following host: enctutorial.no-ip.info.

DDNS Client

Every DDNS client performs the following steps:

  • gets the actual public IP (asking the router, an external website…);
  • compares that IP with the one resolved from DNS alias;
  • if they are different, it updates the DNS record via service provider’s API.

In the next page, a DDNS client for Arduino…

Pages: 1 2

46 Comments »

  1. Domenico 29/04/2012 at 13:35 - Reply

    Ciao Luca,

    Durante la compilazione dello sketch, ho il seguente errore:
    In function ‘void checkNoIPResponse()’:
    _6_NoIPClient:187: error: ‘class EtherCard’ has no member named ‘tcpReply’.

    Forse, ai aggiornato la libreria EtherCard ?

    Saluti

  2. luca 29/04/2012 at 13:46 - Reply

    Hello!

    Please update your Ethercard library: my sketch uses some new features they added in the last month: as usual you can follow the instructions I wrote in a previous post:
    http://www.lucadentella.it/2012/02/12/enc28j60-e-arduino-1/

  3. Domenico 29/04/2012 at 16:22 - Reply

    Ciao Luca,

    Ora funziona.
    Ma ho già un nuovo problema; quando inserisco la mia webpage, richiamandolo dal loop come subrutine, dopo i controlli effettuati da switch, semba che funzioni tutto ma dalla seriale, vedo che non riesce più a ricevere correttamente l’IP dopo aver fatto richiesta al tuo sito, vedo dei numeri strani (es. 3,75) e non effettuando la comparazione giusta, fa richiesta a no-op non andando a buon fine.
    Il tutto torna normale, quando elimino dal loop il richiamo alla mia web page.

    Sai darmi una dritta, ti ringrazio in anticipo.

    • luca 29/04/2012 at 22:29 - Reply

      Ciao Domenico,
      purtroppo la libreria Ethercard non gestisce nativamente più connessioni… è quindi possibile che le due chiamate (quella per ottenere l’IP pubblico e quella per la tua webpage) in qualche modo si “sovrappongano”. Prova ad inserire il tuo codice (quello che immagino “risponde” ad una richiesta Web) nel metodo checkPublicIP() mettendo un else… in questo modo il tuo codice dovrebbe essere chiamato solo nello stato di IDLE. Mandami cmq il tuo codice via mail che ci do una occhiata!

  4. Domenico 30/04/2012 at 17:14 - Reply

    Non riesco a trovare il tuo indirizzo e-mail.
    Se vuoi, puoi inviarmelo al mio .

    Saluti

  5. Domenico 30/04/2012 at 17:45 - Reply

    Ciao Luca,

    Anche con l’else in checkPublicIP(), fa la stessa cosa.
    Secondo me è necessario aggiornare la pagina web solo quando ha finito il confronto con esito positivo.

    Saluti

  6. Domenico 03/05/2012 at 18:52 - Reply

    Ciao Luca,

    Ora Funziona tutto.
    Ti chiedo un’ultima gentilezza, ho provato ad impostare un ip statico, con scarsi risultati, i valori del gateway e del net mask, restano a 0,0,0,0 bloccandosi apparentemente il flusso del programma.

    Saluti

    • luca 03/05/2012 at 20:11 - Reply

      Ciao Domenico! ottimo quindi le modifiche al tuo sketch erano veramente minimali, era già scritto bene!

      Per impostare la netmask c’è un “trucco” visto che per ora non esiste un metodo nativo… vedi se quello che indico nel commento al primo articolo:
      http://www.lucadentella.it/2012/02/12/enc28j60-e-arduino-1/
      ti funziona…

  7. Domenico 04/05/2012 at 19:25 - Reply

    Ciao Luca,

    Sono riuscito ad impostare l’IP statico, è stato sufficente posticipare if (!ether.staticSetup(myip)) , dopo la il setup del DHCP.
    Grazie a te, sono a buon punto, ma ti devo comunicare che avvolte, sempre alla prima accensione, la subnet mask e i gateway sono a zero bloccando il flusso del programma e quando il modem si riavvia ripetutamente, causa rete operatore, il programma sembra che si blocchi senza effettuare richieste per parecchio tempo (necessario reset hardware per ripartire), probabilmente dipende dai tempi di risposta del modem.
    Secondo te se metto un goto nel setup che ripete il setup DHCP fino a che non va abuon fine, può essere una soluzione ?

    Grazie di tutto.

    Saluti

    • luca 04/05/2012 at 19:50 - Reply

      Ciao Domenico,

      il setup via DHCP ha un timeout di 30 secondi, oltre il quale effettivamente rinuncia.

      Se però utilizzi un setup statico, perché chiami anche il setup via DHCP? I due setup sono in alternativa: nel tuo caso semplicemente imposta tutto statico: l’IP e il gateway con staticSetup() e la subnet come ti dicevo nell’altro commento.

  8. Domenico 07/05/2012 at 14:07 - Reply

    Ciao LUCA,

    Ora funziona tutto, ho impostato tutto manualmente(IP, Mask e Gateway); terro il dispositivo collegato per un pò di tempo, per verificare l’affidabilità.

    Grazie di tutto.
    Saluti

  9. Cesare 06/06/2012 at 09:00 - Reply

    Ciao Luca, vorrei sapere se ti è possibile fare una guida che spiega come collegarsi ad un feed rss e poi stamparlo su seriale.
    Grazie
    Cesare

    • luca 06/06/2012 at 11:34 - Reply

      Ciao Cesare,

      è un ottimo spunto, vedo di approfondire e di dedicargli un prossimo articolo!

      • Cesare 07/06/2012 at 08:42 - Reply

        Grazie mille, non so se ti ricordi, sono quello dell’ rfid sul forum di arduino!
        Comunque io sarei molto interessato al fatto dell’ rss perchè vorrei fare in modo che asrduino mi stampi i feed su una stampante termica del gameboy!

  10. Cesare 17/06/2012 at 09:49 - Reply

    scusa se ti disturbo ancora, ma riusciresti a darmi lo schema della tua schedina, visto che in casa avrei già die enc28j60?

  11. Domenico 11/07/2012 at 18:16 - Reply

    Ciao Luca,

    Non ci si sente da un pò.
    Volevo riferirti la mie esperienze con il tuo codice per la richiesta NO_IP.
    Premetto che ho modificato il tuo codice iserendo come getIP_web “www.indirizzo-ip.com” modificando opportunamente la seguente linea di codice:
    for(int i = 0; i < strlen(reply) – 182; i++) actualIp = actualIp + reply[181 + i] per filtrare solo la stringa dell'IP; ho eliminato la parete del web page, questo vuol dire che arduino si limita a verificare e a fare richiesta a no_ip, inoltre ho lasciato il DHCP automatico.
    Funziona tutto alla grande con una Telecamera IP collegata al router. Avvolte nell'arco della giornata, (nel caso di oggi intoro alle 18,00 circa) non sono riuscito più a collegarmi dall'esterno. Visto che ero fuori ho pensato che il modem avesse uno dei soliti periodi che si disconnette, e per parecchio tempo non stabilisce la connessione. Invece rientrato in casa ho notato che il modem era regolarmente connesso, allora ho disalimentato arduino (senza disalimentare il modem) per qualche secondo e poi ha ripreso a funzionare regolarmete.
    Secondo te è possibile che ci sia un baco software nel codice oppure perde il settaggio automatico del DHCP ?
    Potrebbe essere una buona idea far riavviare arduino automaticamente quando si verificano questi eventi inprevisti ?

    Grazie in anticipo.

    • luca 13/07/2012 at 19:25 - Reply

      Ciao Domenico! grazie per il feedback…
      La configurazione via DHCP avviene solo nel setup(): finché lo sketch è in esecuzione, utilizza sempre l’IP assegnato.
      Hai provato a vedere cosa Arduino stava inviando sulla seriale? Potrebbe esserci una condizione che lo manda in blocco (es. si aspetta una risposta che mai arriverà perché nel frattempo è caduta la connessione)… fammi sapere!

  12. Antonio 26/07/2012 at 11:20 - Reply

    Ciao Luca, innanzitutto complimenti per la linearità utilizzata nello scrivere i tutorial che anche per uno come me, che è un “novello” con arduino, risultano comprensibilissimi.
    Vorrei poter comandare gli ingressi/uscite della board tramite pagina web, ma non ho idea su come partire per fare il tutto.
    Ho provato librerie alternative a questa, che non conoscevo (santo google), ma ottengo che o non parte proprio il webserver (rimane in clessidra il browser) come se fosse troppo il carico di info passate via web, utilizzo client.print() oppure se riesco a bilanciare la pagina sopo un po si blocca. Tralaltro se attivo la seriale è finita: non parte proprio il web server.. non è che mi puoi indirizzare (a livello di codice) come inizializzare l’accensione/spegnimento di una uscita? Poi proverei io a estendere a più ingressi/uscite. Ancora complimenti e grazie per quello che potrai fare.

    • luca 02/08/2012 at 08:47 - Reply

      Ciao Antonio e grazie per i complimenti!

      Settimana prossima sarò in ferie e pubblicherò finalmente un tutorial su quanto chiedi (pagina web per attivare/disattivare uscite e leggere lo stato degli ingressi) quindi continua a seguire il blog ;)

  13. carlo 06/08/2012 at 08:27 - Reply

    ciao Luca, complimenti per il sito e le guide (ottime).
    ho un modulo eth con chipset enc28j60 (che conosci gia bene) non riesco a farlo andare assolutamente.
    Vorrei innanzi tutto capire se il modulo funziona o è guasto.
    L’unico script che mi da qualche speranza è “backSoon” perche il router lo rileva.
    Poi sia come client, sia come server non ce modo di farlo andare assolutamente. Ho provato tutte le configurazioni possibili e inimmaginabili compresa quella del produttore. Ma niente.
    Io lo uso in accoppiata con un Freeduino 1.16/atmega328pu

    • luca 10/08/2012 at 17:00 - Reply

      Ciao Carlo

      se usi il mio primo sketch, che cosa ti appare sul serial monitor?

  14. Francesco 10/10/2012 at 12:28 - Reply

    Ciao, io volevo sapere se utilizzanto lil modulo ethernet con il Wiznet W5100 come chipset ci sono dei problemi, o funziona tutta allos tesso modo??
    Grazie.

    • luca 10/10/2012 at 12:52 - Reply

      Ciao Francesco,

      no, il modulo Wiznet ha un funzionamento diverso. Visto che è il modulo scelto per l’ethernet shield “ufficiale” di Arduino, puoi usare le librerie messe a disposizione: http://www.arduino.cc/en/Reference/Ethernet

  15. Francesco 10/10/2012 at 16:39 - Reply

    Quindi a parte il cambio di librerie il codice resta uguale o mi tocca modificarlo??
    Grazie.

    • luca 10/10/2012 at 19:02 - Reply

      Ciao

      mi dispiace ma devi completamente rifare il codice: il mio tutorial è specifico per lo shield con il chip enc28j60

  16. dan 20/10/2012 at 21:19 - Reply

    Hi Luca,

    I studied your code and I really liked it a lot so I am using bits of it in my own sketch but now I’m stuck and I know no one who can help me so I thought maybe u can. I have a problem in a webclient after ether.tcpSend() Using your code I can get the response but … here comes the tricky part …if(strstr(reply, “rec=OK”) != 0)
    { Serial.println(“rec=OK”); } works but what i really want to do is something like this
    if(strstr(reply,”svr_dig=”+3) == 0)
    {
    int rate = atoi(reply+9); //get the value for the dig pin
    Serial.print(“svr_dig1=”);
    Serial.println(rate);
    } and now I’m stuck.

    Please help with an ideea or guidance.

    Thank you in advance.

    • luca 21/10/2012 at 03:05 - Reply

      Hi Dan,

      could you please explain what are you trying to implement? A webserver which gets queries from a browser about Arduino’s PINs and answers with pins’ statuses?
      thanks

  17. dan 21/10/2012 at 10:47 - Reply

    Thank for fast response Luca,

    I have a client which sends in a GET request pin status to a webserver (apache with php) and then apache responds with a page. The content of the response page is something like this {rec=OK&pck=123&svr_dig1=1&svr_dig2=1&svr_dig3=1&svr_dig4=1} . I need to parse this response and get the values of pck, svr_dig1, etc and implement the changes in arduino. I’m not really a programer so I find it difficult to understand where and how should I interpret this. Now with your code I can determine that the rec=OK is there but this is only a comparasion and with PWM this would not work really well since the code would be very large. Point me to the right direction please.

    Grazie.

  18. Yee Ho 08/11/2012 at 19:30 - Reply

    Thank you for the lesson, but i can’t update the no-ip, below is the output
    Thank you

    NoIP Client Demo

    Ethernet controller initialized

    Failed to get configuration from DHCP
    IP Address: 0.0.0.0
    Netmask: 0.0.0.0
    Gateway: 0.0.0.0

    Unable to resolve IP for http://www.lucadentella.itUnable to resolve IP for dynupdate.no-ip.com

    • luca 08/11/2012 at 20:12 - Reply

      Hi!

      Are you using a DHCP server in your network? It seems Arduino can’t obtain an IP address… try with a static setup (like the first example in the tutorial)

    • sam 18/03/2013 at 19:56 - Reply

      check on the MAC address and also check on the CS pin u r using,,,,default CS pin of ethercard library is 8 but for some enc28j60 its 10.

  19. ali 30/03/2013 at 16:47 - Reply

    Hi Luca;

    we are able to control dc motor on local network with arduino but we would like to make it accessible on internet from everywhere.
    we got no-ip host but we don’t know what to do as next step.
    Could you please help us?
    thanks

    • luca 01/04/2013 at 14:55 - Reply

      Hi Ali

      you only need to configure your router to forward incoming connection on port 80 (I assume you’re implementing a web server on Arduino) to the internal IP of your Arduino…

  20. Maurizio 03/04/2013 at 23:32 - Reply

    Ciao Luca,
    ho scoperto il tuo tutorial e implementato (copiato pari pari) il tuo codice con le mie credenziali per aggiornare il mio account no-ip.
    Tutto sembra funzionare a meraviglia però dopo circa 6 o 7 tentativi di aggiornamento andati a buon fine, lo sketch mi informa sul monitor seriale che non è possibile risolvere il mio ip esterno e tutto si blocca… Ho provato anche a sostituire il router ma succede la stessa cosa.
    Non sono molto pratico di programmazione ma non credo voglia dire nulla il fatto che tu definisca lo sketch come ‘NoIp Client Demo’ vero?!
    La variabile Max_Attempts centra qualcosa?
    Grazie

    • luca 08/04/2013 at 20:03 - Reply

      Ciao Maurizio,

      è strano… anche se si chiama “demo”, lo sketch non ha limiti o blocchi. Prova ad aumentare le due variabili:
      REQUEST_TIMEOUT -> tempo di attesa per una risposta
      MAX_ATTEMPTS -> numero massimo di tentativi prima di rinunciare

      e fammi sapere come va…

  21. Tonino 06/05/2013 at 12:08 - Reply

    Buongiorno, sarei interessato alla realizzazione fisica di questo progetto, in quanto avrei necessità di sopperire ad una mancanza del router presente in questa azienda.
    Mi domandavo quanto costassero i vari componenti per realizzarlo, il solo shield ethernet l’ho trovato su ebay a 8 Euro ma il resto?
    Grazie in anticipo e scusate la domanda da completo niubbo :D

    • luca 07/05/2013 at 08:21 - Reply

      Buongiorno, se hai la necessità di qualcosa che gestisca un DynDNS, secondo me ti conviene o utilizzare un programma software installato su un vostro server, oppure acquistare un piccolo router tipo questo che tra le varie funzionalità ha anche quella che vi serve ad un costo molto limitato (20 euro).

  22. Tonino 16/05/2013 at 17:44 - Reply

    Grazie per la risposta, ma purtroppo non posso sostituire il router in quanto quello della Telecom con voip e particolare.
    La necessità di utilizzare l’arduino per fare questo lavoro è dettata dalla volontà di avere il pc spento ed accenderlo tramite wakeonlan tramite internet… ((magari un progetto che lo faccia dall’arduino?)).
    Cmq per non divagare ho trovato su ebay come dicevo lo shield a 8 euro – ENC28J60 .
    Inoltre penso che mi serva questo : Arduino Compatible Uno Rev 3.0 development board
    sempre su Ebay.
    Oltre ad un alimentatore, mi serve altro per programmarlo?

    • luca 19/05/2013 at 20:08 - Reply

      Ciao Tonino, il mio suggerimento non era di sostituire il router ma di utilizzare il TPLink come semplice dispositivo, connesso al tuo router o ad uno switch, per aggiornare il record DYNDNS. Comunque ti serve un Arduino e un alimentatore, la programmazione si fa via USB senza necessità di altro hardware dedicato.

  23. Pawel 24/11/2013 at 22:21 - Reply

    Hi Luca! First – thank you for your great tutorials! Second – have you considered millis() overflow? After ~50 days millis start over from zero… So noip client won’t work correctly after 50 days. Do you have any solution to this?

    • luca 27/11/2013 at 14:30 - Reply

      Hi Pawel

      you’re right… I’ve never considered that, not thinking my sketch could run without interruptions for 50+ days ;)
      A simple solution is to check also if the current millis() is less than the previous one (this happens only in the overflow event) and, if so, consider the interval has passed.

  24. drazen 05/10/2014 at 21:18 - Reply

    Does your php script still working?
    I m getting “Unable to resove IP for http://www.lucadantella.it” message.

    • luca 06/10/2014 at 07:49 - Reply

      Hi! Sure it works but the site is lucadEntella.it, not lucadAntella.it ;)

Leave A Response »