1. 首页
  2. 编程语言
  3. C
  4. C语言实现NTP时间同步功能代码分享

C语言实现NTP时间同步功能代码分享

上传者: 2023-03-10 11:55:31上传 C文件 4.67KB 热度 13次

`

#include 
#include 
#include 
#include 
#include 

#include "lwip/opt.h"
#include "lwip/netif.h"
#include "lwip/apps/sntp.h"
#include "rtthread.h"

#define SNTP_TICK_RATE   (RT_TICK_PER_SECOND / 5)

/* Set time zone in seconds, east of UTC */
#define TIME_ZONE_SEC (8 * 3600)

static void sntp_task(void *param)
{
    /* Set up SNTP */
    sntp_init();

    /* Set server pool */
    sntp_setserver(0, "cn.pool.ntp.org");
    sntp_setoperatingmode(SNTP_OPMODE_POLL);
    sntp_setservername(0, "cn.pool.ntp.org");

    /* If less than threshold, sync with NTP immediately */
    sntp_set_syncmode(SNTP_SYNC_MODE_IMMED);

    for (;;)
    {
        /* Trigger server request update */
        sntp_request();
        rt_thread_mdelay(5000);
    }
}

void user_ntptime(time_t *timep)
{
    *timep += TIME_ZONE_SEC;
}

void user_ntp_sntp_process(const struct timeval *tv)
{
    struct tm tm_new;

    time_t ntp_time = tv->tv_sec;
    user_ntptime(&ntp_time);

    if (ntp_time >= (86400 * (365 * 70 + 17)))
    {
        localtime_r(&ntp_time, &tm_new);

        printf("ntp_time %lu = %d.%d.%d %d:%d:%d\r\n",
               ntp_time, tm_new.tm_year + 1900, tm_new.tm_mon + 1, tm_new.tm_mday,
               tm_new.tm_hour, tm_new.tm_min, tm_new.tm_sec);

        /* Set system time */
        struct timeval nw_tv;
        nw_tv.tv_sec = ntp_time;
        nw_tv.tv_usec = tv->tv_usec;
        settimeofday(&nw_tv, NULL);
    }
}

/* Entry */
int sntp_user_init(void)
{
    rt_thread_t t;

    t = rt_thread_create("sntp_task", sntp_task, RT_NULL, 512, 25, 5);
    if (t)
        rt_thread_startup(t);

    return 0;
}
下载地址
用户评论