一、NTP協(xié)議簡介
NTP網(wǎng)絡(luò)時間協(xié)議是TCP/IP協(xié)議族里的一個應(yīng)用層協(xié)議,常用于客戶端與服務(wù)器進行時鐘同步,提供高精度的時間校準(zhǔn),由于該服務(wù)存在并發(fā)量大且對丟包也沒有要求,所以傳輸層一般使用UDP報文,而TCP存在確認、重傳、阻塞等機制導(dǎo)致傳輸速率也不如UDP,一般情況系統(tǒng)默認使用123端口作為NTP端口。
NTP服務(wù)可用于網(wǎng)絡(luò)管理、計費系統(tǒng)、銀行授時、協(xié)同處理、系統(tǒng)時間、安全認證等場景,這些場景一般對時間精度有較高的要求,比如心知天氣使用私鑰加公鑰,為了私鑰安全還引入時間戳有效判斷機制,通過時間戳約束公鑰有效期,不知心知天氣API采用這種通訊機制,很多的網(wǎng)絡(luò)通訊為了安全都會對系統(tǒng)時間進行校驗,因此有一個統(tǒng)一的標(biāo)準(zhǔn)時間對于網(wǎng)絡(luò)而言意義重大。
NTP就是用來同步網(wǎng)絡(luò)中各個主機時鐘的一種協(xié)議,他將全球各大授時中心的準(zhǔn)確時間分享給設(shè)備,其精度在內(nèi)網(wǎng)內(nèi)可達1毫秒內(nèi),在互聯(lián)網(wǎng)上可以達到幾十毫秒以內(nèi)。
分享一些國內(nèi)常用的NTP服務(wù)器:
一、 中國科學(xué)院國家授時中心(ntp.ntsc.ac.cn:123)
二、 騰訊云NTP授時服務(wù)(ntp.tencent.com:123)
三、 阿里云NTP授時服務(wù)(ntp.aliyun.com:123)
四、 教育網(wǎng)NTP授時服務(wù)(time.edu.cn:123)
部分HMI本身沒有對NTP服務(wù)進行集成,應(yīng)該必須對NTP報文有一定的了解才能正確使用NTP對時服務(wù)器,下面將通過分析NTPv3了解NTP報文格式。
下面是一個發(fā)送實例,注意遠程主機必須使用域名,我這里實際使用的是ntp.ntsc.ac.cn:123,軟件在發(fā)送后自動DNS并覆蓋了我的輸入,重要的事說三遍,必須使用域名?。?!必須使用域名!?。?/span>
這里將發(fā)送時間和內(nèi)容都進行記錄,也對NTP服務(wù)器返回時間與數(shù)據(jù)進行記錄,后面分析應(yīng)當(dāng)配置的準(zhǔn)確會用到日志和數(shù)據(jù)收到的時間。
[2022-08-12 11:47:50.805]# SEND HEX TO 114.118.7.163 :123>
1B 00 04 FA 00 01 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[2022-08-12 11:47:50.853]# RECV HEX FROM 114.118.7.163 :123>
1C 02 04 EA 00 00 05 CF 00 00 15 6C 7B 8B 21 03 E6 A0 44 42 42 72 91 0E 00 00 00 00 00 00 00 00 E6 A0 4B E8 11 B7 C8 3E E6 A0 4B E8 11 B8 9C 4D
這里統(tǒng)計計算時間的方法,NTP報文中使用的是時間戳機制,我們將發(fā)送時間2022-08-12 11:47:50.805與接收時間2022-08-12 11:47:50.853也轉(zhuǎn)換為時間戳方便后續(xù)使用,通過網(wǎng)上搜索的時間戳轉(zhuǎn)換工具精選轉(zhuǎn)換發(fā)送時間(1660276070)與接收時間(1660276070)。
這篇文章不對協(xié)議進行分析僅對部分位進行說明,NTP協(xié)議報文可以參考這篇文章(https://www.jianshu.com/p/8bb29838ae1b)
NTP報文使用長度為64 Bits無符號數(shù)存儲一個時間戳,前32 Bits表示整數(shù)部分, 后32 Bits表示小數(shù)部分, 理論分辨率 2^?32s,由于HMI精度只能到秒,小數(shù)位對于本項目是沒有任何用處,不再分析小數(shù)部分,將接收報文記錄離開NTP服務(wù)的時間戳從報文中分離(E6 A0 4B E8 11 B8 9C 4D),提取前四個字節(jié)(HEX:E6 A0 4B E8àDEC:3869264872),與發(fā)送日志的1660276070805相差甚遠,這里就是NTP報文最坑的地方,時間戳0表示的是1970-01-01 08:00:00開始計算,而NTP服務(wù)的時間戳是從1900-01-01 00:00:00開始計算,因此兩種時間戳需要通過減去一個系數(shù)才能轉(zhuǎn)換2208988800= (70 * 365 + 17) * 24 * 60 * 60。
服務(wù)器返回的時間戳(3869264872-2208988800=1660276072),可見設(shè)備發(fā)送日志與實際時間相差2s。
實際上NTP對時服務(wù)在計算精確時間是有一個推薦公式。
客戶端與服務(wù)端的時間系統(tǒng)的偏移定義為θ、網(wǎng)絡(luò)的往返延遲定義為δ,基于此,可以對t2進行精確的修正,已達到相關(guān)精度要求,它們的計算公式如下:
公式中:
t0是請求數(shù)據(jù)包傳輸?shù)目蛻舳藭r間戳
t1是請求數(shù)據(jù)包回復(fù)的服務(wù)器時間戳
t2是響應(yīng)數(shù)據(jù)包傳輸?shù)姆?wù)器時間戳
t3是響應(yīng)數(shù)據(jù)包回復(fù)的客戶端時間戳
實際寫入的時間為t2加上網(wǎng)絡(luò)延時δ的一半就可以了(t2+δ/2)。
經(jīng)過上面原理的學(xué)習(xí),對NTP有了一定的了解,現(xiàn)在根據(jù)HMI的要求將業(yè)務(wù)流程復(fù)制到腳本中實現(xiàn)。
新建變量,使用透傳的模式的設(shè)備驅(qū)動,主要是學(xué)習(xí)腳本,以前關(guān)于MQTT協(xié)議的文章有講過怎樣配置驅(qū)動,變量表如下圖,由于NTP協(xié)議使用16進制收發(fā)數(shù)據(jù),也就需要對應(yīng)調(diào)整收發(fā)數(shù)據(jù)模式:
使用按鍵關(guān)聯(lián)發(fā)送腳本如下:
COM1_WRITE_BUFF_CACHE="1B0004FA0001000000010000000000000000000000000000000000000000000000000000000000000000000000000000"
!SetDevice(system_time,6,"Write(COM1_WRITE_BUFF_CACHE, COM1_READ_BUFF_CACHE)")
t0=!TimeGetCurrentTime()
使用事件策略關(guān)聯(lián)接收狀態(tài)變量“COM1_READ_RUN_STATE”,在電平跳變時觸發(fā)“數(shù)據(jù)解析”與“時間配置”腳本:
“數(shù)據(jù)解析”,將NTP服務(wù)返回的數(shù)據(jù)保存到t1_str與t2_str,在轉(zhuǎn)換成時間戳存儲在t1與t2,
IF !len(COM1_READ_BUFF_CACHE)=96 THEN
t3=!TimeGetCurrentTime()
t1_str=!mid(COM1_READ_BUFF_CACHE,65,8)
t1=!Hex2I(t1_str)-2208988800
t2_str=!mid(COM1_READ_BUFF_CACHE,80,8)
t2=!Hex2I(t2_str)-2208988800
set_time=t2+((t3-t0)-(t1-t1))/2
ENDIF
“時間配置”,利用計算得到的時間戳配置HMI系統(tǒng)時間:
!SetTime(!TimeGetYear(set_time),!TimeGetMonth(set_time),!TimeGetDay(set_time),!TimeGetHour(set_time),!TimeGetMinute(set_time),!TimeGetSecond(set_time))
查看技術(shù)文章和免費咨詢技術(shù)問題可以訪問我司官網(wǎng)及各官方平臺:
微信號:cdebyte
今日頭條:億佰特
新浪微博:成都億佰特
成都億佰特--物聯(lián)網(wǎng)應(yīng)用專家,隨時在身邊,時刻準(zhǔn)備為您服務(wù)!