劉飛鵬 許婧 王建雄 奉延龍
摘 要:在通常的局域網中,各網絡設備的時鐘都有數秒甚至數分鐘的誤差,采用一種經濟實用高效的方法來提高局域網時間同步的準確性具有十分重要的意義。本文利用計算機獲取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.