NTP
AC联网模块提供了从云端服务器通过NTP标准协议获取UTC时间的功能。需要获取NTP时间时,需要调用APIAC_GetNtpTime
通知AC联网模块进行NTP时间的获取,获取到时间候,AC联网模块会通过Src/ac_user_eventCallback.c
中的NTP回调函数UserCallback_HandleNTP
将NTP得到的数据交给UserApp,开发者可以在此添加自己的处理逻辑。开发示例如下:
void UserCallback_HandleNTP(ZC_NTP_TIME* ntp)
{
int ret = 0;
time_t tmNtp = 0;
char DateCmd[64] = {0};
printf("ntp time is %d-%d-%d %d:%d:%d weekday is %d\n",ZC_HTONS(ntp->year),
ntp->month,
ntp->day,
ntp->hour,
ntp->min,
ntp->sec,
ntp->weekday);
/*将NTP获取到的UTC时间配置到系统时钟,再通过 hwclock -w 写入硬件时钟*/
tmNtp = ZC_HTONL(ntp->ntp_sec);
struct timeval tv;
tv.tv_sec = tmNtp;
tv.tv_usec = 0;
ret = settimeofday(&tv, NULL);
if (0 != ret)
{
printf("settimeofday failed\n");
}
memset(DateCmd, 0, sizeof(DateCmd));
sprintf(DateCmd, "hwclock -w");
if (-1 == system(DateCmd))
{
printf("system cmd hwclock failed\n");
return;
}
}
ZC_NTP_TIME的定义如下:
typedef struct
{
u16 year;
u8 month;
u8 day;
u8 weekday;
u8 hour;
u8 min;
u8 sec;
u32 ntp_sec;
}ZC_NTP_TIME;
字段 | 类型 | 说明 |
---|---|---|
year | u16 | 年(UTC时间) |
month | u8 | 月(UTC时间) |
day | u8 | 日(UTC时间) |
weekday | u8 | 星期(UTC时间) |
hour | u8 | 时(UTC时间) |
min | u8 | 分(UTC时间) |
sec | u8 | 秒(UTC时间) |
ntp_sec | u32 | 当前时间距1970年1月1日00:00:00的描述(UTC时间) |