INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
NTP zeitserver: UDP, TCP, DHCP
12.07.2014, 15:49
Beitrag #1
NTP zeitserver: UDP, TCP, DHCP
servus rundherum,
hardware: UNO, Ethernet W5100.
ich hab mein ganzes netzwerk mit statischen IPs aufgebaut.

kann mir jemand von Euch sagen,
1. WARUM ich für eine internet-zeit-abfrage nur codes finde, die UDP- mit hilfe von DHCP verwenden?

2. ob eine timeserver-anfrage mit statisch/TCP überhaupt geht ?

3. was ich da -mindestens- nachlernen muss? :-)

jetzt schon dankschön!
Marcel
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.07.2014, 16:37
Beitrag #2
RE: NTP zeitserver: UDP, TCP, DHCP
Hallo Marcel,

kurze Antworten auf deine Fragen:
1. Weil die meisten Heimnetzwerke Router benutzen die Adressen per DHCP verteilen
2. Natürlich
3. Nicht viel, einfach nur die Festlegung der IP-Adresse auf das W5100. Guckst du hier: http://arduino.cc/de/Reference/EthernetIPAddress

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.07.2014, 19:03
Beitrag #3
RE: NTP zeitserver: UDP, TCP, DHCP
(12.07.2014 16:37)rkuehle schrieb:  Hallo Marcel,

kurze Antworten auf deine Fragen:
1. Weil die meisten Heimnetzwerke Router benutzen die Adressen per DHCP verteilen
2. Natürlich
3. Nicht viel, einfach nur die Festlegung der IP-Adresse auf das W5100. Guckst du hier: http://arduino.cc/de/Reference/EthernetIPAddress

Grüße Ricardo

danke, Ricardo; rasch UND konkret: seltene eigenschaften in foren.
zu 3.: das sind "grundschläge", hab ich schon inhaliert.
folgenden sketch hatte ich schon probiert (abänderungen: "my"):
Code:
/*
Udp NTP Client für LCD 16x2
abgeändert 2014-07-11 von M.Y.

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
modified 23 Oct 2010
by Juergen Mayer, DL8MA, Grossheppach

This code is in the public domain.

*/

//#include <LCD4Bit_mod.h>
//LCD4Bit_mod lcd = LCD4Bit_mod(2);

// include the library code:
#include <LiquidCrystal.h> //my

// initialize the library with the numbers of the interface pins
//LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7);  //für LCD SainSmart  //my

#include <SPI.h>        
#include <Ethernet.h>
#include <EthernetUdp.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[] = { 10,0,0,180 };  //my
char string[ 17 ] = { "" };
int stunde, minute, sekunde;
unsigned int localPort = 8888;      // local port to listen for UDP packets  //firewall: offen
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
EthernetUDP Udp;
void setup()
{
  // start Ethernet and UDP
  Ethernet.begin(mac[color=#FF0000],ip[/color]);  //my: ip
  Udp.begin(localPort);
  lcd.begin(16, 2);
  Serial.begin(9600); //my

  lcd.clear();
  lcd.write("NTP-Uhr");
}

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() ) {  
    Serial.print("Udp avaible!"); //my: debug
    Udp.read(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;  

    // now convert NTP time into everyday 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;  

    stunde = (epoch % 86400L) / 3600;  
    Serial.print(stunde);   //my: debug
    minute = (epoch % 3600) / 60;
    sekunde = (epoch % 60);

    sprintf( string, "%02d:%02d:%02d UTC", stunde, minute, sekunde );

    //lcd.cursorTo(2, 0);  //line=2, x=0
  }
  else {                              //my: debug
    lcd.write("Udp nicht verfügbar");  
    Serial.print("Udp nicht verfügbar");
  }
  // wait ten seconds before asking for the time again
  delay( 333 );
}

// 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.write( packetBuffer,NTP_PACKET_SIZE,  address, 123); //auskommentiert: my
//NTP requests are to port 123
  
    Udp.beginPacket(timeServer, 123);  // statt auskommentierter zeile (my)
    Udp.write(packetBuffer,NTP_PACKET_SIZE);
    Udp.endPacket();

}
unnötig hinzuzufügen, dass ich halt von den protokollen keine ahnung hab.
für korrekturen (+begründung?) wär ich natürlich dankbar.

