第1步:所需組件
以下是該項目所需組件的列表,價格絕對最低!如果您發現某個地方便宜一些,請給我留言!
ESP8266-01?(http://goo.gl/o4fAfJ)
GPS模塊?(http://goo.gl/M8Y6pR)
USB至TTL接口?(http://goo.gl/da82Uc)
步驟2:沒有Internet連接的無線NTP服務器
沒有Internet連接的無線NTP服務器
如果需要非互聯網可靠的時間源,有多種選擇:無線電時間信號,原子鐘,gps等。
時間信號接收器是一種低成本的選擇,但其有效性取決于距離發射站有多近。另外,根據國家或地區的不同,頻率也不盡相同,因此并不是每個站點的通用替代方案。如果需要非常高的精度,則
原子鐘是最佳選擇。不久前,原子鐘很大,不是很輕便,也很耗電。但是,隨著小型化的發展,現在有可能獲得一個芯片大小的原子鐘,而該原子鐘不需要花費幾毫瓦就能工作。如果成本不是決定因素(價格在千美元左右),則可以選擇!
全球定位系統其他國家/地區的GPS或等效系統(GLONASS,GALILEO,BEIDOU)是一種中間選擇,它比廣播時間信號帶來更大的靈活性(嗯,有些晴朗的天空是必需的),并且價格比原子鐘便宜得多。
如果需要非常高的耐用性(例如制造一個自制的核反應堆),或者如果要連接大量執行數百萬秒鐘請求的設備,則首選已經提出的解決方案。但是,如果出于實驗目的想要一種更簡單的方法,并且可以容忍一秒鐘的偏移量,則可以使用anesp8266-01和一個GPS模塊構建一個約10美元的支出,也可以使用具有串行NMEA輸出的手持GPS。
第3步:日期和時間協議:白天,時間和NTP
日期和時間協議:白天,時間和NTP
自從第一臺實用計算機開始工作以來,使它們保持時間同步的想法就在不斷發展。為此有很多協議,其中一些是:白天,時間和NTP。
白天協議:
此協議在RFC867中進行了描述。它是最古老的,現在幾乎沒有使用過。某些時間服務器仍然出于教育目的提供它,并作為仍然使用它的非常老舊的硬件/軟件應用程序的替代。該協議在端口13上工作,并且以明文形式發送時間/日期信息。對于所使用的格式沒有特別的建議,唯一的好處是該信息可以被人類讀取。
時間協議:
此協議在RFC868中進行了描述,并在端口37上運行。時間/日期信息編碼為從00:00開始經過的秒數: 1970年1月1日的00(午夜)以32位數字表示。
NTP協議:
NTP被認為可以帶來時間/日期信息,在RFC5905中進行了描述,其精度約為毫秒。基于改進的Marzullo算法來計算信息包的可變延遲。該協議使用非常廣泛,信息包會通過UDP連接在端口123上傳輸以最大程度地減少處理時間。
步驟4:ESP8266 + GPS
ESP8266 + GPS
該項目是對Ray Burnette的Tardis Time的改進,它的硬件元素基本相同,但是不發送時間/日期信息使用標準協議,因此必須在每個要同步的不同設備中開發一個小型偵聽器應用程序。該項目利用了個人計算機中的內置defacto時間同步應用程序raspberry pi,ESP8266的NTP客戶端庫可以使用該項目。
使用的GPS模塊是EM-506,沒有PPS信號。同樣,具有RS232 NMEA輸出的手持GPS接收器也可以用于相同的目的。 ESP8266使用SDK版本1.5.2進行編程。別忘了編程需要某種USB到TTL 3V接口!該軟件可以描述為3個主要部分:
串行數據接收
ESP8266的UART具有最大容量為256個字符和多個源的硬件FIFO。的中斷。程序中使用了字符接收閾值和超時中斷。
字符閾值中斷用于在某些字符到達UART的FIFO時自動觸發功能。在這種特殊情況下,由于GPS需要NMEA字符串,并且它們的長度約為30-80個字符,因此使用了它們之間的閾值。此函數從FIFO讀取字符并將其寫入循環緩沖區。
當僅接收到幾個字符(小于閾值)并且在確定的時間間隔內未檢測到更多字符時,將使用超時中斷。在這種特殊情況下,編程的超時時間為10個字節。
此函數需要快速執行以盡快從中斷中返回,因此此處無需進行任何處理,只需進行讀取和復制即可。
字符串解析,實際時間/日期和微秒率校正
串行ISR將接收到的字符寫入循環緩沖區,最大大小應為循環緩沖區長度的兩倍。要解析的最長NMEA字符串。在這種情況下,以$ GPRMC標頭開頭的字符串。此特定字符串包含時間/日期信息。一旦使用SDK system_os_post提供的消息傳遞系統將所有接收到的字符寫入循環緩沖區,ISR就會調用處理字符串的函數。
NMEA字符串的長度是可變的,因此應避免使用絕對字符位置來解析值。對于特定類型的字符串,定界符的數量在這種情況下以逗號“,”為常數,并用于提取時間和日期值。字符串示例如下:
$ GPRMC,201705.000,A,0000.0000,N,00000.0000,W,1.10,265.50,120816 ,,, A * 79
在逗號之間” ,”定界符#1 y#2位于字符串201705.000,表示20小時17分鐘05,000秒。在逗號“,”定界符#9 y#10之間放置字符串120816,表示日期12,月份08(八月)和年份16(2016)。此外,還存儲了系統的微秒級環形計數器(不是來自GPS),以進行調整并提供更準確的時間戳。
傳遞數據,套接字
創建了三個獨立的套接字來偵聽任何類型的服務:白天,時間或NTP。對于白天,當接收到查詢時,將從保存日期和時間信息的全局變量中讀取數據,并將其轉換為人類可讀的文本字符串。對于時間服務情況,日期和時間信息應該以適當的方式編碼,幫助功能SecondsSince1900可以完成任務。
對于NTP,應暫時存儲收到的數據包,一些信息需要修改/更新并作為答案發送回去。由于項目中使用的GPS僅每秒帶來一次時間/日期信息,并且在該間隔的中間可能會發生NTP查詢,為緩解此問題,請使用system_get_time( ),每次接收到新的GPS幀。接收到NTP查詢后,將再次讀取該計數器,并使用這兩個值可以估算出上一次GPS更新和NTP查詢接收之間的時間。將此時間添加到全局變量中存儲的時間(每秒更新一次)中,并發送應答NTP數據包。
步驟5:測試和結論
測試和結論
-使用標準應用(在這種特定的情況下為Linux應用)來測試在ESP8266中編程的時間服務,例如netca, rdate,ntpdate。
-由于其體積小,功耗低和無線連接性,可以將其安裝在天空更清晰的地方:窗戶,屋頂等附近。
-使用帶有PPS的GPS,可以實現更高的精度。
-可以通過太陽能供電(夜間使用電池),以獲得完全無線的連續操作系統。
-根據GPS的類型,必須使用某些轉換的信號電平,例如5V TTL到3V TTL或RS232到3V TTL。
責任編輯:wv
-
服務器
+關注
關注
12文章
9237瀏覽量
85667 -
NTP
+關注
關注
1文章
172瀏覽量
13915 -
ESP8266
+關注
關注
50文章
962瀏覽量
45141
發布評論請先 登錄
相關推薦
評論