내가 개발하는 장비는 동일한 네트워크 안에 서버(PC)와 임베디드장비(Wince 6.0, 6410)가 TCP/IP 통신으로 서버의 시간정보, 날씨정보, 환율정보 등을 받는 구조다.
영업2팀에서 해외현장에 서버없이 임베디드 장비만 설치하는 형태일때의 문제점에 대해 문의를 해왔다.
내가 생각하는 문제점은...
1. 장비에 시간이 틀어졌을때 보정할 수 있는 방법이 없다.(장비 내에 GPS 파트가 없음)
2. 서버에서 받아오는 날씨정보, 환율정보를 쓸 수 없다.
3. 장비의 프로그램 업데이트가 불가능하다.
영업2팀과 협의한 결과 1번 문제만 해결이 되면 2, 3번은 무시할 수 있다는 내용.
그리하여... SNTP로 서버의 시간연동기능을 대체하자...라는 목적으로...
대략 1주일 정도의 삽질이 시작되었다.
검색을 해서 대충 정리한 내용은.
1. ntp 패킷구조(클라이언트에서 서버로 보내는 패킷)
2. 클라이언트에서 요청할때 보내는 ntp 패킷을 어떻게 세팅해서 서버로 보낼것인가.
3. ntp 서버 리스트
4. 줄리안 방식 시간을 그레고리안 방식 시간으로 변환하는 과정
5. 그레고리안 방식 시간을 줄리안 방식 시간으로 변환하는 과정
6. ntp 서버에서 받은 시간은 UTC(혹은 GMT)라서 장비에 설정된 시간대에 따라서 Locale time으로 변환하는 과정.
기능 추가중 SNTP 서버가 일시적으로 반응이 없을때가 있어서
서버리스트를 추가해서 1번 서버로 요청했을때 수초 이내에 응답이 없을때
다음번호의 서버로 요청하도록 구현하였음.
결과 잘됨. ㅋㅋㅋㅋ
<NTP 기본 패킷 구조>
// Ref. RFC 2030 - Simple Network Time Protocol (SNTP) Version 4 for IPv
// http://www.faqs.org/rfcs/rfc2030.html
typedef struct _ntp_packet_t
{
uint8_t mode : 3 ;
uint8_t vn : 3 ;
uint8_t li : 2 ;
uint8_t stratum ;
uint8_t poll ;
uint8_t precision ;
uint32_t root_delay ;
uint32_t root_dispersion ;
uint32_t reference_identifier ;
timestamp_t reference_timestamp ;
timestamp_t originate_timestamp ;
timestamp_t receive_timestamp ;
timestamp_t transmit_timestamp ;
} ntp_packet_t;
클라이언트에서 서버로 ntp 패킷을 보낼때는
vn, mode, li 세가지만 값을 넣어서 보내면 된다.
구글링을 미친듯이해서 찾아낸거라 출처불명... =ㅅ=
뭐... 핵심만 응용하면 된다.
<참고소스>
sntp.zip
ntpdate.c
sample_sntp.c
<SNTP Server 관련 참고>
http://time.ewha.or.kr/index.html
<SNTP Server List>
time.nist.gov
time.windows.com
time.nuri.net
pool.ntp.org
ntp.usno.navy.mil
ntp2.usno.navy.mil
tock.usno.navy.mil
tick.usno.navy.mil
ntp-s1.cise.ufl.edu
ntp.colby.edu