【esp32】SNTP

参考资料

准备

APP:
https://github.com/EspressifApp/EspRelease/tree/master/EspTouch
开发板一块

源码地址

https://github.com/zhqi-ang/esp32

SNTP

国内网址

1.cn.pool.ntp.org
2.cn.pool.ntp.org
3.cn.pool.ntp.org
0.cn.pool.ntp.org

UDP通讯,所以要创建UDP Client Socket;
端口:123
需要先将域名转为IP地址,然后进行信息传输;

NTP工作原理

NTP的基本工作原理如图所示。Device A和Device B通过网络相连,它们都有自己独立的系统时钟,需要通过NTP实现各自系统时钟的自动同步。为便于理解,作如下假设:

在Device A和Device B的系统时钟同步之前,Device A的时钟设定为10:00:00am,Device B的时钟设定为11:00:00am。

Device B作为NTP时间服务器,即Device A将使自己的时钟与Device B的时钟同步。

NTP报文在Device A和Device B之间单向传输所需要的时间为1秒。

在这里插入图片描述

系统时钟同步的工作过程如下:

  1. Device A发送一个NTP报文给Device B,该报文带有它离开Device A时的时间戳,该时间戳为10:00:00am(T1)。

  2. 当此NTP报文到达Device B时,Device B加上自己的时间戳,该时间戳为11:00:01am(T2)。

  3. 当此NTP报文离开Device B时,Device B再加上自己的时间戳,该时间戳为11:00:02am(T3)。

  4. 当Device A接收到该响应报文时,Device A的本地时间为10:00:03am(T4)。

至此,Device A已经拥有足够的信息来计算两个重要的参数:

  • NTP报文的往返时延Delay=(T4-T1)-(T3-T2)=2秒。

  • Device A相对Device B的时间差offset=((T2-T1)+(T3-T4))/2=1小时。

这样,Device A就能够根据这些信息来设定自己的时钟,使之与Device B的时钟同步。

报文格式

在这里插入图片描述
为什么是48个字节?

从上图可知,第一行32个bit,然后是Root delay …Transmit timestamp;这些加起来一共就是48个byte了
最后一个Authenticator 是可选的!所以一般不选^^

主要字段的解释如下:

  • LI:当前时间闰秒标志。字段长度为2位bit,只在服务器端有效。取值定义为:

    LI=0:无警告;

    LI=1:最后一分钟是61秒;

    LI=2:最后一分钟是59秒;

    LI=3:警告(时钟没有同步)

    服务器在开始时,LI设置为3,一旦与主钟取得同步后就设置成其它值。

  • VN(Version Number):长度为3比特,表示NTP的版本号,可以是3或者是4

  • Mode:指示协议模式。字段长度为3位,取值定义为:

    Mode=0:保留

    Mode=1:对称主动;

    Mode=2:对称被动;

    Mode=3:客户;

    Mode=4:服务器;

    Mode=5:广播;

    Mode=6:保留为NTP控制信息;

    Mode=7:保留为用户定义;

    在单播和多播模式,客户在请求时把这个字段设置为3,服务器在响应时把这个字段设置为4。在广播模式下,服务器把这个字段设置为5。

  • Poll Interval:指示数据包的最大时间间隔,以秒为单位,作为2的指数方的指数部分,该字段只在服务器端有效。字段长度为8位整数,取值范围从4-17,即16秒到131,072秒。

  • Precision:指示系统时钟的精确性,以秒为单位,作为2的指数方的指数部分,该字段只在服务器端有效。字段长度为8位符号整数,取值范围从-6到-20。

  • Root Delay:指示与主时钟参考源的总共往返延迟,以秒为单位,该字段只在服务器端有效。字段长度为32位浮点数,小数部分在16位以后,取值范围从负几毫秒到正几百毫秒。

  • Root Dispersion:指示与主时钟参考源的误差,以秒为单位,该字段只在服务器端有效。字段长度为32位浮点数,小数部分在16位以后,取值范围从零毫秒到正几百毫秒。

  • Reference Identifier:指示时钟参考源的标记,该字段只在服务器端有效。对于一级服务器,字段长度为4字节ASCII字符串,左对齐不足添零。对于二级服务器,在IPV4环境下,取值为一级服务器的IP地址,在IPV6环境下,是一级服务器的NSAP地址。

  • Reference Timestamp:指示系统时钟最后一次校准的时间,该字段只在服务器端有效,以前面所述64位时间戳格式表示。

  • Originate Timestamp:指示客户向服务器发起请求的时间,以前面所述64位时间戳格式表示。

  • Receive Timestamp:指服务器收到客户请求的时间 ,以前面所述64位时间戳格式表示。

  • Transmit Timestamp:指示服务器向客户发时间戳的时间,以前面所述64位时间戳格式表示。

  • Authenticator(可选):当需要进行SNTP认证时,该字段包含密钥和信息加密码

