Go Down

Topic: Probleme mit UDP (Read 9026 times) previous topic - next topic

bytzmaster

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



Webmeister

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?

stundenblume

Hi,

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


Gruß

Sebastian
Libraries:
  - multiCameraIrControl [V1.6]
  -

bytzmaster

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.

Webmeister

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

Ja, die aktuelle Version ist Mega kompatibel. Steht sogar auf dem Board  ;)

Webmeister

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

bytzmaster

Hab grad ma ein paar ausgaben gemacht:

Code: [Select]
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
Code: [Select]
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

bytzmaster

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)

Webmeister

Die "1" wird bei jedem Loop ausgegeben.

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

Code: [Select]
 if ( Udp.available() ) {


Webmeister

Quote
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?  ;)

bytzmaster

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

bytzmaster

Quote
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

bytzmaster

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

Webmeister

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.



bytzmaster

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

Go Up