如何基于NTP協(xié)議獲取阿里云實時時間
NTP協(xié)議簡介
NTP服務器(NetworkTimeProtocol(NTP))是用來使計算機時間同步化的一種協(xié)議,它可以使計算機對其服務器或時鐘源(如石英鐘,GPS等等)做同步化,它可以提供高精準度的時間校正(LAN上與標準間差小于1毫秒,WAN上幾十毫秒),且可介由加密確認的方式來防止惡毒的協(xié)議攻擊。時間按NTP服務器的等級傳播。按照離外部UTC源的遠近把所有服務器歸入不同的Stratum(層)中。
NTP報文格式
從上圖可知:每一個字段代表不一樣的設置功能,如一下表所示:
首先我們做一個簡單的實驗,如下圖所示:
阿里云NTP服務器是ntp1.aliyun.com(IP為120.25.115.20)端口為123,因為ntp服務器是udp協(xié)議,ip:120.25.115.20端口號:123,格式是接收48個字節(jié),第一個字節(jié)以0xa3(版本4)、0x1b(版本3)、0x13(版本2)、0x0b(版本1),返回的數(shù)據(jù)中帶有時間。上圖所示我們使用版本3獲取阿里云NTP信息,阿里云服務器返回的數(shù)據(jù)我們?nèi)〉?0位到43位的十六進制,所以得到0xE2CFA73B十六進制,我們把該十六進制轉成十進制變成3805259579秒再減去1900-1970的時間差(2208988800秒)我們打開
https://tool.lu/timestamp/如下圖所示:
從上面我們可以知道獲取NTP實時時間需要以下步驟:
①連接阿里云NTP服務器。
②使用開發(fā)板發(fā)送NTP報文到阿里云NTP服務器中。
③獲取阿里云NTP服務器的數(shù)據(jù),取第40位到43位的十六進制。
④把40位到43位的十六進制轉成十進制。
⑤把十進制數(shù)減去1900-1970的時間差(2208988800秒)所得數(shù)值轉成年月日時分秒。
根據(jù)上述的步驟,我們可以使用MCU+ESP8266獲取實時時間,如下圖所示:
①連接阿里云NTP服務器,請配置esp8266為UDP協(xié)議(注意開透傳模式)
②發(fā)送NTP報文到阿里云NTP服務器中,如下源碼所示:
初始化NTP協(xié)議包,如一些源碼所示:
我們主要定義了兩個參數(shù)version和mode,定義版本號為3,模式為3(mode表示客戶端),0011<<3(version)+0011(mode)= 0x1b,其他位為0,符合前面的網(wǎng)絡調式助手發(fā)送的NTP數(shù)據(jù)包,然后我們開啟定時器1s發(fā)送esp_ntp_buf緩存區(qū)數(shù)據(jù)。
獲取阿里云NTP服務器的數(shù)據(jù),取第40位到43位的十六進制,如一下源碼所示:
上述源碼可以獲取服務器返回的數(shù)據(jù)取40位到43位并轉成十進制
把十進制數(shù)減去1900-1970的時間差(2208988800秒)所得數(shù)值轉成年月日時分秒即可。