Gerenciar a hora do sistema e o RTC em aplicativos de alto nível

O RTC (relógio em tempo real) é usado para manter o tempo em um dispositivo do Azure Sphere quando o dispositivo perde energia e não tem acesso a uma conexão de rede após a reinicialização do dispositivo. Isso permite que o dispositivo mantenha o tempo durante uma perda de energia, mesmo que não tenha acesso a um servidor NTP.

Se você definir a hora do sistema, ele não persistirá quando o dispositivo perde energia. Para persistir o tempo durante a perda de energia, você deve chamar a função Applibs clock_systohc. Quando clock_systohc é chamado, o tempo do sistema é empurrado para o RTC.

Requisitos rtc

Os aplicativos que usam o RTC devem incluir os arquivos de cabeçalho apropriados e adicionar configurações RTC ao manifesto do aplicativo.

Arquivos de cabeçalho

Inclua o cabeçalho rtc em seu projeto:

 #include <applibs\rtc.h>

Configurações do manifesto do aplicativo

Para usar o RTC e as APIs de relógio padrão, você deve adicionar o recurso do SystemTime aplicativo ao manifesto do aplicativo e definir o valor como true. O manifesto do aplicativo Azure Sphere tem mais detalhes sobre o manifesto do aplicativo.

{
  "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
  }
}

Obter a hora do sistema

Para obter a hora do sistema, chame a função padrão clock_gettime .

Definir a hora do sistema

Para definir a hora do sistema, chame a função padrão clock_settime .

Sincronizar a hora do sistema com o RTC

Quando o tempo do sistema é definido, ele não persiste quando o dispositivo perde energia. Para persistir o tempo durante a perda de energia, chame a função Applibs clock_systohc . Quando clock_systohc é chamado, o tempo do sistema é empurrado para o RTC.

Configurar o serviço cliente NTP

O serviço cliente NTP está habilitado por padrão. Se você definir a hora do sistema enquanto o serviço cliente NTP estiver habilitado, ele substituirá a hora UTC quando o dispositivo tiver conectividade com a Internet. Você pode desabilitar o serviço cliente NTP; no entanto, isso pode fazer com que as atualizações de nuvem no dispositivo falhem se a diferença entre a hora do sistema e a hora do servidor NTP for muito grande.

Definir o fuso horário

A hora do sistema e a hora do RTC são armazenadas em GMT/UTC. Você pode alterar o fuso horário usado pelo aplicativo chamando a setenv função para atualizar a variável de ambiente TZ e chamando a tzset função.

O projeto SetTimeFromLocation mostra como usar a pesquisa IP reversa para obter informações de localização e, em seguida, obter tempo para o local e definir a hora do dispositivo. Este projeto faz parte da Galeria do Azure Sphere, uma coleção de scripts, utilitários e funções não retidos.

O sistema operacional do Azure Sphere dá suporte a alguns formatos possíveis, mas não todos, para a variável de ambiente TZ:

  • Você pode definir o fuso horário atual com ou sem DST (Horário de Verão). Exemplos: "EST+5", "EST+5EDT". Esse valor é positivo se o fuso horário local estiver a oeste do Primeiro Meridiano e negativo se for leste.
  • Você não pode especificar a data e a hora em que o DST deve entrar em vigor.
  • Você não pode especificar um arquivo/banco de dados de fuso horário.

Para manter as configurações de fuso horário durante uma perda de energia, você pode usar o armazenamento mutável para armazenar o fuso horário no armazenamento persistente e, em seguida, recordar a configuração quando o dispositivo for reiniciado.

Especificando um servidor NTP

O serviço cliente NTP pode ser configurado para obter tempo de várias fontes. A fonte de tempo padrão é prod.time.sphere.azure.net, conforme observado nos requisitos de rede do sistema operacional do Azure Sphere.

O cliente NTP tenta sincronizar o tempo a cada 15 segundos até que ocorra uma sincronização bem-sucedida. Depois de sincronizar com êxito o tempo, ele tenta sincronizar novamente o tempo uma vez a cada 24 horas. Quando o Azure Sphere executa a sincronização de tempo, ele usa pela primeira vez uma porta de origem de cliente UDP aleatória entre 32678-61000. Se essa porta falhar, o Azure Sphere tentará usar a porta 124 como porta de origem do cliente UDP.

Você pode especificar que o sistema obtenha tempo de um servidor DHCP ou especifique a fonte de tempo no aplicativo por meio de Networking_TimeSync_EnableCustomNTP ou Networking_TimeSync_EnableDefaultNtp Function.

Se configurado para usar o DHCP para fontes de servidor de tempo, o Azure Sphere processará a opção DHCP 042 e o cliente NTP processará apenas as duas primeiras entradas enviadas na opção DHCP, que devem ser listadas por ordem de preferência. Elas serão consideradas como um servidor primário e um servidor secundário.

Você também pode configurar um servidor de tempo por meio de Networking_TimeSync_EnableCustomNTP se quiser especificar o servidor de tempo primário e secundário por meio do aplicativo. O comprimento máximo para cada FQDN (nome de domínio totalmente qualificado) do servidor é de 255 caracteres.

Fallback

  • Se o cliente NTP estiver configurado para obter os servidores de tempo por meio de DHCP ou API, um parâmetro adicional será necessário para especificar o comportamento de fallback.

  • O cliente tentará entrar em contato primeiro com o servidor de tempo primário. Se o cliente não conseguir obter uma resposta válida do servidor de tempo, ele tentará o servidor de tempo secundário (se especificado).

  • Se um servidor de tempo secundário for especificado e ele falhar ou se a opção de voltar aos padrões do sistema operacional por meio de Networking_NtpOption_FallbackServerEnabled falha, o sistema entrará em contato com a fonte de tempo padrão do sistema operacional prod.time.sphere.azure.net.

    • No próximo intervalo de sincronização de tempo de 24 horas, o sistema operacional voltará e tentará consultar o servidor de tempo primário.
  • Se você especificou Networking_NtpOption_FallbackServerDisabled, o sistema operacional continuará consultando o servidor primário e secundário a cada 15 segundos até que ele tenha sido sincronizado com êxito com um dos servidores de tempo.

Dispositivos multihomed

As configurações do servidor de tempo são uma configuração global, não uma configuração por interface. Se o dispositivo do Azure Sphere for multihomed e ambas as interfaces obterem informações do servidor NTP por meio do DHCP, o conjunto de opções DHCP NTP processado mais recentemente ganhará.

Exemplo de tempo do sistema

O exemplo tempo do sistema mostra como gerenciar a hora do sistema e usar o RTC de hardware. O aplicativo de exemplo define a hora do sistema e usa a clock_systohc função para sincronizar o tempo do sistema com o RTC.

O projeto SetTimeFromLocation mostra como usar a pesquisa IP reversa para obter informações de localização e, em seguida, obter tempo para o local e definir a hora do dispositivo. Este projeto faz parte da Galeria do Azure Sphere, uma coleção de scripts, utilitários e funções não retidos.

Exemplo de NTP personalizado

O exemplo NTP personalizado mostra como configurar o serviço cliente NTP para obter tempo de várias fontes.