一、NTP協(xié)議簡介
NTP網(wǎng)絡時間協(xié)議是TCP/IP協(xié)議族里的一個應用層協(xié)議,常用于客戶端與服務器進行時鐘同步,提供高精度的時間校準,由于該服務存在并發(fā)量大且對丟包也沒有要求,所以傳輸層一般使用UDP報文,而TCP存在確認、重傳、阻塞等機制導致傳輸速率也不如UDP,一般情況系統(tǒng)默認使用123端口作為NTP端口。
NTP服務可用于網(wǎng)絡管理、計費系統(tǒng)、銀行授時、協(xié)同處理、系統(tǒng)時間、安全認證等場景,這些場景一般對時間精度有較高的要求,比如心知天氣使用私鑰加公鑰,為了私鑰安全還引入時間戳有效判斷機制,通過時間戳約束公鑰有效期,不知心知天氣API采用這種通訊機制,很多的網(wǎng)絡通訊為了安全都會對系統(tǒng)時間進行校驗,因此有一個統(tǒng)一的標準時間對于網(wǎng)絡而言意義重大。
NTP就是用來同步網(wǎng)絡中各個主機時鐘的一種協(xié)議,他將全球各大授時中心的準確時間分享給設備,其精度在內(nèi)網(wǎng)內(nèi)可達1毫秒內(nèi),在互聯(lián)網(wǎng)上可以達到幾十毫秒以內(nèi)。
分享一些國內(nèi)常用的NTP服務器:
一、 中國科學院國家授時中心(ntp.ntsc.ac.cn:123)
二、 騰訊云NTP授時服務(ntp.tencent.com:123)
三、 阿里云NTP授時服務(ntp.aliyun.com:123)
四、 教育網(wǎng)NTP授時服務(time.edu.cn:123)
部分HMI本身沒有對NTP服務進行集成,應該必須對NTP報文有一定的了解才能正確使用NTP對時服務器,下面將通過分析NTPv3了解NTP報文格式。
下面是一個發(fā)送實例,注意遠程主機必須使用域名,我這里實際使用的是ntp.ntsc.ac.cn:123,軟件在發(fā)送后自動DNS并覆蓋了我的輸入,重要的事說三遍,必須使用域名?。?!必須使用域名!??!
這里將發(fā)送時間和內(nèi)容都進行記錄,也對NTP服務器返回時間與數(shù)據(jù)進行記錄,后面分析應當配置的準確會用到日志和數(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服務的時間戳從報文中分離(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服務的時間戳是從1900-01-01 00:00:00開始計算,因此兩種時間戳需要通過減去一個系數(shù)才能轉(zhuǎn)換2208988800= (70 * 365 + 17) * 24 * 60 * 60。
服務器返回的時間戳(3869264872-2208988800=1660276072),可見設備發(fā)送日志與實際時間相差2s。
實際上NTP對時服務在計算精確時間是有一個推薦公式。
客戶端與服務端的時間系統(tǒng)的偏移定義為θ、網(wǎng)絡的往返延遲定義為δ,基于此,可以對t2進行精確的修正,已達到相關精度要求,它們的計算公式如下:
公式中:
t0是請求數(shù)據(jù)包傳輸?shù)目蛻舳藭r間戳
t1是請求數(shù)據(jù)包回復的服務器時間戳
t2是響應數(shù)據(jù)包傳輸?shù)姆掌鲿r間戳
t3是響應數(shù)據(jù)包回復的客戶端時間戳
實際寫入的時間為t2加上網(wǎng)絡延時δ的一半就可以了(t2+δ/2)。
經(jīng)過上面原理的學習,對NTP有了一定的了解,現(xiàn)在根據(jù)HMI的要求將業(yè)務流程復制到腳本中實現(xiàn)。
新建變量,使用透傳的模式的設備驅(qū)動,主要是學習腳本,以前關于MQTT協(xié)議的文章有講過怎樣配置驅(qū)動,變量表如下圖,由于NTP協(xié)議使用16進制收發(fā)數(shù)據(jù),也就需要對應調(diào)整收發(fā)數(shù)據(jù)模式:
使用按鍵關聯(lián)發(fā)送腳本如下:
COM1_WRITE_BUFF_CACHE="1B0004FA0001000000010000000000000000000000000000000000000000000000000000000000000000000000000000"
!SetDevice(system_time,6,"Write(COM1_WRITE_BUFF_CACHE, COM1_READ_BUFF_CACHE)")
t0=!TimeGetCurrentTime()
使用事件策略關聯(lián)接收狀態(tài)變量“COM1_READ_RUN_STATE”,在電平跳變時觸發(fā)“數(shù)據(jù)解析”與“時間配置”腳本:
“數(shù)據(jù)解析”,將NTP服務返回的數(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))
查看技術文章和免費咨詢技術問題可以訪問我司官網(wǎng)及各官方平臺:
微信號:cdebyte
今日頭條:億佰特
新浪微博:成都億佰特
成都億佰特--物聯(lián)網(wǎng)應用專家,隨時在身邊,時刻準備為您服務!