enc28J60 and Arduino (6)

luca Saturday April 28th, 2012 44

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

44 Comments »

  1. Domenico Sunday April 29th, 2012 at 01:35 PM - 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 Sunday April 29th, 2012 at 01:46 PM - 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 Sunday April 29th, 2012 at 04:22 PM - 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 Sunday April 29th, 2012 at 10:29 PM - 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 Monday April 30th, 2012 at 05:14 PM - Reply

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

    Saluti

  5. Domenico Monday April 30th, 2012 at 05:45 PM - 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 Thursday May 3rd, 2012 at 06:52 PM - 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 Thursday May 3rd, 2012 at 08:11 PM - 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 Friday May 4th, 2012 at 07:25 PM - 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 Friday May 4th, 2012 at 07:50 PM - 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 Monday May 7th, 2012 at 02:07 PM - 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 Wednesday June 6th, 2012 at 09:00 AM - 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 Wednesday June 6th, 2012 at 11:34 AM - Reply

      Ciao Cesare,

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

      • Cesare Thursday June 7th, 2012 at 08:42 AM - 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 Sunday June 17th, 2012 at 09:49 AM - 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 Wednesday July 11th, 2012 at 06:16 PM - 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 Friday July 13th, 2012 at 07:25 PM - 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 Thursday July 26th, 2012 at 11:20 AM - 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 Thursday August 2nd, 2012 at 08:47 AM - 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 Monday August 6th, 2012 at 08:27 AM - 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 Friday August 10th, 2012 at 05:00 PM - Reply

      Ciao Carlo

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

  14. Francesco Wednesday October 10th, 2012 at 12:28 PM - 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 Wednesday October 10th, 2012 at 12:52 PM - 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 Wednesday October 10th, 2012 at 04:39 PM - Reply

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

    • luca Wednesday October 10th, 2012 at 07:02 PM - Reply

      Ciao

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

  16. dan Saturday October 20th, 2012 at 09:19 PM - 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 Sunday October 21st, 2012 at 03:05 AM - 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 Sunday October 21st, 2012 at 10:47 AM - 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.

    • luca Friday October 26th, 2012 at 08:22 AM - Reply

      Hi Dan

      You can use the indexOf() method of the String object (http://arduino.cc/en/Reference/StringIndexOf) to find, in the received string, the position of ‘pck=’ string… then you can use the same method to find the next occurrence of ‘&’: your data (’123′) is located between those two indices.
      Here’s a tutorial explaining this method: http://arduino.cc/en/Tutorial/StringIndexOf

      Let me know!

  18. Yee Ho Thursday November 8th, 2012 at 07:30 PM - 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 Thursday November 8th, 2012 at 08:12 PM - 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 Monday March 18th, 2013 at 07:56 PM - 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 Saturday March 30th, 2013 at 04:47 PM - 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 Monday April 1st, 2013 at 02:55 PM - 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 Wednesday April 3rd, 2013 at 11:32 PM - 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 Monday April 8th, 2013 at 08:03 PM - 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 Monday May 6th, 2013 at 12:08 PM - 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 Tuesday May 7th, 2013 at 08:21 AM - 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 Thursday May 16th, 2013 at 05:44 PM - 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 Sunday May 19th, 2013 at 08:08 PM - 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 Sunday November 24th, 2013 at 10:21 PM - 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 Wednesday November 27th, 2013 at 02:30 PM - 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.

Leave A Response »