WiFi가 내장 된 임베디드 시스템 (Arduino IDE를 사용하여 개발 된 80MHz ESP8266 기반)이 있으며 적절한 시계 시간을 1 초로 유지하고 싶습니다.), 인터넷과 자체 내부 타이머를 사용할 수 있습니다.NTP 시간을 로컬 타이머 기반 시간과 주기적으로 동기화하는 방법
도전 :
- 은 프로세서 클럭 가능성이 표면 상 예측 가능한 방식으로, 시간이 지남에 표류한다.
- NTP는 UDP를 사용하기 때문에 시간이 반환되는 패킷은 의 순서로 반환되거나 설정된 간격 내에 반환되거나 을 반환 할 수 없습니다.
- 반환 NTP 패킷의 지연 시간은 100ms에서 (잠재적으로) 몇 초까지 시간에 따라 크게 다릅니다.
- DNS 대기 시간은 100ms 미만에서 초까지 시간에 따라 크게 다릅니다 (시간 제한을 제어 할 수 없음). DNS는 NTP 서버 풀의 IP 주소를 위로 올려야합니다. 대안
- 시스템은 특정 시간과 간격에 따라 다양한 작업을합니다, 그래서 불필요하게 누락 또는 중복으로 행동의 원인, 지속적으로 앞뒤로 그것을 설정, 시간을 지나치게 통제하고 싶지 않아 (또는 , 이러한 모든 조건을 처리하는 로직 프로그램을 복잡하게하는 경우가 종종 발생합니다. 또는 중복이 중요하지 않습니다.
- 때때로 NTP 서버가 잘못된 시간을 반환합니다 가끔 오래된 시간이 길 잃은 반환 패킷 방금 도착
- (예를 들면, pool.ntp.org 가끔 감지하기 쉬운 인 1900 년부터 0초을 반환) 현재 요청의 패킷 반환.
현재 접근법 :
- 는 ISR을 사용하여 증가 로컬 디바이스 시간을 유지 매 0.1 초 트리거.
- 정기적으로 폴링 (현재 6 분마다 발생하지만 실제로는 이 아닙니다) NTP 서버 (풀).
- 짧은 간격 (현재는 1 초, 일반적인 것보다 짧지 만 대부분의 요청은 에서 150ms 미만으로 응답 함) 내에 응답이없는 경우 다시 시도하십시오.
- 로드 할 때마다 NTP 서버 (풀)를 변경하고 평균 응답 시간과 모든 서비스 오류를 으로 변경하십시오.
- 시간을 가장 가까운 0.1 초로 추출하십시오 (일반적으로 수신 대기 시간은 입니다).
- NTP 시간이 로컬 장치 시간에서 초 이상 벗어난 경우 로컬 장치 시간 (중요 섹션)을 업데이트하십시오.
- 실패한 프로세스의 네트워크 요소에 대해 시간 초과, 재시도 및 재 초기화 (해당되는 경우). 대부분의 희망 후 요청을 포기하십시오 가 손실되고 다음 번에 다시 시도하십시오.
이 시간 동기화를 수행하는 데있어 더 나은 방법이나 최선의 방법이 있습니까? 내가 누락 된 다른 요인이나 접근법이 있습니까?
물론 나는 RTC를 고려해 보았지만 이러한 장치가 많아 상업적 프로젝트가 아니므로 단위 비용을 최소화하고 싶습니다. ESP8266 (WiFi 포함)은 포함되거나 외부 인터넷 기능이있는 다른 프로세서와 비교할 수 없을 정도의 크기입니다. 이것들은 임베디드 데이터 수집 장치이므로 배포가 끝나면 압축을 풀고 수동으로 수행하는 것은 매우 불편합니다. 나는 동일한 디자인 제약 조건의 대부분이 두 개의 서로 다른 시간 소스에서 동기화하려는 시스템에 적용된다고 생각합니다. – pseudon