DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3181|回复: 1
打印 上一主题 下一主题

[待整理] WinCE系统的Internet时间自动同步软件设计

[复制链接]
跳转到指定楼层
楼主
发表于 2015-7-18 07:37:09 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
  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 YRMODA HH:MM:SS TT L H msADV UTC(NIST) OTM
  其中,“YRMODA 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,"UserAgent: 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].[201106].
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).
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2024-11-15 19:53 , 耗时 0.097850 秒, 20 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表