发送请求

必须:LI、VN、Mode
可选:Originate Timestamp(由上面原理可知,如果需要更准确就需要加这个了;但一般不太需要~所以为0)
LI为00;VN为011,;Mode为011
b 00 011 011 = b 0001 1011 = 0x1B

接收请求

就是读取Transmit Timestamp
这个是时间戳,需要进行转换,
首先减去1970;

#define TIME1970 2208988800

然后GMT+8,加上8小时;
再转换下,就能到年月日了

部分代码

详细代码,请看上面给得链接

		memset(data, 0, 48);
		data[0] = 0x1b;
		
		ret = sendto(socket_fb, data, 48, 0, (struct sockaddr *)&serv_addr, SIZE_SOCKADDR_IN);

		do {
			vTaskDelay(10 / portTICK_PERIOD_MS);
			str_lent = recvfrom(socket_fb , data, 48, 0,  (struct sockaddr*)&serv_addr, &SIZE_SOCKADDR_IN);
        } while(str_lent != 48);

		if(str_lent == 48)
		{
			time_t t = 0;
			for(int i = 40; i <= 43; i++)
			{
				uint8_t c = (unsigned char)data[i];
				t = (t<<8) | c;
			}
			
			t -= TIME1970;	// 1970.1.1 0:0:0
			t += 8 * 60 * 60;	// UTC to Beijin
			struct tm now_time;
			localtime_r(&t, &now_time);
 			ESP_LOGE(TAG, "%d-%d-%d %d:%d:%d\n", now_time.tm_year + 1900, now_time.tm_mon + 1,
					now_time.tm_mday, now_time.tm_hour, now_time.tm_min, now_time.tm_sec);
			
		}

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SNTP协议客户端实现以及数据包格式: LI:跳跃指示器,警告在当月最后一天的最终时刻插入的迫近闺秒(闺秒)。 VN:版本号。 Mode:工作模式。该字段包括以下值:0-预留;1-对称行为;3-客户机;4-服务器;5-广播;6-NTP控制信息。NTP协议具有3种工作模式,分别为主/被动对称模式、客户/服务器模式、广播模式。在主/被动对称模式中,有一对一的连接,双方均可同步对方或被对方同步,先发出申请建立连接的一方工作在主动模式下,另一方工作在被动模式下; 客户/服务器模 式与主/被动模式基本相同,惟一区别在于客户方可被服务器同步,但服务器不能被客户同步;在广播模式中,有一对多的连接,服务器不论客户工作 在何种模式下,都会主动发出时间信息,客户根据此信息调整自己的时间。 Stratum:对本地时钟级别的整体识别。 Poll:有符号整数表示连续信息间的最大间隔。 Precision:有符号整数表示本地时钟精确度。 Root Delay:表示到达主参考源的一次往复的总延迟,它是有15~16位小数部分的符号定点小 数。 Root Dispersion:表示一次到达主参考源的标准误差,它是有15~16位小数部分的无符号 定点小数。 Reference Identifier:识别特殊参考源。 Originate Timestamp:这是向服务器请求分离客户机的时间,采用64位时标格式。 Receive Timestamp:这是向服务器请求到达客户机的时间,采用64位时标格式。 Transmit Timestamp:这是向客户机答复分离服务器的时间,采用64位时标格式。 Authenticator(Optional):当实现了NTP认证模式时,主要标识符和信息数字域就 包括已定义的信息认证代码(MAC)信息。
### 回答1: ESP8266是一种低成本、高性能的Wi-Fi芯片,广泛应用于物联网(IoT)领域。SNTP(Simple Network Time Protocol)是一种基于UDP协议的时间同步协议,在物联网设备中具有重要的应用价值。 ESP8266通过SNTP协议与互联网中的时间服务器通信,获得准确的时间戳。这些时间戳可用于日志记录、事件触发、时间截止等应用场景。 SNTP协议本身非常简单,可以使用ESP8266的标准集成到程序中。通过WiFi连接到局域网或互联网后,ESP8266可以与指定的时间服务器同步,获取与本地时间的时间差。为了准确,ES8266通常使用多个时间服务器进行同步,并进行平均计算。 值得注意的是,SNTP协议是基于UDP协议的,因此无法保证在传输过程中的可靠性。为了解决这个问题,ESP8266通常会定期进行时间同步,以保证时间准确性。当然,若是在时间同步失败的情况下采用短时间运行,错误也会相应地累积。因此,一些特殊的应用场景需要采用GPS等时间同步手段来确保时间的准确性。 总之,ESP8266通过SNTP协议可以快速、准确地获取互联网上的时间戳,因此在物联网设备的时间同步方面拥有巨大的应用潜力。 ### 回答2: ESP8266是一款低成本的Wi-Fi芯片,可以方便的接入互联网。SNTP(Simple Network Time Protocol)是一种简单的网络时间协议,用于同步网络设备的时间。 在ESP8266中,可以使用SNTP协议来同步设备的时间。通过连接SNTP服务器,ESP8266可以获取世界标准时间,并将其与本地时间进行比较和更新。这非常有用,因为设备的时间通常需要与其他设备同步,以便它们可以协调它们的操作。 ESP8266支持SNTP协议的如下: • sntp.h • sntp.c 这些可以在ESP8266的开发环境中进行安装和使用。使用这些,可以轻松地与SNTP服务进行通信,以便同步设备的时间。在使用这些时,用户需要提供SNTP服务器的IP地址和端口号。然后,ESP8266会连接到服务器并获取当前的时间。 SNTP协议的一个重要特点是具有低带宽和延迟。这使得设备可以在非常低的成本和能耗下同步时间。由于ESP8266的能源需求非常低,因此使用SNTP协议进行时间同步是非常有效的方法。这使得ESP8266成为物联网设备设计的首选芯片之一。 ### 回答3: ESP8266是一款高性能、低功耗、易于开发的Wi-Fi芯片,可以通过SNTP协议进行时间同步。SNTP(Simple Network Time Protocol)是NTP协议的简化版本,用于进行网络时间同步。 在ESP8266上使用SNTP进行时间同步,需要先通过WiFi连接到网络。然后,使用SNTP协议向NTP服务器请求时间信息,并将服务器返回的时间设定为ESP8266的系统时间。这个过程可以使用ESP8266自带的API实现,也可以使用第三方完成。 使用SNTP同步时间有很多好处,其中最主要的就是可以保证设备时间的准确性。在一些需要高精度时间的应用场景,比如金融、物流等领域,时间同步显得尤为关键。 总之,ESP8266虽然是一款小巧的芯片,但它拥有丰富的功能和强大的性能,可以为各种物联网应用提供稳定可靠的支持。SNTP协议则是保证ESP8266时间准确性的重要手段之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值