Go Down

Topic: UdpNtpClient non mi funziona (Read 4034 times) previous topic - next topic

andreva

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

lestofante

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
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

andreva

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

Code: [Select]
/*

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
}

lestofante

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
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

pictux

Quote
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...


lestofante

non so che dirti, ma dal codice:
Code: [Select]
unsigned int localPort = 8888;      // local port to listen for UDP packets

e

Code: [Select]
Udp.begin(localPort);

mentre per l'invio

Code: [Select]
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..
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

andreva

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....

lestofante

inizia a settare firewall e/o NAT, secondo me funziona da solo poi
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

pictux

#8
Sep 18, 2011, 09:41 pm Last Edit: Sep 18, 2011, 09:58 pm by pitusso Reason: 1
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
 ]:D
Mi sembrava mancasse qualcosa.. il gateway!
Prova ad impostare anche il gateway, nello sketch:

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

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

Code: [Select]
Ethernet.begin(mac,ip,gw);

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



andreva

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.

lestofante

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?
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

andreva

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!

lestofante

beh certo, la libreria udpbitewise.h non è ufficiale e la devi scaricare e mettere nella cartella dello sketch, altrimenti non va.
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

andreva

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

lestofante

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
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

Go Up