Administración de la hora del sistema y el reloj en tiempo real (RTC) en aplicaciones de alto nivel
Importante
Esta es la documentación de Azure Sphere (heredado). Azure Sphere (heredado) se retira el 27 de septiembre de 2027 y los usuarios deben migrar a Azure Sphere (integrado) en este momento. Use el selector de versiones situado encima de la TOC para ver la documentación de Azure Sphere (integrado).
El RTC (reloj en tiempo real) se usa para mantener la hora en un dispositivo de Azure Sphere cuando el dispositivo se apaga y no tiene acceso a una conexión de red después de reiniciarse. Esto permite al dispositivo mantener la hora durante una pérdida de energía, incluso si no tiene acceso a un servidor NTP.
Si establece la hora del sistema, esta no se conserva cuando se apaga el dispositivo. Para conservar la hora durante una pérdida de energía, debe llamar a la función de Applibs clock_systohc. Cuando se llama a clock_systohc, se envía la hora del sistema al RTC.
Requisitos del reloj en tiempo real
Las aplicaciones que usan el RTC deben habilitar los archivos de encabezado adecuados y agregar la configuración del reloj en tiempo real al manifiesto de aplicación.
Archivos de encabezado
Incluya el encabezado rtc en el proyecto:
#include <applibs\rtc.h>
Configuración del manifiesto de aplicación
Para usar las API del reloj en tiempo real y del reloj estándar, debe agregar la funcionalidad de aplicación SystemTime
al manifiesto de aplicación y, a continuación, establecer el valor en true
. El manifiesto de aplicación de Azure Sphere tiene más detalles sobre el manifiesto de aplicación.
{
"SchemaVersion": 1,
"Name" : "Mt3620App3_RTC",
"ComponentId" : "bb267cbd-4d2a-4937-8dd8-3603f48cb8f6",
"EntryPoint": "/bin/app",
"CmdArgs": [],
"Capabilities": {
"AllowedConnections": [],
"AllowedTcpServerPorts": [],
"AllowedUdpServerPorts": [],
"HardwareAddressConfig": true,
"Gpio": [],
"Uart": [],
"WifiConfig": false,
"NetworkConfig": false,
"SystemTime": true,
"TimeSyncConfig": true
}
}
Obtención de la hora del sistema
Para obtener la hora del sistema, llame a la función estándar clock_gettime
.
Establecimiento de la hora del sistema
Para establecer la hora del sistema, llame a la función estándar clock_settime
.
Sincronización de la hora del sistema con el RTC
Cuando se establece la hora del sistema, esta no se conserva cuando se apaga el dispositivo. Para conservar el tiempo durante la pérdida de energía, llame a la función Applibs clock_systohc . Cuando se llama a clock_systohc, se envía la hora del sistema al RTC.
Configuración del servicio de cliente NTP
El servicio de cliente NTP está habilitado de forma predeterminada. Si se establece la hora del sistema mientras el servicio de cliente NTP está habilitado, se sobrescribirá la hora UTC cuando el dispositivo tenga conectividad a Internet. Aunque puede deshabilitar el servicio de cliente NTP, las actualizaciones de la nube en el dispositivo podrían producir un error si la diferencia entre la hora del sistema y la hora del servidor NTP es demasiado grande.
Establecimiento de la zona horaria
La hora del sistema y la hora del reloj en tiempo real se almacenan en GMT/UTC. Para cambiar la zona horaria que utiliza la aplicación realice una llamada a la función setenv
para actualizar la variable de entorno TZ y, después, llame a la función tzset
.
El proyecto SetTimeFromLocation muestra cómo usar la búsqueda de IP inversa para obtener información de ubicación, obtener la hora de la ubicación y establecer la hora del dispositivo. Este proyecto forma parte de la Galería de Azure Sphere, una colección de scripts, utilidades y funciones sin mantener.
Actualmente, el sistema operativo Azure Sphere admite algunos de los posibles formatos de la variable de entorno TZ, aunque no todos:
- La zona horaria actual se puede establecer con o sin horario de verano (DST). Ejemplos: "EST + 5" o "EST + 5EDT". Este valor es positivo si la zona horaria local está al oeste del Meridiano de Greenwich y negativo si está al este.
- No se puede especificar la fecha y hora en que el DST debe entrar en vigor.
- No se puede especificar un archivo o base de datos de zona horaria.
Para mantener la configuración de la zona horaria durante una pérdida de energía, puede usar el almacenamiento mutable para almacenar la zona horaria en el almacenamiento persistente y, a continuación, recuperar la configuración cuando se reinicie el dispositivo.
Especificar un servidor NTP
El servicio cliente NTP se puede configurar para obtener el tiempo de varios orígenes. El origen de hora predeterminado es prod.time.sphere.azure.net
, como se indica en los requisitos de red del sistema operativo de Azure Sphere.
El cliente NTP intenta sincronizar el tiempo cada 15 segundos hasta que se haya producido una sincronización correcta. Después de sincronizar correctamente el tiempo, intenta volver a sincronizar el tiempo una vez cada 24 horas. Cuando Azure Sphere realiza la sincronización de tiempo, primero usa un puerto de origen de cliente UDP aleatorio entre 32678-61000. Si se produce un error en este puerto, Azure Sphere intenta usar el puerto 124 como puerto de origen del cliente UDP.
Puede especificar que el sistema obtenga la hora de un servidor DHCP o puede especificar el origen de hora de la aplicación a través de Networking_TimeSync_EnableCustomNTP o Networking_TimeSync_EnableDefaultNTP.
Si está configurado para usar DHCP para orígenes de servidor horario, Azure Sphere procesará la opción DHCP 042 y el cliente NTP solo procesará las dos primeras entradas enviadas en la opción DHCP, que debe aparecer en orden de preferencia. Se considerarán como un servidor principal y un servidor secundario.
También puede configurar un servidor de hora a través de Networking_TimeSync_EnableCustomNTP si desea especificar el servidor de hora principal y secundario a través de la aplicación. La longitud máxima de cada nombre de dominio completo (FQDN) del servidor es de 255 caracteres.
Alternativa
Si el cliente NTP está configurado para obtener los servidores de hora a través de DHCP o API, se requiere un parámetro adicional para especificar el comportamiento de reserva.
El cliente intentará ponerse en contacto primero con el servidor de hora principal. Si el cliente no obtiene una respuesta de servidor de hora válida, probará el servidor de hora secundario (si se especifica).
Si se especifica un servidor de hora secundario y se produce un error, o si la opción de revertir a los valores predeterminados del sistema operativo a través
Networking_NtpOption_FallbackServerEnabled
de se produce un error, el sistema se pondrá en contacto con el origen de hora predeterminado del sistema operativo prod.time.sphere.azure.net.- En el siguiente intervalo de sincronización de 24 horas, el sistema operativo volverá e intentará consultar el servidor de hora principal.
Si especificó Networking_NtpOption_FallbackServerDisabled, el sistema operativo seguirá consultando el servidor principal y secundario cada 15 segundos hasta que se sincronice correctamente con uno de los servidores de tiempo.
Dispositivos multiinicio
La configuración del servidor de hora es una configuración global, no una configuración por interfaz. Si el dispositivo de Azure Sphere es multiinicio y ambas interfaces obtienen información del servidor NTP a través de DHCP, el conjunto de opciones NTP procesado más recientemente gana.
Ejemplo de hora del sistema
El ejemplo de hora del sistema muestra cómo administrar la hora del sistema y usar el RTC del hardware. La aplicación de ejemplo establece la hora del sistema y, a continuación, usa la clock_systohc
función para sincronizar la hora del sistema con el RTC.
El proyecto SetTimeFromLocation muestra cómo usar la búsqueda de IP inversa para obtener información de ubicación, obtener la hora de la ubicación y establecer la hora del dispositivo. Este proyecto forma parte de la Galería de Azure Sphere, una colección de scripts, utilidades y funciones sin mantener.
Ejemplo de NTP personalizado
En el ejemplo NTP personalizado se muestra cómo configurar el servicio cliente NTP para obtener el tiempo de varios orígenes.