Cada vez que se inicia el Netduino o hasta que se reinicie, usted encontrará que la fecha y la hora vuelve a los valores por defecto. Desde el lanzamiento de Netduino Plus, con conexión ethernet , este ofrece una solución bienvenida a esta cuestión.
El Protocolo de Tiempo de Red (NTP) proporciona una manera fácil de sincronizar un dispositivo (por ejemplo, el equipo de Windows) con un servidor de hora de red. Al invocar un servidor NTP en el arranque, el Netduino colocará automáticamente su DateTime.
En el código siguiente se proporciona en el blog de Michael Schwarz y ligeramente modificado para aceptar un adicional (zona horaria) de parámetros:
using System;
using System.Net;using System.Net.Sockets;public static class Ntp{ public static bool UpdateTimeFromNtpServer(string server, int timeZoneOffset) { try { var currentTime = GetNtpTime(server, timeZoneOffset); Microsoft.SPOT.Hardware.Utility.SetLocalTime(currentTime); return true; } catch { return false; } } /// <summary> /// Get DateTime from NTP Server /// Based on: /// </summary> /// <param name="timeServer">Time Server (NTP) address</param> /// <param name="timeZoneOffset">Difference in hours from UTC</param> /// <returns>Local NTP Time</returns> private static DateTime GetNtpTime(String timeServer, int timeZoneOffset) { // Find endpoint for TimeServer var ep = new IPEndPoint(Dns.GetHostEntry(timeServer).AddressList[0], 123); // Make send/receive buffer var ntpData = new byte[48]; // Connect to TimeServer using (var s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) { // Set 10s send/receive timeout and connect s.SendTimeout = s.ReceiveTimeout = 10000; // 10,000 ms s.Connect(ep); // Set protocol version ntpData[0] = 0x1B; // Send Request s.Send(ntpData); // Receive Time s.Receive(ntpData); // Close the socket s.Close(); } const byte offsetTransmitTime = 40; ulong intpart = 0; ulong fractpart = 0; for (var i = 0; i <= 3; i++) intpart = (intpart << 8) | ntpData[offsetTransmitTime + i]; for (var i = 4; i <= 7; i++) fractpart = (fractpart << 8) | ntpData[offsetTransmitTime + i]; ulong milliseconds = (intpart * 1000 + (fractpart * 1000) / 0x100000000L); var timeSpan = TimeSpan.FromTicks((long)milliseconds * TimeSpan.TicksPerMillisecond); var dateTime = new DateTime(1900, 1, 1); dateTime += timeSpan; var offsetAmount = new TimeSpan(timeZoneOffset, 0, 0); var networkDateTime = (dateTime + offsetAmount); return networkDateTime; }}He aquí una breve lista de algunos servidores NTP:
- pool.ntp.org (en realidad es una colección de servidores detrás de una única dirección)
- time.nist.gov
- tiempo-a.nist.gov
- tiempo-b.nist.gov
Pase uno de estos nombres de servidor como una cadena y llama durante su proyecto principal () de método:
private static bool SetTime()
{ var result = Ntp.UpdateTimeFromNtpServer("time.nist.gov", -4); // Eastern Daylight Time Debug.Print(result ? "Time successfully updated" : "Time not updated"); return result;}aqui
Gracias por la traducción de mi artículo!
Me gustaMe gusta