一、NTP協議簡介
NTP網絡時間協議是TCP/IP協議族里的一個應用層協議,常用于客戶端與服務器進行時鐘同步,提供高精度的時間校準,由于該服務存在并發(fā)量大且對丟包也沒有要求,所以傳輸層一般使用UDP報文,而TCP存在確認、重傳、阻塞等機制導致傳輸速率也不如UDP,一般情況系統(tǒng)默認使用123端口作為NTP端口。
NTP服務可用于網絡管理、計費系統(tǒng)、銀行授時、協同處理、系統(tǒng)時間、安全認證等場景,這些場景一般對時間精度有較高的要求,比如心知天氣使用私鑰加公鑰,為了私鑰安全還引入時間戳有效判斷機制,通過時間戳約束公鑰有效期,不知心知天氣API采用這種通訊機制,很多的網絡通訊為了安全都會對系統(tǒng)時間進行校驗,因此有一個統(tǒng)一的標準時間對于網絡而言意義重大。
NTP就是用來同步網絡中各個主機時鐘的一種協議,他將全球各大授時中心的準確時間分享給設備,其精度在內網內可達1毫秒內,在互聯網上可以達到幾十毫秒以內。
分享一些國內常用的NTP服務器:
一、 中國科學院國家授時中心(ntp.ntsc.ac.cn:123)
二、 騰訊云NTP授時服務(ntp.tencent.com:123)
三、 阿里云NTP授時服務(ntp.aliyun.com:123)
四、 教育網NTP授時服務(time.edu.cn:123)
部分HMI本身沒有對NTP服務進行集成,應該必須對NTP報文有一定的了解才能正確使用NTP對時服務器,下面將通過分析NTPv3了解NTP報文格式。
下面是一個發(fā)送實例,注意遠程主機必須使用域名,我這里實際使用的是ntp.ntsc.ac.cn:123,軟件在發(fā)送后自動DNS并覆蓋了我的輸入,重要的事說三遍,必須使用域名?。?!必須使用域名!?。?/span>
這里將發(fā)送時間和內容都進行記錄,也對NTP服務器返回時間與數據進行記錄,后面分析應當配置的準確會用到日志和數據收到的時間。
[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也轉換為時間戳方便后續(xù)使用,通過網上搜索的時間戳轉換工具精選轉換發(fā)送時間(1660276070)與接收時間(1660276070)。
這篇文章不對協議進行分析僅對部分位進行說明,NTP協議報文可以參考這篇文章(https://www.jianshu.com/p/8bb29838ae1b)
NTP報文使用長度為64 Bits無符號數存儲一個時間戳,前32 Bits表示整數部分, 后32 Bits表示小數部分, 理論分辨率 2^?32s,由于HMI精度只能到秒,小數位對于本項目是沒有任何用處,不再分析小數部分,將接收報文記錄離開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開始計算,因此兩種時間戳需要通過減去一個系數才能轉換2208988800= (70 * 365 + 17) * 24 * 60 * 60。
服務器返回的時間戳(3869264872-2208988800=1660276072),可見設備發(fā)送日志與實際時間相差2s。
實際上NTP對時服務在計算精確時間是有一個推薦公式。
客戶端與服務端的時間系統(tǒng)的偏移定義為θ、網絡的往返延遲定義為δ,基于此,可以對t2進行精確的修正,已達到相關精度要求,它們的計算公式如下:
公式中:
t0是請求數據包傳輸的客戶端時間戳
t1是請求數據包回復的服務器時間戳
t2是響應數據包傳輸的服務器時間戳
t3是響應數據包回復的客戶端時間戳
實際寫入的時間為t2加上網絡延時δ的一半就可以了(t2+δ/2)。
經過上面原理的學習,對NTP有了一定的了解,現在根據HMI的要求將業(yè)務流程復制到腳本中實現。
新建變量,使用透傳的模式的設備驅動,主要是學習腳本,以前關于MQTT協議的文章有講過怎樣配置驅動,變量表如下圖,由于NTP協議使用16進制收發(fā)數據,也就需要對應調整收發(fā)數據模式:
使用按鍵關聯發(fā)送腳本如下:
COM1_WRITE_BUFF_CACHE="1B0004FA0001000000010000000000000000000000000000000000000000000000000000000000000000000000000000"
!SetDevice(system_time,6,"Write(COM1_WRITE_BUFF_CACHE, COM1_READ_BUFF_CACHE)")
t0=!TimeGetCurrentTime()
使用事件策略關聯接收狀態(tài)變量“COM1_READ_RUN_STATE”,在電平跳變時觸發(fā)“數據解析”與“時間配置”腳本:
“數據解析”,將NTP服務返回的數據保存到t1_str與t2_str,在轉換成時間戳存儲在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))
查看技術文章和免費咨詢技術問題可以訪問我司官網及各官方平臺:
微信號:cdebyte
今日頭條:億佰特
新浪微博:成都億佰特
成都億佰特--物聯網應用專家,隨時在身邊,時刻準備為您服務!
7 X 24 銷售服務熱線
4000-330-990深圳辦事處柯經理:18218726658 杭州辦事處戴經理:17512568697
常州辦事處崔經理:15906110783 南京辦事處葛經理:17626012283
業(yè)務郵箱:support@cdebyte.com
全國銷售投訴電話:19934352316
地址:四川省成都市高新西區(qū)西區(qū)大道199號B5棟(前臺座機:028-61543675)
?? 成都億佰特電子科技有限公司【版權所有】 蜀ICP備13019384號-3