nochmals danke,
Marcel
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.07.2014, 20:53
Beitrag #4
RE: NTP zeitserver: UDP, TCP, DHCP
Hi,
bist Du sicher, dass der Zeit-Server wirklich die IP 192.43.244.18 hat? Ich hab mal einen ping time.nist.gov gemacht. Dabei kam 128.138.141.172 heraus...
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.07.2014, 10:11
Beitrag #5
RE: NTP zeitserver: UDP, TCP, DHCP
(12.07.2014 20:53)Thorsten Pferdekämper schrieb:  Hi,
bist Du sicher, dass der Zeit-Server wirklich die IP 192.43.244.18 hat? Ich hab mal einen ping time.nist.gov gemacht. Dabei kam 128.138.141.172 heraus...
Gruß,
Thorsten

NEIN, bin ich nicht. der wechselt die ip alle f... lang. habs jetzt mit einem deutschen versucht.

es hängt gleich in der ersten zeile der void loop(): "sendNTPpacket(timeServer); "
Serial.print (vorher) ok, nacher nix mehr.
den timeserver hab ich mehrmals angepingt, ist ok, daran liegts also nicht.

ist es der mischmasch Ethernet.begin(mac,ip) und Udp.begin(localPort)?
zur erinnerung: KEIN DHCP!

auch für debug-tips wär ich dankbar.
schönen sonntag, servus!


Code:
/*
* UdpNtp sketch
* Get the time from an NTP time server
* Demonstrates use of UDP sendPacket and ReceivePacket
*/

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

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };  // MAC address to use
byte ip[] = { 10,0,0,180 };
unsigned int localPort = 8888;      // local port to listen for UDP packets

IPAddress timeServer(192,53,103,108);  //ptbtime1.ptb.de //(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/outgoing packets

// A UDP instance to let us send and receive packets over UDP
EthernetUDP Udp;

void setup()
{
  Ethernet.begin(mac,ip);
  Serial.begin(9600);
  // start Ethernet and UDP
  //if (!Ethernet.begin(mac,ip)) {
  //  Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
    //for(;;)
    //  ;
  //}
  Udp.begin(localPort);
}

