ESP8266无线NTP Stratum1服务器的制作

电子说

1.2w人已加入

描述

第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

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分