Cómo utilizar NTP con el Aduino Leonardo
Colocado en¿Cómo funciona NTP?
NTP utiliza paquetes UDP/IP para la transferencia de datos debido a la rápida configuración de la conexión y los tiempos de respuesta. El número de puerto oficial para NTP (que ntpd y ntpdate escuchan y hablan) es 123. La unidad de tiempo es en segundos y la época es el 1 de enero de 1900.
La marca de tiempo NTP es un valor binario de 64 bits, creado a partir de un valor de segundos de 32 bits sin signo y una parte fraccionaria de 32 bits. En esta notación, el valor 3,5 estaría representado por la cadena de 64 bits:
0000|0000|0000|0000|0000|0000|0000|0011 . 1000|0000|0000|0000|0000|0000|0000|0000
Si toma todos los bits como un entero sin signo de 64 bits, guárdelo en una variable de punto flotante con al menos 64 bits de mantisa (generalmente el doble) y haga una división de punto flotante por 2^32, obtendrá el respuesta correcta. Desafortunadamente, en un Arduino estándar, no tenemos dobles de 64 bits, pero la mayoría de los RTC solo tienen información de segundo nivel, por lo que no es necesario obtener la segunda mitad (o posiblemente el primer byte) Solo los primeros cuatro bytes de un paquete NTP saliente deben establecerse para lo que queremos lograr
apropiadamente, el resto puede ser lo que sea.
Los campos de encabezado del mensaje NTP son los siguientes:
- Indicador de salto LI (2 bits)
- Este campo indica si al último minuto del día actual se le va a aplicar un segundo bisiesto. Los valores del campo siguen:
- 0: Sin ajuste de segundo bisiesto
- 1: El último minuto del día tiene 61 segundos
- 2: El último minuto del día tiene 59 segundos
- 3: el reloj no está sincronizado
- Este campo indica si al último minuto del día actual se le va a aplicar un segundo bisiesto. Los valores del campo siguen:
- Número de versión de VN NTP (3 bits) (la versión actual es 4).
- Modo Modo paquete NTP (3 bits)
- Los valores del campo Modo son los siguientes:
- 0: reservado
- 1: simétrico activo
- 2: pasivo simétrico
- 3: Cliente
- 4: Servidor
- 5: Emisión
- 6: mensaje de control NTP
- 7: Reservado para uso privado
- Los valores del campo Modo son los siguientes:
- Nivel de estrato de la fuente de tiempo (8 bits)
- Los valores del campo Estrato son los siguientes:
- 0: no especificado o inválido
- 1: servidor principal
- 2–15: servidor secundario
- 16: no sincronizado
- 17–255: Reservado
- Los valores del campo Estrato son los siguientes:
- Sondeo Intervalo de sondeo (entero con signo de 8 bits)
- El valor log2 del intervalo máximo entre mensajes NTP sucesivos, en segundos.
- Precisión Precisión del reloj (entero con signo de 8 bits)
- La precisión del reloj del sistema, en log2 segundos.
- NTP primeros cuatro bytes 0xEC0600E3
Este es el encabezado de la solicitud NTP, pero solo necesitamos los primeros 32 bits. Definimos el TAMAÑO DEL PAQUETE NTP, esto es 48 bytes porque la marca de tiempo NTP está en los primeros 48 bytes del mensaje después de una consulta exitosa, obtendremos una respuesta de 48 bytes del servidor NTP.
Para comprender la estructura de una consulta y respuesta NTP, consulte http://www.cisco.com/c/en/us/about/press/internet-protocol-journal/back-issues/table-contents-58/154-ntp.html
Entonces, si queremos leer la "Marca de tiempo de transmisión", entonces necesitamos leer la parte entera que son los bytes 40,41,42,43 si queremos redondear al segundo más cercano si queremos cierta precisión, entonces la parte fraccionaria es el byte 44, 45,46,47 si es mayor a 500ms el byte 44 sera > 128 y asi con solo chequear el byte 44 de la respuesta, podemos redondear al siguiente segundo; El 90 % de los servidores NTP tienen retrasos de red inferiores a 100 ms
También podemos tener en cuenta un retraso de red promedio asumido de 50 ms y, por lo tanto, en lugar de comparar con 128, puede comparar con (0,5 s - 0,05 s) * 256 = 115;