基于Visual Studio程序语言的GPS局域网时间同步研究
2018-09-10刘飞鹏许婧王建雄奉延龙
刘飞鹏 许婧 王建雄 奉延龙
摘 要:在通常的局域网中,各网络设备的时钟都有数秒甚至数分钟的误差,采用一种经济实用高效的方法来提高局域网时间同步的准确性具有十分重要的意义。本文利用计算机获取GPS时间和自动校核时间的方法,并提出局域网时间同步的解决方案,利用Visual Studio来实现计算机系统时间同步,方法简捷,适用性强,时间误差得到显著修正。
关键词:Visual Studio;局域网;时间同步;GPS时间
中图分类号:TP391.72 文献标识码:A 文章编号:1003-5168(2018)20-0018-03
Research on GPS Local Area Network Time Synchronization
Based on Visual Studio
LIU Feipeng1 XU Jing2,3 WANG Jianxiong2,3 FENG Yanlong4
(1.China Forest Exploration and Design Institute on Kunming,Kunming Yunnan 650216;2. College of Water Conservancy, Yunnan Agricultural University,Kunming Yunnan 650201;3.Research Center of Agricultural Remote Sensing and Precision Agriculture Engineering in Yunnan Universities,Kunming Yunnan 650201; 4. Hepu County Water Conservancy Bureau,Hepu Guangxi 536100)
Abstract: In the usual LAN, the clock of each network device has a few seconds or even a few minutes of error. It is of great significance to adopt an economical, practical and efficient method to improve the accuracy of the time synchronization of the LAN. In this paper, the method of acquiring GPS time and auto-checking time by computer was presented, and the solution of time synchronization in LAN was put forward. The method was simple and applicable, and the time error was significantly corrected by using Visual Studio to realize time synchronization in computer system.
Keywords: Visual Studio;local area network;time synchronization;GPS time
隨着网络科技的发展,时间同步的重要性逐渐提升。传统应用程序大多是独立、自成一体的,具有一定的局限性,修改程序复杂,且传统程序的建立极为麻烦,维护费用昂贵。相反,用分布式对象建立的应用程序却可以很自然地包含多个层次结构,从而将需要考虑的不同问题完全分离开来。分布式应用程序的运行需要将不同的应用程序分布在不同的电脑上,然后通过网络来共同完成一项任务,这就需要时间同步来保证任务准确无误地完成。另外,E-mail信息、文件创建和访问时间、数据库处理时间、通信行业、测绘行业和交通运输业的时间显示系统等对时间同步要求都很高。因此,开发一个经济、准确、高效的软件来确保局域网时间同步具有重要意义。
1 GPS简介
利用GPS定位卫星在全球范围内实时进行定位、导航的系统称为全球卫星定位系统,简称GPS。其特点为:①全球全天候定位;②定位精度高;③观测时间短;④测站间无须通视;⑤仪器操作简单;⑥可提供全球统一的三维地心坐标;⑦应用广泛[1]。
GPS的功能有3个,即导航、测量、授时。完成时间同步需要用到授时功能。GPS由3部分组成:空间部分、地面控制系统和用户设备。常用的是用户设备,也就是GPS信号接收机。GPS定位系统由24颗环绕地球的卫星组成,卫星向全球发射可接收的标准授时信号,GPS时钟设备通过锁定4~6颗卫星,计算出准确的格林尼治时间,并发出校时信号。GPS时钟一般包括天线、GPS接收器和守时钟等部件。当前,较多的局域网采用Windows自带的时间获取软件,但时间准确度难以得到保证,所以采用GPS时钟设备作为时钟源进行授时就十分必要。
2 获取时间的方法
2.1 GPS与电脑取得联系的方法
GPS和Visual Studio软件连接的参数主要有两个。
①串口端口号。安装好GPS驱动后,在设备管理器硬件列表端口下面的USB GPS Comm Port设备后的括号中找到相应的驱动。对于Windows 8系统,可在驱动程序中找到相应驱动[2]。
进入设备列表的方法是:在桌面“我的电脑”图标上按鼠标右键—选择属性菜单—选择硬件菜单栏—设备管理器—点击列表里面的端口项—USB GPS Comm Port (COM?),找到问号所代表的GPS端口号[3]。
②波特率,即单片机或计算机在串口通信时的速率。
2.2 从GPS获取时间到电脑的方法
要用GPS获取时间和日期,需要对导航型GPS进行数据处理,语句要选用GPRMC,推荐定位信息(GPRMC)[4]。
$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh
<1> UTC时间,hhmmss.sss(时分秒.毫秒)格式;
<2> 定位状态,A=有效定位,V=无效定位;
<3> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输);
<4> 纬度半球N(北半球)或S(南半球);
<5> 经度dddmm.mmmm(度分)格式(前面的0也将被传输);
<6> 经度半球E(东经)或W(西经);
<7> 地面速率(000.0~999.9节,前面的0也将被传输);
<8> 地面航向(000.0~359.9°,以正北为参考基准,前面的0也将被传输)
<9> UTC日期,ddmmyy(日月年)格式;
<10> 磁偏角(000.0~180.0°,前面的0也将被传输);
<11> 磁偏角方向,E(东)或W(西);
<12> 模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)。
本文研究时间同步,因此选取<1>和<9>。
<1> UTC时间,hhmmss.sss(时分秒.毫秒)格式;
<9> UTC日期,ddmmyy(日月年)格式。
获取的格式需要转换为yyyy/mm/dd,hh:mm:ss
北京为东8区,因此要加8h转为北京时间,C#代码如下:
private void BasePortUpdateTextBox(string BasePorttext)
{try
{ string[] temp = BasePorttext.Split(',');
if (temp[0] == "$GPRMC") //獲取GPRMC
{if (temp[2] == "A")
{BaseLabel.Text = "有效定位" ;
if (temp[9].Length == 6 && temp[1].Length >= 6)
{temp[1] = (BaseB + 80000).ToString();
string dtString = string.Format("{0}-{1}-{2} {3}:{4}:{5}",
temp[9].Substring(4),
temp[9].Substring(2, 2),
temp[9].Substring(0, 2),
temp[1].Substring(0, 2),
temp[1].Substring(2, 2),
temp[1].Substring(4));
this.UTCDateTime = DateTime.Parse(dtString); }
textBox1.Text = UTCDateTime.ToString(); textBox2.Text = DateTime.Now.ToString();}
else
{BaseLabel.Text = "无效定位"; }}}
catch (Exception ex)
{ MessageBox.Show(ex.Message); }}
3 自动更改系统时间为GPS时间的方法
要设置系统时间,需要调用系统动态链接库kernel32.dll,要求自动更新时间需要用到timer控件,需要设置每隔一段固定的时间运行一次程序来更改系统时间为通过GPS获取的时间[5]。
相关C#代码如下:
// 获取系统时间API
[DllImport("kernel32.dll")]
public extern static void GetSystemTime(ref SystemTime sysTime);
// 设置系统时间API
[DllImport("kernel32.dll")]
public extern static bool SetSystemTime(ref SystemTime sysTime);
private void timer1_Tick(object sender, EventArgs e)
{ timer1.Enabled = false;
timer1.Interval = 15000;//以毫秒为单位
// 设定时间,该结构体内的时间必须为UTC时间
SystemTime updatedTime = new SystemTime();
updatedTime.Year = (ushort)UTCDateTime.Year;
updatedTime.Month = (ushort)UTCDateTime.Month;
updatedTime.Day = (ushort)UTCDateTime.Day;
updatedTime.Hour = (ushort)(UTCDateTime.Hour - 8);
updatedTime.Minute = (ushort)UTCDateTime.Minute;
updatedTime.Second = (ushort)(UTCDateTime.Second + 1);
// 设定时间
SetSystemTime(ref updatedTime); }
4 基于Visual Studio局域网时间同步方案
4.1 服务器时间校核为GPS时间
先用Visual Studio程序语言编写应用程序,并将服务器时间手动校核一次,使服务器时间更新为GPS时间;由于系统时间每隔一定时间都会有一定的误差,因此还需点自动校核按钮,使服务器每隔一定时间自动校核一次,保证服务器时间始终与GPS时间一致。
4.2 客户机时间校核为服务器时间
創建局域网页,使网页中显示服务器时间和客户机时间,客户机时间获取方法与前文一致,服务器时间需要由应用程序中获取的GPS时间读入数据库,再由数据库读入网页,网页中设置2个按钮:一个用于人工校核,一个用于电脑自动校核。最终结果显示:①点校核按钮,客户机局域网页中客户机与服务器时间同步;②点自动校核按钮,让电脑自动校核,并完成客户机与服务器时间同步。
5 结语
GPS作为标准时钟源,运用Visual Studio程序语言,在局域网时间同步中的作用显著,方法简捷,适用性强。其不仅能满足多设备的要求,而且能保证时间需求的高精度、高稳定性。
局域网页中获取GPS时间的过程中,先将GPS时间读入应用程序,再由应用程序进入数据库,最后再通过数据库读入网页中,在这几个阶段,不断的读入过程也需要花费时间,因此最终到达网页的时间可能与GPS时间存在一定误差,这个误差还应该修正。本文较好地实现了GPS时间与单个系统的同步,局域网的同步还需要不断修正,最终达到更为准确的时间同步。
参考文献:
[1]肖明,贺鹏,徐守志.基于GPS的局域网时间同步的研究[J].科技信息,2010(5):443.
[2]胡绍波.局域网时间同步系统设计与实现[J].计算机时代,2013(6):45-52.
[3]谌华金,罗双喜,何佳洲.利用CPU时间戳实现局域网时间同步的新机制[J].计算机应用,2009(11):2920-2924.
[4]谌华金,何佳洲.一种基于数据链路层的局域网时间同步新机制[J].计算机应用,2010(5):1183-1187.
[5]刘爱东,黄彬,张永辉.一种基于通用PC的局域网时间同步方法[J].科学技术与工程,2012(28):7434-7438.