ESP8266_17简单网络时间协议-SNTP

本文介绍ESP8266模块如何利用SNTP协议实现网络时间同步,包括连接SNTP服务器、初始化、获取时间戳及转换为真实时间的全过程。

ESP8266_01搭建开发环境

ESP8266_02程序的编译与下载

ESP8266_03SDK与Makefile的基本用法

ESP8266_04管脚控制与软件定时器

ESP8266_05 ESP8266有几个串口?

ESP8266_06硬件定时器与IO中断

ESP8266_07基于PWM的呼吸灯

ESP8266_08基于flash的数据掉电保护

ESP8266_09基于IIC控制的OLED屏幕

ESP8266_10 ESP8266的STATION模式

ESP8266_11 ESP8266的UDP广播

ESP8266_12 ESP8266客户端模式下的TCP通信

ESP8266_13服务器端模式下的TCP通信

ESP8266_14 SOFTAP模式下的服务器端和客户端

ESP8266_15天气预报之TCP的GET操作

ESP8266_16天气预报之JSON数据的生成与解析

ESP8266_17简单网络时间协议-SNTP

ESP8266_18 MQTT协议接入ONENET平台

ESP8266_19MQTT协议接入ONENET平台_订阅主题

ESP8266_20 基于ONENET平台的数据上传之TCP的POST操作

ESP8266_21基于ESP8266的一键配网

ESP8266_22基于自身ADC的电压采样

ESP8266_23基于硬件定时器的红外遥控器解码

连续说了好几节的TCP通信,我自己已经烦的不行了。一样东西说多了,其实是很容易烦躁的。但有的时候不学是不行的,所以这一节穿插点别的东西。

SNTP,根据百度百科的定义:简单网络时间协议(Simple Network Time Protocol),由 NTP 改编而来,主要用来同步因特网中的计算机时钟。

SNTP协议采用客户端/服务器的工作方式,可以采用单播(点对点)或者广播(一点对多点)模式操作。SNTP服务器通过接收GPS信号或自带的原子钟作为系统的时间基准。单播模式下,SNTP客户端能够通过定期访问SNTP服务器获得准确的时间信息,用于调整客户端自身所在系统的时间,达到同步时间的目的。广播模式下,SNTP服务器周期性地发送消息给指定的IP广播地址或者IP多播地址。SNTP客户端通过监听这些地址来获得时间信息。

说白点,但凡联网的设备,都可以通过这个协议来获取时间。使用方法也很简单,连接SNTP的服务器,然后读取时间就行了。

这么简单?

是的,就这么简单。使用步骤共分为5步:

1、添加相关文件

#include "sntp.h"
#include "wifi.h"

还有wifi.c

2、联网

前面的代码中,联网一般是先设置8266的工作模式,然后扫描当前环境下的AP,再然后连接咱们家里的wifi。这一节使用了另一个函数:

WIFI_Connect("mcu", "88888888", wifiConnectCb);

从内容可以看出来,wifi的账号、密码做为参数传入,同时注册了一个回调函数。WIFI_Connect函数根据传入的参数进行wifi连接,每隔1秒检测一下连接状态。

而注册的回调函数,则在wifi连接成功后连接SNTP服务器。这里可以看一下函数wifiConnectCb的代码:

void wifiConnectCb(uint8_t status)
{
    if(status == STATION_GOT_IP){
        sntp_setservername(0, "pool.ntp.org");    // set sntp server after got ip address
        sntp_init();
        os_timer_disarm(&sntp_timer);
        os_timer_setfn(&sntp_timer, (os_timer_func_t *)sntpfn, NULL);
        os_timer_arm(&sntp_timer, 10000, 1);//10s
    } else {
     os_printf("we are connecting!please waite!\r\n");
    }
}

这里说一下,无论是函数WIFI_Connect,还是函数wifiConnectCb,手册里都没有找到说明(2c-esp8266_sdk_api_guide_cn_v1.5.4)。那么它们是哪里来的?

是的,官方的SDK,最后我会说明。

 

3、连接SNTP服务器,并初始化

很简单,直接上代码:

//通过域名设置SNTP服务器,一次最多支持设置3个。   
sntp_setservername(0, "pool.ntp.org");   
//SNTP初始化
sntp_init();

 

为什么可以设置多个服务器?万一其中一个挂了,其它的还能维持正常工作。此处参照手册2c-esp8266_sdk_api_guide_cn_v1.5.4,第132页。

 

4、获取时间戳

什么是时间戳?

时间戳是指格林威治时间自1970年1月1日(00:00:00 GMT)至当前时间的总秒数。它也被称为Unix时间戳(Unix Timestamp)。通俗的讲,时间戳是一份能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据。

很简单,两行代码搞定:

u32_t ts = 0;
ts = sntp_get_current_timestamp();

 

5、转换为真实时间

时间戳只是一堆秒数,我们要把它换算成日常用的时间,一行代码搞定:

os_printf("current time : %s\n", sntp_get_real_time(ts));

主要是函数sntp_get_real_time实现的功能,返回的数据是一串字符,最终通过os_printf打印出来。

 

程序修改完成,保存、清理、编译、下载一条龙,然后重新上电。这里借助串口助手来查看效果。效果如下所示:

从截图上可以看到,通过程序解析,已经成功获取到了当前的时间,每隔10秒打印输出一下。经过对比,和我当前电脑上的时间是一致的。

最后说一下,这一节的代码其实是从官网SDK中的一个例程里摘出来的。而下一节的内容,也和这个例程有关。感兴趣的童鞋,可以先去ONENET注册一个账号,了解一下物联网平台的基本设置有哪些。下一节会说一下如何把ESP8266接入到物联网平台。

链接:https://pan.baidu.com/s/18ykdgsI7ruHjWCMRPKL91A

提取码:ma7g

### 回答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时间准确性的重要手段之一。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值