|
1 概述
在Windows XP及其相邻版本的桌面操作系统和服务器操作系统中,微软公司都设计了Internet时间自动同步功能。该功能是通过Internet网络向架设在网络上的时间服务器获取时间信息,再自动校准自己的系统时间,从而使自己的系统时间与时间服务器提供的时间同步。在设计基于该系统的应用软件时,只要使用 API函数GetSystemTime()就可以间接地获取较为准确的时间信息。随着嵌入式系统在工业控制领域的迅速普及,WinCE操作系统以其方便灵活的文件系统和丰富多彩的操作界面,赢得了人们的广泛关注。在当前以嵌入式系统为主流的工业控制系统中大都集成了网络功能,WinCE操作系统虽然提供了对TIC/IP协议的全面支持,但是它无法像桌面操作系统或服务器操作系统那样提供时间自动同步功能。
随着广播电视数字化进程的推进和设备固态化的普及,笔者所处的广播电视传输发射设备的控制也都由传统的MCS51系列单片机向ARM嵌入式系统转变,许多设备都采用了嵌入式控制。在控制领域,尤其在信息传输过程中,时间信息往往又作为一个统一的基准,起着至关重要的作用。在日后的设备远程监控和技术革新中,只要涉及到嵌入式控制软件的设计,不可避免地涉及到时间同步问题。
鉴于此,我们在研究和分析了网络时间服务器的相关协议后,结合嵌入式WinCE系统和Internet网络的特点,设计了这一具有自动校准系统时间功能的Internet时间同步软件。
2 Internet时间服务器
Internet时间服务器是一种利用Internet网络把标准时间信息传递给用户的装置。它的时间信息来自于上一级(或层)时间服务器或原子钟等高精度时间源。它可以提供高精准度国际标准时间UTC(Universal Time Coordinated)。标准时间信息通过TCP/IP网络传输给用户。
在 Internet上有3个不同的时间服务,每一个都由Request For Comment(RFC)定义为Internet日期时间标准。这3个标准分别为RFC867、RFC868和RFC1305。其中的RFC868和 RFC1305是可以提供ms级精度的时间标准,采用的是网络时间协议(Network Time Protocol, NTP)。在桌面操作系统和服务器操作系统中广泛使用的时间同步标准是RFC867,它采用的是Daytime协议。虽然它只能提供秒级精度的时间,但是,作为一般工业控制的时钟依据已经足够了,GetSystemTime()也只是秒级的时间精度。这里采用Daytime协议。
2.1 Daytime协议
Daytime协议(RFC867 Daytime Protocol) 规范了一个ARPA Internet community上的标准。在ARPA Internet上都应当采用和实现这个标准。它的作用就是向用户返回当前标准的时间和日期。
(1) 基于TCP的daytime服务
daytime服务是基于TCP的应用,服务器在TCP端口13监听,连接一旦建立就向对方返回ASCII形式的日期和时间。 本设计就采用这种服务。
(2) 基于UDP的daytime服务
daytime服务也可以使用UDP协议,它的端口也是13,不过UDP是用数据报传送当前时间的。
2.2 Daytime格式
NIST Internet Time Service (ITS)所公布的Daytime格式如下:
JJJJJ YRMODA HH:MM:SS TT L H msADV UTC(NIST) OTM
其中,“YRMODA HH:MM:SS”代表“年月日 时:分:秒”;H表示服务器的工作状态,0为正常,1为异常;JJJJJ 为修改后的朱利安日期(MJD)。其他项在本设计中没有用到,就不再解释。
通过对Internet时间服务器连接后的返回数据分析,可以得到:第7、8两个字节为年份;10、11两个字节为月份;13、14两个字节为日期;16、17两个字节为时;19、20两个字节为分;22、23两个字节为秒;第30字节是服务器的工作状态。
2.3 时间服务器地址
用户可以输入自己已知的时间服务器地址(优先选用)。这里还置入了一些目前较为稳定可靠的时间服务器地址:
◆ 129.6.15.28
◆ 132.163.4.101
◆ 132.163.4.102
◆ 132.163.4.103
◆ 128.138.140.44
◆ 129.6.15.29
◆ 129.43.244.18
3 连接Internet时间服务器获取时间信息
WinCE支持 TCP/IP通信协议,同时还支持套接字(Socket)的应用。通过调用Socket的API函数可以完成网络通信程序的编写。本设计就是通过套接字与 Internet时间服务器建立连接来获取时间信息的。
首先需要用 “WSAStartup(MAKEWORD(2,2),&wsd)”加载套接字,用“socket(AF_INET, SOCK_STREAM, 0)”创建套接字;然后由“connect(hSocket,(struct sockaddr*)&sin, sizeof(sin))”向internet时间服务器发出连接请求。
对于wsd、sin以及后面程序要用到的hostinfo等,要进行如下定义:
WSADATA wsd;
PHOSTENT hostinfo;
struct sockaddr_in sin;
struct hostent *host=NULL;
LPCSTR ip;
SOCKET hSocket;
连接Internet时间服务器的具体程序为:
WSAStartup(MAKEWORD(2,2),&wsd);
hSocket=socket(AF_INET, SOCK_STREAM, 0);
sin.sin_addr.s_addr=inet_addr(ip);
sin.sin_family=AF_INET;
sin.sin_port=htons(13);
connect(hSocket,(struct sockaddr*)&sin,sizeof(sin)))
程序中的ip就是需要连接的Internet时间服务器的地址,13为提供时间服务的端口号。连接成功返回为空。连接成功以后还需要向它发出GET请求报文,之后就可以接收Internet时间服务器返回的时间信息了。
发送GET请求报文:
wsprintf(szBuff,"GET/HTTP/1.1\\r\\n");
send(hSocket,szBuff,strlen(szBuff),0);
wsprintf(szBuff,"UserAgent: WinceNetTime.EXE\\r\\n");
send(hSocket Cs,szBuff,strlen(szBuff),0);
wsprintf(szBuff,"Host: ");
strcpy(szBuff,szLocalIp);
strcpy(szBuff,":13\\r\\n\\r\\n");
send(hSocket,szBuff,strlen(szBuff),0);
接收Internet时间服务器返回的时间信息:
szRecv(hSocket,szRecv, sizeof(szRecv),0);
这样,服务器返回的时间信息便保存到szRecv里。
4 自动校准系统时间
4.1 时间服务器选择策略
由于Internet时间服务器可能存在工作状态不正常、域名变更、Internet网络阻塞等状况,在自动同步时间时采用了如图1 所示的时间服务器选择策略。
图1 时间服务器选择策略
4.2 校准系统时间
SetSystemTime()是设置系统时间的函数,它只有一个参数,是一个SYSTEMTIME结构。只要把接收到的时间信息赋值给这个结构的对应成员,再执行这个函数,就可以同步WinCE系统时间了。
SYSTEMTIME tm;
szBuff[0]=szRecv[7];szBuff[1]=szRecv[8];szBuff[2]=0;
tm.wYear=2000+atoi(szBuff);
szBuff[0]=szRecv[10];szBuff[1]=szRecv[11];szBuff[2]=0;
tm.wMonth=atoi(szBuff);
szBuff[0]=szRecv[13];szBuff[1]=szRecv[14];szBuff[2]=0;
tm.wDay=atoi(szBuff);
szBuff[0]=szRecv[16];szBuff[1]=szRecv[17];szBuff[2]=0;
tm.wHour=atoi(szBuff);
szBuff[0]=szRecv[19];szBuff[1]=szRecv[20];szBuff[2]=0;
tm.wMinute=atoi(szBuff);
szBuff[0]=szRecv[22];szBuff[1]=szRecv[23];szBuff[2]=0;
tm.wSecond=atoi(szBuff);
SetSystemTime(&tm); 程序中的atoi()是ASCII字符转换成整数的子程序。为了避免时间同步程序在连接时间服务器及通信过程中出现阻塞,对WinCE其他程序产生影响,将这部分程序专门开辟一个线程来进行处理。在这个线程中,程序将按用户设置的时间间隔来自动同步系统时间。
结语
嵌入式系统的时间同步在自动控制和通信领域占有特别重要的地位。本文在从Internet时间服务器的Daytime协议入手,详细地介绍了连接时间服务器获取时间信息的实现机理和实现方法。由于在连接时间服务器时,采用了自己设计的时间服务器选择策略,使得自动同步时间的成功率大为提高。将它定制到WinCE内核中,随系统启动后,便可以完成嵌入式WinCE系统的时间自动同步。同样地,这种设计方法也可以运用到WinCE的应用软件中。
参考文献
[1] 陈华鹏.简单网络时间协议(SNTP) [OL].[201106]. http://man.lupaworld.com/content/develop/rfc/RFC1769.htm.
[2] Mills D L.Modelling and Analysis of Computer Network Clocks: Electrical Engineering Department Report 9252[R]. Newark: University of Delaware,1992:29.
[3] J Postel. RFC867—1983 Daytime Protocol[S].
[4] 冯博琴,徐景民,李波.计算机时间同步问题的研究[J].西安交通大学学报,1999,33(5).
[5] 李明国,宋海娜,胡卫东. Internet网络时间协议原理与实现[J].计算机工程,2002,28(2). |
|