Partilhar via


Gerir o tempo do sistema e o RTC em aplicações de alto nível

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

Se definir a hora do sistema, esta não persiste quando o dispositivo perde energia. Para manter o tempo durante a perda de energia, tem de chamar a função Applibs clock_systohc. Quando clock_systohc é chamada, a hora do sistema é enviada para o RTC.

Requisitos de RTC

As aplicações que utilizam o RTC têm de incluir os ficheiros de cabeçalho adequados e adicionar definições RTC ao manifesto da aplicação.

Ficheiros de cabeçalho

Inclua o cabeçalho rtc no projeto:

 #include <applibs\rtc.h>

Definições do manifesto da aplicação

Para utilizar o RTC e as APIs de relógio padrão, tem de adicionar a capacidade de aplicação SystemTime ao manifesto da aplicação e, em seguida, definir o valor como true. O manifesto da aplicação do Azure Sphere tem mais detalhes sobre o manifesto da aplicação.

{
  "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 a hora do sistema é definida, não persiste quando o dispositivo perde energia. Para manter o tempo durante a perda de energia, chame a função clock_systohc Applibs. Quando clock_systohc é chamado, a hora do sistema é enviada para o RTC.

Configurar o serviço de cliente NTP

O serviço de cliente NTP está ativado por predefinição. Se definir a hora do sistema enquanto o serviço de cliente NTP estiver ativado, este substituirá a hora UTC quando o dispositivo tiver conectividade à Internet. Pode desativar o serviço de cliente NTP; No entanto, isto pode fazer com que as atualizações da cloud no dispositivo falhem se a diferença entre a hora do sistema e o tempo do servidor NTP for demasiado grande.

Definir o fuso horário

A hora do sistema e a hora do RTC são armazenadas em GMT/UTC. Pode alterar o fuso horário utilizado pela sua aplicação ao chamar a setenv função para atualizar a variável de ambiente TZ e, em seguida, chamar a tzset função.

O projeto SetTimeFromLocation mostra como utilizar a pesquisa de IP inverso para obter informações de localização e, em seguida, obter tempo para a localização 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 suportados.

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

  • Pode definir o fuso horário atual com ou sem Hora de Verão (DST). Exemplos: "EST+5", "EST+5EDT". Este valor é positivo se o fuso horário local estiver a oeste do Meridiano Primário e negativo se estiver a leste.
  • Não pode especificar a data e hora em que o DST deve entrar em vigor.
  • Não pode especificar um ficheiro/base de dados de fuso horário.

Para manter as definições de fuso horário durante uma perda de energia, pode utilizar o armazenamento mutável para armazenar o fuso horário no armazenamento persistente e, em seguida, recuperar a definição quando o dispositivo é reiniciado.

Especificar um servidor NTP

O serviço de cliente NTP pode ser configurado para obter tempo a partir de várias origens. A origem de tempo predefinida é prod.time.sphere.azure.net, conforme indicado nos requisitos de rede do SO do Azure Sphere.

O cliente NTP tenta sincronizar o tempo a cada 15 segundos até ocorrer uma sincronização com êxito. Depois de sincronizar o tempo com êxito, tenta sincronizar novamente o tempo uma vez a cada 24 horas. Quando o Azure Sphere efetua a sincronização de tempo, utiliza primeiro uma porta de origem de cliente UDP aleatória entre 32678 e 61000. Se esta porta falhar, o Azure Sphere tentará utilizar a porta 124 como porta de origem do cliente UDP.

Pode especificar que o sistema obtém tempo a partir de um servidor DHCP ou pode especificar a origem de tempo na aplicação através do Networking_TimeSync_EnableCustomNTP ou da Função Networking_TimeSync_EnableDefaultNtp.

Se configurado para utilizar DHCP para origens de servidor de tempo, o Azure Sphere processará a opção DHCP 042 e o cliente NTP só processará as duas primeiras entradas enviadas na opção DHCP, que deve ser listada por ordem de preferência. Estes serão considerados um servidor primário e um servidor secundário.

Também pode configurar um servidor de hora através de Networking_TimeSync_EnableCustomNTP se quiser especificar o servidor de hora principal e secundário através da aplicação. O comprimento máximo para cada vez que o nome de domínio completamente qualificado (FQDN) do servidor é de 255 carateres.

Contingência

  • Se o cliente NTP estiver configurado para obter os servidores de tempo através de DHCP ou API, é necessário um parâmetro adicional para especificar o comportamento de contingência.

  • O cliente tentará contactar primeiro o servidor de hora primária. Se o cliente não conseguir obter uma resposta válida do servidor de tempo, tentará o servidor de tempo secundário (se especificado).

  • Se for especificado um servidor de tempo secundário e este falhar ou se a opção para reverter para as predefinições do SO falhar Networking_NtpOption_FallbackServerEnabled , o sistema entrará em contacto com a origem de tempo predefinida do SO prod.time.sphere.azure.net.

    • No próximo intervalo de sincronização de tempo de 24 horas, o SO voltará atrás e tentará consultar o servidor de hora principal.
  • Se especificou Networking_NtpOption_FallbackServerDisabled, o SO continuará a consultar o servidor primário e secundário a cada 15 segundos até ser sincronizado com êxito com um dos servidores de tempo.

Dispositivos multihomed

As definições do servidor de hora são uma definição global, não uma definição por interface. Se o dispositivo do Azure Sphere for multihomed e ambas as interfaces obtiverem informações do servidor NTP através de DHCP, o conjunto de opções do NTP DHCP processado mais recentemente ganha.

Exemplo de tempo do sistema

O exemplo de Hora do Sistema mostra como gerir a hora do sistema e utilizar o RTC de hardware. A aplicação de exemplo define a hora do sistema e, em seguida, utiliza a clock_systohc função para sincronizar a hora do sistema com o RTC.

O projeto SetTimeFromLocation mostra como utilizar a pesquisa de IP inverso para obter informações de localização e, em seguida, obter tempo para a localização 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 suportados.

Exemplo NTP personalizado

O exemplo NTP Personalizado mostra como configurar o serviço de cliente NTP para obter tempo a partir de várias origens.