UdpNtpClient non mi funziona

Utilizzo una scheda arduino duemilanove con lo shield ethernet (quello con la micro sd).Ho caricato l' esempio fornito nelle librerie ethernet di arduino UdpNtpClient, ho settato l' indirizzo IP nello skech lo carico sulla scheda, apro la seriale ma non visualizza nulla.Qualche consiglio?Grazie

a parte che vorrei capire che impostazioni hai usato...
comunque l'udp, come il tcp, non passa via seriale ma via ethernet.
Quindi se vuoi vedere qualcosa devi fare a lato PC un programma apposta che legga sulla giusta porta i datagrammi UDP in arrivo

Grazie per l' interessamento, il codice che ho usato è questo:

/*

 Udp NTP Client
 
 Get the time from a Network Time Protocol (NTP) time server
 Demonstrates use of UDP sendPacket and ReceivePacket 
 For more on NTP time servers and the messages needed to communicate with them, 
 see http://en.wikipedia.org/wiki/Network_Time_Protocol
 
 created 4 Sep 2010 
 by Michael Margolis
 modified 17 Sep 2010
 by Tom Igoe
 
 This code is in the public domain.

 */

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

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {  
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 
  192,168,1,199 };


unsigned int localPort = 8888;      // local port to listen for UDP packets

byte timeServer[] = { 
  192, 43, 244, 18}; // time.nist.gov NTP server

const int NTP_PACKET_SIZE= 48; // NTP time stamp is in the first 48 bytes of the message

byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets 

void setup() 
{
  // start Ethernet and UDP
  Ethernet.begin(mac,ip);
  Udp.begin(localPort);

  Serial.begin(9600);
}

void loop()
{
  sendNTPpacket(timeServer); // send an NTP packet to a time server

    // wait to see if a reply is available
  delay(1000);  
  if ( Udp.available() ) {  
    Udp.readPacket(packetBuffer,NTP_PACKET_SIZE);  // read the packet into the buffer

    //the timestamp starts at byte 40 of the received packet and is four bytes,
    // or two words, long. First, esxtract the two words:

    unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
    unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);  
    // combine the four bytes (two words) into a long integer
    // this is NTP time (seconds since Jan 1 1900):
    unsigned long secsSince1900 = highWord << 16 | lowWord;  
    Serial.print("Seconds since Jan 1 1900 = " );
    Serial.println(secsSince1900);               

    // now convert NTP time into everyday time:
    Serial.print("Unix time = ");
    // Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
    const unsigned long seventyYears = 2208988800UL;     
    // subtract seventy years:
    unsigned long epoch = secsSince1900 - seventyYears;  
    // print Unix time:
    Serial.println(epoch);                               


    // print the hour, minute and second:
    Serial.print("The UTC time is ");       // UTC is the time at Greenwich Meridian (GMT)
    Serial.print((epoch  % 86400L) / 3600); // print the hour (86400 equals secs per day)
    Serial.print(':');  
    Serial.print((epoch  % 3600) / 60); // print the minute (3600 equals secs per minute)
    Serial.print(':'); 
    Serial.println(epoch %60); // print the second
  }
  // wait ten seconds before asking for the time again
  delay(10000); 
}

// send an NTP request to the time server at the given address 
unsigned long sendNTPpacket(byte *address)
{
  // set all bytes in the buffer to 0
  memset(packetBuffer, 0, NTP_PACKET_SIZE); 
  // Initialize values needed to form NTP request
  // (see URL above for details on the packets)
  packetBuffer[0] = 0b11100011;   // LI, Version, Mode
  packetBuffer[1] = 0;     // Stratum, or type of clock
  packetBuffer[2] = 6;     // Polling Interval
  packetBuffer[3] = 0xEC;  // Peer Clock Precision
  // 8 bytes of zero for Root Delay & Root Dispersion
  packetBuffer[12]  = 49; 
  packetBuffer[13]  = 0x4E;
  packetBuffer[14]  = 49;
  packetBuffer[15]  = 52;

  // all NTP fields have been given values, now
  // you can send a packet requesting a timestamp: 		   
  Udp.sendPacket( packetBuffer,NTP_PACKET_SIZE,  address, 123); //NTP requests are to port 123
}

ah ok, tu stai interpellando un server esterno (time.nist.gov) per chiedergli l'ora, la leggi e la rispedisci via seriale.
Secondo me il problema è dipeso dalla nat o dal firewall sul router. Guarda qualche gioda per aprire le porte di emule, il concetto è lo stesso però tu devi aprile la 8888 UDP

Secondo me il problema è dipeso dalla nat o dal firewall sul router.

..io non credo.

Il problema lo avrà molto probabilmente per il traffico in ingresso (tipo emule), ma l'interrogazione ad un server ntp non richiede aperture di porte particolari sul router.
La prova del 9 è che ti installi un client ntp sul computer e provi ad utilizzarlo.

Cmq ho provato anche io, proprio ora (prova empirica, niente di analitico).
Con le vecchie librerie non c'erano problemi, ma con quella distribuita con l'ambiente 022 sembra non funzionare....
Naturalmente con un ntpdate su pc, problemi non ce ne sono...

non so che dirti, ma dal codice:

unsigned int localPort = 8888;      // local port to listen for UDP packets

e

Udp.begin(localPort);

mentre per l'invio

Udp.sendPacket( packetBuffer,NTP_PACKET_SIZE,  address, 123); //NTP requests are to port 123

UDP è connectionless, quindi per l'inteerogazione, ovvero inviare il messaggio è tutto ok perchè di solito sia il firewall che la NAT sono permissivi per le connessioni in uscita. Ma se vuoi ricevere un datagramma (la risposta del server) devi aprire una porta.

