Como usar o NTP com o Aduino Leonardo
Colocado sobreComo funciona o NTP?
O NTP usa pacotes UDP/IP para transferência de dados devido à configuração de conexão rápida e tempos de resposta. O número da porta oficial para o NTP (que o ntpd e o ntpdate escutam e conversam) é 123. A unidade de tempo é em segundos e a época é 1º de janeiro de 1900.
O timestamp NTP é um valor binário de 64 bits, construído a partir de um valor de segundos não assinados de 32 bits e uma parte fracionária de 32 bits. Nesta notação, o valor 3,5 seria representado pela string de 64 bits:
0000|0000|0000|0000|0000|0000|0000|0011 . 1000|0000|0000|0000|0000|0000|0000|0000
Se você pegar todos os bits como um inteiro sem sinal de 64 bits, armazene-o em uma variável de ponto flutuante com pelo menos 64 bits de mantissa (geralmente o dobro) e faça uma divisão de ponto flutuante por 2 ^ 32, você obterá o resposta correta. Em um Arduino padrão, infelizmente, não temos duplicatas de 64 bits, mas a maioria dos RTC tem apenas informações de segundo nível, portanto, não há necessidade de obter a segunda metade (ou possivelmente o primeiro byte). Apenas os quatro primeiros bytes de um pacote NTP de saída precisam ser definido para o que queremos alcançar
apropriadamente, o resto pode ser o que for.
Os campos de cabeçalho da mensagem NTP são os seguintes:
- Indicador de salto LI (2 bits)
- Este campo indica se o último minuto do dia atual deve ter um segundo bissexto aplicado. Seguem os valores dos campos:
- 0: Sem ajuste de segundo bissexto
- 1: Último minuto do dia tem 61 segundos
- 2: O último minuto do dia tem 59 segundos
- 3: O relógio não está sincronizado
- Este campo indica se o último minuto do dia atual deve ter um segundo bissexto aplicado. Seguem os valores dos campos:
- Número de versão VN NTP (3 bits) (a versão atual é 4).
- Modo Modo de pacote NTP (3 bits)
- Seguem os valores do campo Mode:
- 0: Reservado
- 1: Simétrico ativo
- 2: Simétrico passivo
- 3: Cliente
- 4: Servidor
- 5: Transmissão
- 6: mensagem de controle NTP
- 7: Reservado para uso privado
- Seguem os valores do campo Mode:
- Nível de estrato da fonte de tempo (8 bits)
- Seguem os valores do campo Stratum:
- 0: Não especificado ou inválido
- 1: servidor principal
- 2–15: servidor secundário
- 16: Não sincronizado
- 17–255: Reservado
- Seguem os valores do campo Stratum:
- Poll Intervalo de pesquisa (inteiro com sinal de 8 bits)
- O valor log2 do intervalo máximo entre mensagens NTP sucessivas, em segundos.
- Precisão Precisão do relógio (inteiro com sinal de 8 bits)
- A precisão do relógio do sistema, em log2 segundos.
- NTP primeiros quatro bytes 0xEC0600E3
Este é o cabeçalho da solicitação NTP, mas precisamos apenas dos primeiros 32 bits. Definimos o TAMANHO DO PACOTE NTP que é de 48 bytes porque o carimbo de data/hora do NTP está nos primeiros 48 bytes da mensagem após uma consulta bem-sucedida, obteremos uma resposta de 48 bytes do servidor NTP.
Para entender a estrutura de uma consulta e resposta NTP, consulte http://www.cisco.com/c/en/us/about/press/internet-protocol-journal/back-issues/table-contents-58/154-ntp.html
Portanto, se quisermos ler o "Transmit Timestamp", precisamos ler a parte inteira que é os bytes 40,41,42,43, se quisermos arredondar para o segundo mais próximo, se quisermos alguma precisão, a parte fracionária é o byte 44, 45,46,47 se for maior que 500ms o byte 44 será > 128 e assim verificando apenas o byte 44 da resposta, podemos arredondar para o próximo segundo; 90% dos servidores NTP têm atrasos de rede abaixo de 100ms
Também podemos considerar um atraso de rede médio assumido de 50 ms e, portanto, em vez de comparar com 128, você pode comparar com (0,5 s - 0,05 s) * 256 = 115;