Probleme mit UDP

Guten Abend,

ich wollte gerade mal das Bsp-Sketch "udpntpclient" laden...
Normalerweise sollte doch im serialmonitor die zeit angezeigt werden oder?

Bei mir kommt nix...
Habe andere Sketche probiert, die auch im Serialmonitor schreiben, da gehts.

Meine baudrate is 9600
Habe Arduino 0022 aufm PC.
Mein Borad ist ein Mega 2560.
Muss man noch was beachten oder wo liegt hier der Hund begraben?

Danke für eure Hilfe.

Hier der Code aus dem BspSketch

/*

 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,177 };


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
}

Ich gehe davon aus, dass:
Das Ethernet Shield auf das Board gesteckt und Netzwerk-Zugang hat.

Bekommst du eine Fehlermeldung oder sonst einen Anhaltspunkt der weiterhelfen kann?

Hi,

ist das Ethernetshield für den Gebrauch am Mega geeignet?

Gruß

Sebastian

Hi,

Also ja das Netzwerkkabel steckt drinne.
Hatte auch schon den Sketchwebserver drauf und konnte so den sattus der pins im browser sehen. Dies und die Aufschrift auf dem Ethernet Shield "MEGA compatible" sagt mir das es für den MEGA geeignet ist.

Ne fehlermeldung kommt beim Hochladen nicht.

Ich nehm den code so wie er oben ist und lade ihn hoch und es kommt keine fehlermeldung aber auch keien reaktion im serialmonitor...
hab auch schon geguckt ob der COM-Port stimmt...und der stimmt auch.

ist das Ethernetshield für den Gebrauch am Mega geeignet?

Ja, die aktuelle Version ist Mega kompatibel. Steht sogar auf dem Board :wink:

Hat das Board auch Zugang zum Internet?
Sonst ist der Timeserver nicht erreichbar.

Hab grad ma ein paar ausgaben gemacht:

void loop()
{
  Serial.print("1 ");   //Ausgabe um zu schauen ob überhaupt was geht
  sendNTPpacket(timeServer); // send an NTP packet to a time server

Bis dahin gehts. Bei der Funktion

sendNTPpacket(timeServer);

gehts net weiter.
Allerdings läuft die loop weiter so dass mir der Serialmonitor etwas später wieder ne 1 auspuckt.
Allerdings wenn ich weiter unten im code weitere"Prüfzahlen" ausgeben lassen will kommt da nix

Hm also ich bin jedenfalls im Internet und das board ist im selben netz wie ich. allerdings weis ich nicht ob das jetzt im netz ist. kann auch keine ports an der firewall freischalten, da ich grad auf arbeit bin... das teste ich dann ma daheim. ich melde michd ann wieder(morgen)

Die "1" wird bei jedem Loop ausgegeben.

Aber die nachfolgende serielle Ausgabe erfolgen nur falls Udp.available = True

  if ( Udp.available() ) {

da ich grad auf arbeit bin

Was ist das für ein Job wo man am Samstag um 21 Uhr arbeitet und dabei mit dem Arduino basteln kann? :wink:

Also so weit ich jetzt weis, muss man dem timeserver was senden.
Ich denke ma die Funktion sendNTPpacket(); macht dies.
Allerdings kann ich nirgend erkennen was die senden soll nicht in der.h und niocht in der .cpp

Was ist das für ein Job wo man am Samstag um 21 Uhr arbeitet und dabei mit dem Arduino basteln kann? Wink

ich arbeite in nen Internetcafe ;D

Guten Tag,
also ich habs jetzt ma zuhause probiert...auch da kommt nix.
hab den arduino angepingt...das geht.
muss man denn irgendwas beachten, wenn man sich die zeit aus dem internet holen will?
bin grad echt am verzweifeln...

Ich habe dein Sketch auf meinen Arduino geladen, Ethernet Shield aufgesetzt und ans interne Netzwerk angeschlossen.

Nach Start Serial Monitor öffen und schon wird die Zeit angezeigt.

Kanns du mir sagen ob du irgend was an den ports gemacht hast? Hast du einen router? Ich hab zb ne fritzbox 7230.
Welche arduinoversion nutzt du, und welches board/shield nutzt du?
Kan das evtl daran liegen das die fritzbox NAT hat(ka was das ist
Danke fuer deine muehe

also, ich hab grad ma dynDNS eingerichtet und den port 80 auf den arduino weitergeleitet. hab dann das sketch von poldi genommen, wo man seine pins schalten kann. und das geht.
vielleicht hilft das bei der analyse

Kanns du mir sagen ob du irgend was an den ports gemacht hast?

Nein, keine Ports angepasst.

Hast du einen router? Ich hab zb ne fritzbox 7230.

Ja, AirPort Extreme.
Die IP habe ich wie im Beispiel fix verwendet, kein DHCP.

Welche arduinoversion nutzt du, und welches board/shield nutzt du?

Arduino Uno und Original Ethernet Shield.

Kan das evtl daran liegen das die fritzbox NAT

Ich glaube das spielt keine Rolle. Solange du aus deinem Netz Adressen im Internet aufrufen kannst.

Ich vermute, dass dein Arduino keine Verbindung zum Internet bekommt. Prüfe dies mal mit dem WebClient-Sketch aus der Ethernet Library. Dort wird eine externe Adresse, google.com, aufgerufen.

Möglicherweise musst du bei Ethernet.Begin() noch die Gateway-Adresse eingeben, also:

Ethernet.begin(mac, ip, gateway);

habe dein bsp ma aufgerufen.
hier das bild:

also ich ´habs grad mit dem udp noch ma getestet und die gateway eingetragen...und siehe da es geht...
gestern hatte ich das auch schon probiert...allerdings im internetcafe und grade eben sagte mir mein chef, das er selber grad mit sowas rumexperimentiert und den den exclusive auf sein board geleitet hat -.-

ich danke dir vielmals...hast mir das wochenende gerettet!!!!

ich danke dir vielmals...hast mir das wochenende gerettet!!!!

Habe ich doch gerne gemacht. :slight_smile: