Sincronizar la hora de tu netduino


 

Este utilidad  para nuestro Netduino    toma el dato fecha-hora(datetime)   de un servidor  NTP
El código se basa  en http://weblogs.asp.net/mschwarz/archive/2008/03/09/wrong-datetime-on-net-micro-framework-devices.aspx
Código para Netduino-Plus:

using
 System;
using Microsoft.SPOT;

 

using System.Net.Sockets;

 

using System.Net;

 

using Microsoft.SPOT.Hardware;

 

using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.Netduino;
using Microsoft.SPOT.Time;

 

namespace NetduinoPlusWebServer

 

{

 

    class TimeHandeler

 

 {

 

     /// Timeserver

 

        /// Local NTP Time

 

        public static DateTime NTPTime(String TimeServer)
     {
          // Find endpoint for timeserver
           IPEndPoint ep = new IPEndPoint(Dns.GetHostEntry(TimeServer).AddressList[0], 123);

 

         // Connect to timeserver

 

        Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

 

          s.Connect(ep);

 

            // Make send/receive buffer

 

         byte[] ntpData = new byte[48];

 

    Array.Clear(ntpData, 0, 48);

 

         // Set protocol version

 

       ntpData[0] = 0x1B;

 

            // Send Request

 

            s.Send(ntpData);

 

            // Receive Time

 

            s.Receive(ntpData);

 

            byte offsetTransmitTime = 40;

 

           ulong intpart = 0;

 

            ulong fractpart = 0;

 

           for (int i = 0; i <= 3; i++)

 

               intpart = (intpart <<  8 ) | ntpData[offsetTransmitTime + i];

 

           for (int i = 4; i <= 7; i++)

 

                fractpart = (fractpart <<  8 ) | ntpData[offsetTransmitTime + i];

 

            ulong milliseconds = (intpart * 1000 + (fractpart * 1000) / 0x100000000L);

 

           s.Close();

 

            TimeSpan timeSpan = TimeSpan.FromTicks((long)milliseconds * TimeSpan.TicksPerMillisecond);

 

           DateTime dateTime = new DateTime(1900, 1, 1);

 

            dateTime += timeSpan;

 

            TimeSpan offsetAmount = TimeZone.CurrentTimeZone.GetUtcOffset(dateTime);
          DateTime networkDateTime = (dateTime + offsetAmount);

 

           return networkDateTime;

 

        }

 

    }

 

}

 

 

Anuncios
Esta entrada fue publicada en Netduino.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s