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语言实现 )

  后续有时间我再把完整计算公式贴出来。

发布了7 篇原创文章 · 获赞 8 · 访问量 5381

猜你喜欢

转载自blog.csdn.net/WANGWANG_A/article/details/104053514