Se mi dici che prima della 22 funzionava mi sembra molto strano, o avevi aperto a priori la porta o era attraverso il TCP..

A me basterebbe trovare un sistema per sincronizzare l' ora da internet, in giro c'è tanto materiale ma ancora non ci sono riuscito.Gli esperimenti continuano....

inizia a settare firewall e/o NAT, secondo me funziona da solo poi

lesto,
come già detto con client ntp da pc funziona tutto a dovere, usandolo con libreria eth non va una cippola, quindi non credo si tratti di configurazione del router (e nel mio il firewall c'è, ed è tosto).
Che fosse UDP ne son certo, mo' per sfizio riesumo qualche vecchia libreria e mi rimetto a provare.

EDIT
]:smiley:
Mi sembrava mancasse qualcosa.. il gateway!
Prova ad impostare anche il gateway, nello sketch:

byte gw[] = {xxx, xxx, xxx, xxx };   // Gateway IP address

..e nel setup ad inizializzare la Eth di conseguenza:

Ethernet.begin(mac,ip,gw);

Questo basta a far funzionare lo sketch.
PS. ci sarà da aggiornare l'esempio della libreria Ethernet.h ...

Ho inserito il gateway e anche la mask, ma di funzionare non ne vuole sapere.Ho provato anche altri esempi che utilizzano la libreria udpbitewise ma durante la compilazione mi da un errore come se non fosse installata la libreria.

potresti essere più specifico postando l'errore? sicuro che non si basino su una libreria esterna che devi "installare", ovvero copiare all'interno della cartella dello sketch?

L' errore che mi da durante la compilazione dello sketch contenuto nella libreria time è:

TimeNTP.cpp:10:82: error: UdpBytewise.h: No such file or directory
TimeNTP.cpp:12:2: error: #error : UDP packet size to small - modify UdpBytewise.h to set buffers to 64 bytes
TimeNTP.cpp: In function 'long unsigned int getNtpTime()':
TimeNTP:80: error: 'UdpBytewise' was not declared in this scope
TimeNTP.cpp: In function 'long unsigned int sendNTPpacket(byte*)':
TimeNTP:91: error: 'UdpBytewise' was not declared in this scope
TimeNTP.cpp: In function 'long unsigned int getUlong()':
TimeNTP:108: error: 'UdpBytewise' was not declared in this scope
TimeNTP.cpp: In function 'void write_n(int, int)':
TimeNTP:118: error: 'UdpBytewise' was not declared in this scope

di solito questo errore me lo da quando manca la libreria!

beh certo, la libreria udpbitewise.h non è ufficiale e la devi scaricare e mettere nella cartella dello sketch, altrimenti non va.

Ho provato ma non è cambiato nulla.
Ho provato sia con la versione 22 e 19.

fai così: un piccolo programmino lato PC che ascolta una porta UDP (la 123) e che quando gli arriva una richiesta risponda alla 8888.
se usi per connetterti l'ip locale del pc e funziona, ma non se usi l'ip pubblico, allora è un problema di nat o firewall

Ho provato ma non è cambiato nulla.
Ho provato sia con la versione 22 e 19.

..scusa, intendi che l'errore è sempre lo stesso, o che non funziona?

L' errore durante la compilazione lo da solo con lo sketch che usa la libreria udpbitewise, mentre con lo sketch presente negli esempi della libreria ethernet il programma gira ma non visualizza l' ora.

Grazie Lesto per le indicazioni, ma non saprei da dove partire per fare quelle prove.

che router hai? prova a cercare la marca+ "aprire le porte" o "emule" e vedi se trovi qualcosa. oppure in breve:
nelle stato della tua connessione di internet (ifconfig o ipconfig da terminale, uno è per win l'altro per unix (linux, mac , solaris?)) cerca il gateway, 99% è qualcosa del tipo
192.168.1.1 o 192.168.0.1 ma non è detto. (che tra l'altro è lo stesso GATEWAY che dai in pasto all'arduino, o meglio alla ethernet shield)
copia questo numero nella barra degli indirizzi del browser (firefox, ie, etc..) e ti verrà chiesta l'utente e la password del router:
99& delle volte sono user, user; admin, admin;admin, password. Se non funzionano cerca il manuale del tuo modello, sul sito del produttore o della compagnia telefonica se marchiato de essi, è sicuro al 100% che lo trovi con tanto di guide su come impostare la nat/firewall (di solito se hai uno non hai l'altro attivo).

ora sei dentro. apri la sceda del firewall (e/o nat) e consenti le connessioni in entrata sulla porta 8888, se vuole anche l'ip di destinazione (caso nat) inserisci quello dell'arduino (192,168,1,199 nel tuo caso)

se ancora non funziona posta il codice completo che usi

Riprendo questo topic perchè ho più o meno lo stesso problema di andreva.
Però ho notato che se imposto un ip fisso non funziona ma se utilizzo il dhcp si.

Da che può dipendere?
Queste le mie impostazioni di rete:

byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1, 12);
byte mask[] = { 255, 255, 255, 0 };
byte gw[] = {192, 168, 1, 254 };

Tutti i pc che utilizzo usanto ntp per sincronizzare l'ora quindi il router funziona.

forse hai fastweb? o comunque qualche limitazione imposta sugli IP che puoi usare. In teoria se imposti come fisso un ip che in passato ti è stato assegnanto (quindi probabilmente OK per la limitazione) dovrebbe funzionare.
Oppure per errore hai assegnato un IP già in uso, e quindi è stato rifiutato