C语言实现NTP时间同步功能代码分享
`
#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;
}
下载地址
用户评论