WiFi开发|ESP8266模组SDK开发之SNTP协议

ESP8266模组SDK开发之SNTP协议

1. NTP和SNTP

NTP 是网络时间协议(Network Time Protocol),是用来同步网络设备(如计算机、手机)的时间的协议

SNTP由NTP改编而来(简单网络时间协议,Simple Network Time Protocol)大大简化了NTP协议,同时也能保证时间达到一定的精确度。在实际应用中,SNTP协议主要被用来同步因特网上计算机的时间

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

一些NTP服务器:
最常见的NTP服务器:www.pool.ntp.org/zone/cn
其国内地址为:cn.pool.ntp.org
Windows系统上自带的两个:time.windows.com 和 time.nist.gov
Mac OS上自带的两个:time.apple.com 和 time.asia.apple.com

在这里插入图片描述

2. SNTP接口说明
  • 设置SNTP服务器:通过IP地址设置SNTP服务器,最多支持设置3个
函数原型:void sntp_setserver(unsigned char idx, ip_addr_t *addr)
参    数:idx 服务器编号,最多⽀持3个(0~2);0号为主服务器,12号为备用服务器
		  addr 服务器IP地址;需自行确保传入的是合法SNTP服务器地址
返 回 值:无
  • 设置SNTP服务器:通过域名设置SNTP服务器,最多支持设置3个
函数原型:void sntp_setservername(unsigned char idx, char *server)
参    数:idx 服务器编号,最多⽀持3个(0~2);0号为主服务器,12号为备用服务器
		  server 服务器域名;需自行确保传入的是合法SNTP服务器域名
返 回 值:无
  • 初始化和关闭SNTP
void sntp_init(void)
void sntp_stop(void)
  • 查询当前距离基准时间(1970.01.01 00:00:00 GMT+8)的时间戳,单位为秒
函数原型:uint32 sntp_get_current_timestamp()
参    数:无
返 回 值:距离基准时间的时间戳
  • 查询实际时间(GMT+8)
函数原型:char* sntp_get_real_time(long t)
参    数:t 与基准时间相距的时间戳
返 回 值:实际时间
3. SNTP功能实现

SNTP功能开发:在freeRTOS下新建SNTP任务,实现定时5秒串口打印一次网络时间

任务流程如下示:
在这里插入图片描述

实验步骤如下:

–> 在ESP8266_RTOS_SDK目录下新建sntp文件夹,把station实验中的station目录下所有文件拷贝到该文件夹中

–> 在user目录下新建use_sntp.c文件,并添加如下代码

/*******************httpclient.c***********************************************/
har* SntpServerNames[3] ={
"ntp1.aliyun.com",
"ntp2.aliyun.com",
"ntp3.aliyun.com"
};
//ATaskSntp任务
void ATaskSntp( void *pvParameters ){
    STATION_STATUS Status;
    uint32 time;
    do{
        Status = wifi_station_get_connect_status();
        vTaskDelay(100);   
    }while(Status != STATION_GOT_IP);
    printf("task is SNTP\n");
    printf("STATION_GOT_IP!\n");
    sntp_setservername(0,SntpServerNames[0]);
    sntp_setservername(1,SntpServerNames[1]);
    sntp_setservername(2,SntpServerNames[2]);
    sntp_init();
    for(;;){
        time = sntp_get_current_timestamp();
        if(time){
            printf("current date:%s\n",sntp_get_real_time(time));
        }
        vTaskDelay(500);
    }
    vTaskDelete(NULL);
}
//Sntp_init 初始化
void Sntp_init(void){
    xTaskCreate(ATaskSntp, "Sntp", 512, NULL, 4, NULL);
}

–> 在include目录下新建user_sntp.h文件,并添加声明

void ATaskSntp(void *pvParameters);
void Sntp_init(void);

–> 在user_main.c文件中的user_init()函数下添加如下代码

#define SSID "Hotspot"	//ESP8266要加入的无线网
#define PASSWORD "88888888"
void ICACHE_FLASH_ATTR
user_init(void){
    printf("SDK version:%s\n", system_get_sdk_version());
    Led_init();
    wifi_set_opmode(STATION_MODE);
    struct station_config *config = (struct station_config *)\
        zalloc(sizeof(struct station_config));
    sprintf(config->ssid,SSID);
    sprintf(config->password,PASSWORD);
    wifi_station_set_config(config);
    free(config);
    wifi_station_set_auto_connect(TRUE);    
    Sntp_init();
    xTaskCreate(ATaskLed, "LED", 256, NULL, 2, NULL);
}

–> 在ESP8266编译器中编译完成,烧写bin文件到ESP8266,打开串口助手,每5秒输出一次实时时间

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安迪西嵌入式

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值