ESP8266模塊獲取網絡時間

  最近的項目中使用了ESP8266這個模塊,想嘗試通過這個模塊獲取網絡時間,但是發現手冊中獲取網絡時間的指令總是返回ERROR,估計是固件版本不支持此功能,於是查了一下資料,在這裏做一下總結。

  大致方法就是連接校時服務器,獲取服務器的時間,通過計算得到當前時間。至於校時服務器的選擇沒有多大差別,這裏以計算機默認的校時服務器爲例。
模塊配置流程如下:

/* 發送AT確定模塊連接成功 */
AT
>OK

/* 將模塊配置爲station模式 */
AT+CWMODE=1
>OK

/* 連接AP */
AT+CWJAP_DEF="SSID","PADDWORD"
>WIFI CONNECTED
>WIFI GOT IP
>OK

/* 與校時服務器建立UDP連接 */
AT+CIPSTART="UDP","time.windows.com",123
>0,CONNECT
>OK

/* 設爲透傳模式 */
AT+CIPMODE=1
>OK

/* 進入透傳模式 */
AT+CIPSEND
>OK
>>

配置完畢後,定時發送16進制查詢指令即可,長度48字節:
0b 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 00 d6 6d D9 00 00 00 00 00
模塊同樣返回48字節數據,返回的時間爲Unix時間戳,位於40Byte-43Byte:
1C 03 00 E9 00 00 02 57 00 00 0A D9 19 42 E6 01 E1 CF E7 94 CD AE D2 10 D6 6D D9 00 00 00 00 00 E1 CF E7 9D 49 96 1B 5F E1 CF E7 9D 49 96 4A 59

  計算方法

  unix時間戳是從1970年1月1日(UTC/GMT的午夜)開始所經過的秒數,不考慮閏秒。從數據看這是一個32位計數器,同時又是一個有符號數據,基準之前爲負,反之爲正。因此存在溢出的情況,這個時間點爲 2038年01月19日03時14分07秒。使用IOS的用戶切記不要把手機時間改爲1970年1月1日,手機重啓後就會卡在bootloader界面,也就是“蘋果1970年事件”,當然好奇心膨脹的人也可以試一下,默默佩服你的勇氣。。。
  上面例子返回的數據時間戳爲 [E1h CFh E7h 9Dh],轉成10進製爲 ‭3788498845‬,將這個數減掉2208988800等於‭1579510045‬就是當前的Unix時間戳。至於爲什麼減去2208988800,因爲這裏獲取到的時間是1900至今的秒數,與1970相差70年,即2208988800。
  這裏有個網站可以對比計算出的時間戳對不對:Unix時間戳
  至於將時間戳轉成具體年月日時分秒的計算方法如下:
在這裏插入圖片描述
也可以參考這篇博文:

  Unix時間戳和北京時間的相互轉換(C語言實現 )

  後續有時間我再把完整計算公式貼出來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章