void loop()
{
  Serial.print("paket senden 1...");
  sendNTPpacket(timeServer); // send an NTP packet to a time server
  Serial.print("paket senden 2...");
  // wait to see if a reply is available
  delay(1000);
  if ( Udp.parsePacket() ) {
     Udp.read(packetBuffer,NTP_PACKET_SIZE);  // read packet into buffer
      Serial.write("lese paket in den puffer...");  // my, debug
     //the timestamp starts at byte 40, convert four bytes into a long integer
     unsigned long hi = word(packetBuffer[40], packetBuffer[41]);
     unsigned long low = word(packetBuffer[42], packetBuffer[43]);
     unsigned long secsSince1900 = hi << 16 | low;  // this is NTP time
                                                    // (seconds since Jan 1 1900)

    Serial.print("Seconds since Jan 1 1900 = " );
    Serial.println(secsSince1900);

    Serial.print("Unix time = ");
    // Unix time starts on Jan 1 1970
    const unsigned long seventyYears = 2208988800UL;    
    unsigned long epoch = secsSince1900 - seventyYears;  // subtract 70 years
    Serial.println(epoch);                               // print Unix time


    // print the hour, minute and second:
    // UTC is the time at Greenwich Meridian (GMT)
    Serial.print("The UTC time is ");      
    // print the hour (86400 equals secs per day)
    Serial.print((epoch  % 86400L) / 3600);
    Serial.print(':');
    if ( ((epoch % 3600) / 60) < 10 ) {
     // Add leading zero for the first 10 minutes of each hour
      Serial.print('0');
    }
     // print the minute (3600 equals secs per minute)
    Serial.print((epoch  % 3600) / 60);
    Serial.print(':');
    if ( (epoch % 60) < 10 ) {
      // Add leading zero for the first 10 seconds of each minute
      Serial.print('0');
    }
    Serial.println(epoch %60); // print the second
  }
  else Serial.print("nix gelesen");   //my, debug
  // 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(IPAddress& address)

{
  memset(packetBuffer, 0, NTP_PACKET_SIZE);  // set all bytes in the buffer to 0

  // Initialize values needed to form NTP request
  packetBuffer[0] = B11100011;   // LI, Version, Mode
  packetBuffer[1] = 0;     // Stratum
  packetBuffer[2] = 6;     // Max Interval between messages in seconds
  packetBuffer[3] = 0xEC;  // Clock Precision
  // bytes 4 - 11 are for Root Delay and Dispersion and were set to 0 by memset
  packetBuffer[12]  = 49;  // four byte reference ID identifying
  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.beginPacket(address, 123); //NTP requests are to port 123
  Udp.write(packetBuffer,NTP_PACKET_SIZE);
  Udp.endPacket();
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.07.2014, 13:23
Beitrag #6
RE: NTP zeitserver: UDP, TCP, DHCP
gelöst:
http://forum.arduino.cc/index.php/topic,207477.0.html
1. irgendwie logisch, dass man auch DNS und gateway mitteilen sollte Undecided
hat trotzdem noch nicht funktioniert.

2. LCD (SainSmart) abgesteckt ==> alles ok.
LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7) welcher von den pins ist der bösling??

jedenfalls nocheinmal danke!

Servus aus NÖ
Marcel
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.07.2014, 12:02 (Dieser Beitrag wurde zuletzt bearbeitet: 14.07.2014 12:03 von rkuehle.)
Beitrag #7
RE: NTP zeitserver: UDP, TCP, DHCP
Hallo Marcel,

das Problem mit dem angeschlossenen LCD dürfte am Pin D13 liegen. Der wird vom Ethernet-Shield ebenfalls benutzt für SCK.
Siehe Attachment.

Grüße RK

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.07.2014, 09:01 (Dieser Beitrag wurde zuletzt bearbeitet: 15.07.2014 09:06 von igelstein.)
Beitrag #8
RE: NTP zeitserver: UDP, TCP, DHCP
(14.07.2014 12:02)rkuehle schrieb:  Hallo Marcel,

das Problem mit dem angeschlossenen LCD dürfte am Pin D13 liegen. Der wird vom Ethernet-Shield ebenfalls benutzt für SCK.
Siehe Attachment.

Grüße RK

danke!
hab den 13er aus dem setup genommen, trotzdem nix. das LCD funktioniert, aber Ethernet nicht.
muss den pin wohl hardwaremäßig killen.

by the way-auch wenns nicht mehr ganz hierhergehört: wie läßt sich ein pin in der IDE "umleiten"? zB um ein ENC28J60-board an den mega2560 anzupassen?
das einzige, was ich da gefunden hab:
Code:
#define ENC28J60_CONTROL_CS   53 //10
#define SPI_MOSI                           51 //11
#define SPI_MISO                           50 //12
#define SPI_SCK                              52 //13
(http://forum.arduino.cc/index.php/topic,25764.0.html)
gibts da eine andere möglichkei?
ich finds nicht.
nochmals danke und servus!
Marcel
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  DNS über DHCP sommerlatsch 0 577 23.04.2015 20:14
Letzter Beitrag: sommerlatsch
  DHCP Server mit Nano und Ether_28J60 Frederick4711 5 937 16.03.2015 13:46
Letzter Beitrag: Frederick4711
  DHCP Problem lwIP KK66 10 2.062 10.03.2015 08:07
Letzter Beitrag: KK66

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste