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:
  • 1 Bewertungen - 5 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Beispiel NTP und DHCP
01.09.2013, 13:19
Beitrag #1
Beispiel NTP und DHCP
Hallo Forum,
anbei ein Script was ich immer wieder verwende.
Aufbau: Uno + Ethernet-Shield an üblichen Router
Funktionen:
  • Ethernt-Client aktivieren und per DHCP eine Adresse holen
  • UDP Protokoll initialisieren
  • NTP Protokoll initialisieren und NTP Pakete von einem Server holen, Zeit setzen
  • DHCP Adresse und Zeit werden zyklisch aktualisiert
  • Anzeige im Serial-Monitor
Es stehen eine Menge Kommentare drin um mir selbst die Sachen verständlich zu machen. Kommentare mit "***" beziehen sich auf Variablen die man anpassen kann.
Vielleicht kann ja jemand ein paar Sachen davon gebrauchen.
Grüße Ricardo
Code:
// Includes
#include <Time.h> // Zeitfunktionen
#include <Ethernet.h> // Ethernetfunktionen
#include <EthernetUdp.h> // UDP Funktionen auf Ethernet
#include <SPI.h> // SPI für Ethernetboard
// Variablen
// *** Ethernet MAC Adresse steht auf Ethernetshield oder manuell setzen
static byte mac[] = {
  0x90, 0xA2, 0xDA, 0x00, 0x9B, 0xC1 };
// *** NTP Server anpassen - sollte eine Adresse aus de.ntp.pool.org sein
static IPAddress timeServer(132, 163, 4, 101);
const int NTP_PACKET_SIZE = 48; // NTP Paketgroeße
byte packetBuffer[NTP_PACKET_SIZE]; // NTP Datnpuffer
time_t prevDisplay = 0; // NTP Klasse - Zeit wurde noch nicht geändert
const int ntpsync = 7200; // *** NTP Sync alle 2 Stunden
/* Puffer für Umsetzung der DHCP-IP-Adresse von Ethernet.localIP()
Aufbau: "IP:  "+IP-Adresse+Abschluüßzeichen "\0" */
char ipbuf[21];
/* Eine Union ist eine Vereinigung verschiedener Typen auf einer Adresse.
Dies erleichtert Redefinitionen oder die Verwendung von Variantentypen.
Sie nimmt nicht mehrere Elemente nebeneinander auf, sondern zu jedem Zeitpunkt immer nur eines.
Wird eine der Definitionsvarianten initialisiert, so werden die anderen damit implizit initialisiert,
da sie auf der gleichen Adresse beginnen.*/
union IPAddressConverter {
  uint32_t ipInteger;
  uint8_t ipArray[4];
};
unsigned long dlastnow; // letztes now() für dhcprenew
const int dhcplease = 7200; // *** DHCP Lease - 2 Stunden
EthernetClient client; // EthernetClient - Instanz erstellen
EthernetUDP Udp; // UDP - Instanz erstellen
void setup()
{
  Serial.begin(9600); // Monitor starten
  Ethernet.begin(mac); // EthernetClient starten, 1 Sekunde warten
  delay(1000);
  Udp.begin(8888);   // UDP starten Port 8888
  setSyncProvider(getNtpTime); // NTP Provider starten / erstmalig abfragen
  setSyncInterval(ntpsync); // NTP Sync alle 2 Stunden
  setTime(hour(),minute(),second(),day(),month(),year()); // Zeit auf Arduino setzen
}
void loop()
{  
  if (timeStatus() != timeNotSet) // Anzeige nur aktualisieren wenn Zeit geändert
  {
    if (now() != prevDisplay)
    {
      prevDisplay = now();
      ClockDisplay();
    }
    if (now() - dlastnow > dhcplease) dhcprenew(); // Aktualisierung der DHCP-Adresse
  }
}
// Anzeige Zeit/Datum und IP-Adresse auf Serial
void ClockDisplay(){
  Serial.print("Zeit / Datum: ");
  printDigits(hour());
  Serial.print(":");
  printDigits(minute());
  Serial.print(":");
  printDigits(second());
  Serial.print("  ");
  printDigits(day());
  Serial.print(".");
  printDigits(month());
  Serial.print(".");
  Serial.println(year());
  Serial.println(ipbuf);
}
// 0 vorsetzen wenn übergebener Wert < 10
void printDigits(int digits)
{
  if(digits < 10) Serial.print('0'); // vorher 0 wenn einstellig
  Serial.print(digits);
}
// NTP Provider - prüft ob NTP läuft und holt die Daten
time_t getNtpTime()
{
  while (Udp.parsePacket() > 0) ; // vorhergehende Pakete verwerfen
  sendNTPpacket(timeServer);
  uint32_t beginWait = millis();
  while (millis() - beginWait < 1500) // 1500 Millisekunden Wartezeit für NTP Antwort
  {
    int size = Udp.parsePacket();
    if (size >= NTP_PACKET_SIZE)
    {
      Udp.read(packetBuffer, NTP_PACKET_SIZE); // Paket in Puffer einlesen
      unsigned long secsSince1900;
      // Byte 40,41,42,43 zusammen in long umwandeln
      secsSince1900 =  (unsigned long)packetBuffer[40] << 24;
      secsSince1900 |= (unsigned long)packetBuffer[41] << 16;
      secsSince1900 |= (unsigned long)packetBuffer[42] << 8;
      secsSince1900 |= (unsigned long)packetBuffer[43];
      return secsSince1900 - 2208988800UL + 2 * SECS_PER_HOUR;
    }
  }
  return 0;
}
// NTP Request senden
void sendNTPpacket(IPAddress &address)
{
  memset(packetBuffer, 0, NTP_PACKET_SIZE); // Puffer auf 0 setzen
  // notwendige Werte für NTP-Request
  packetBuffer[0] = 0b11100011;   // LI, Version, Mode
  packetBuffer[1] = 0;     // Stratum oder Uhrentyp
  packetBuffer[2] = 6;     // Pollingintervall
  packetBuffer[3] = 0xEC;  // Peer Clock Präzision
  /* 8 bytes 0 für Root Delay & Root Dispersion
   Es wird also immer eine Antwort entgegengenommen,
   egal welche Abweichung der Server vom Root hat */
  packetBuffer[12]  = 49;
  packetBuffer[13]  = 0x4E;
  packetBuffer[14]  = 49;
  packetBuffer[15]  = 52;
  // Werte für Request gesetzt, Request senden auf Port 123
  Udp.beginPacket(address, 123);
  Udp.write(packetBuffer, NTP_PACKET_SIZE);
  Udp.endPacket();
}
void dhcprenew()
{
  /* das eigentliche DHCP renew
   Adresse wird dann in Puffer ipbuf geschrieben */
  Ethernet.maintain();
  IPAddressConverter ipAddress;
  ipAddress.ipInteger = Ethernet.localIP();
  sprintf(ipbuf, "IP:  %d.%d.%d.%d", ipAddress.ipArray[0], ipAddress.ipArray[1], ipAddress.ipArray[2], ipAddress.ipArray[3]);
  dlastnow=now(); // Zeit für letztes DHCP renew
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.09.2013, 14:51
Beitrag #2
RE: Beispiel NTP und DHCP
wo schliesst man denn da die kabel an?
da hängts bei mir immer...


greetz

Arduino UNO R3
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.09.2013, 17:08 (Dieser Beitrag wurde zuletzt bearbeitet: 11.09.2013 19:24 von rkuehle.)
Beitrag #3
RE: Beispiel NTP und DHCP
Moin,

geht genauso als wenn du einen PC in deinem lokalen Netz ans Internet hängst.
Ethernet Shield auf Arduino, Ethernetkabel vom Shield an einen Roouteranschluß für das lokale Netz. Fertisch.
Auf dem Router muß DHCP aktiviert sein.
Wenn du einen einigermaßen sinnvollen Router hast sollte er dir auch das Ethernetshield in den Netzwerkgeräten anzeigen.
Mit leichten Änderungen im Sketch könnte man das auch drahtlos machen wenn der Router WLAN hat und du anstatt des Ethernet Shield ein WiFi Shield benutzt.

Grüße Ricardo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.09.2013, 12:57
Beitrag #4
RE: Beispiel NTP und DHCP
ich kann mein shield nicht aufs arduino stecken, haben den enc28j60 und den muss ich manuel per draht verbinden, das ja mein problem

Arduino UNO R3
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.09.2013, 14:52
Beitrag #5
RE: Beispiel NTP und DHCP
Aha,
guckst du hier: http://arduino.alhin.de/index.php?n=24
ziemlich weit unten gibts eine Pin-Pin Liste

Grüße Ricardo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.09.2013, 23:49
Beitrag #6
RE: Beispiel NTP und DHCP
http://www.arduinoforum.de/arduino-Thread-ENC28J60-FTP

Arduino UNO R3
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  web server mit DHCP für acht kanal voltmeter alfredoli 13 7.620 07.06.2014 00:53
Letzter Beitrag: rkuehle

Gehe zu:


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