在轻量设备里面,我们常常需要获取本地时间,用于时间显示,log记录,帮助RTC芯片纠正时间等等。我们在之前设计了一个智慧时钟,需要使用到本地当前时间,因此本篇文章想在OpenHarmony上实现SNTP获取本地时间,并将此功能集成为一个模块,便于我们的主程序调用。
环境
OpenHarmony3.1 润和hispark_pegasus Hi3861开发板 DevEco Device Tool 串口调试助手
SNTP介绍
SNTP(Simple Network Time Protocal简单网络时间协议),用于跨广域网或局域网同步时间的协议,主要用来同步因特网中的计算机时钟,具有较高的精确度(几十毫秒)。
SNTP协议相对于NTP,优化了网络传播延时的影响,同时也能保证时间达到一定的精确度。
SNTP协议采用客户端/服务器的工作方式,可以采用单播(点对点)或者广播(一点对多点)模式操作。SNTP服务器通过接收 GPS信号或自带的原子钟作为系统的时间基准。单播模式下,SNTP客户端能够通过定期访问 SNTP服务器获得准确的时间信息,用于调整客户端自身所在系统的时间,达到同步时间的目的。
时间戳
SNTP发送回来的时间戳是NTP时间戳。 NTP时间戳和UTC时间戳的主要区别在于它们的起始时间: NTP时间戳的起始点是1900年1月1日00:00:00。 UTC时间戳(Unix时间戳)的起始点是1970年1月1日00:00:00。
软件设计流程
流程图

文件树状图
.
├── include  //sntp库
│   └── lwip
│       └── apps
│           ├── sntp.h
│           └── sntp_opts.h
├── src     //sntp源文件
│   ├── BUILD.gn
│   ├── sntp.c
│   ├── sntp_debug.c
│   ├── sntp_port.c
│   └── sntp_port.h
└── test    //模块主代码
    ├── BUILD.gn
    ├── sntp_test.c //模块源代码
    ├── sntp_test.h //模块接口、wifi配置
    ├── wifi_connecter.c    //wifi连接库
    └── wifi_connecter.h
使用方法
- 下载源码
- 将SNTP文件夹放入applications/sample/wifi-iot/app路径下
- 在applications/sample/wifi-iot/app/BUILD.gn的features内添加以下代码
"sntp/src:sntp",
"sntp/test:sntp_test",
- 在自己的主程序中引用sntp_test.h文件,调用set_sntp_init()函数初始化,随后即可通过访问sntp_time_sec变量获取当前时间(NTP时间戳0时区)
流程介绍
连接WIFI
连接的WIFI需要可以访问互联网,否则设备无法联网获取时间
WIFI当前设置为:(配置在/sntp/test/sntp_test.h)
- SSID:M20P
- PSK:12345678
设置SNTP服务器
常用SNTP服务器有以下四个:
"cn.ntp.org.cn", // 中国 NTP 快速授时服务
"ntp.ntsc.ac.cn", // 国家授时中心 NTP 服务器
"time.pool.aliyun.com", // 阿里云公共 NTP 服务器
"cn.pool.ntp.org", // 国际 NTP 快速授时服务
在本文章中,SNTP_SERVER_DNS默认为0,因此我们使用IP进行配置SNTP服务器
#if SNTP_SERVER_DNS
static const char* g_ntpServerList[] = {
    // refers from https://dns.icoa.cn/ntp/#china
    "cn.ntp.org.cn", // 中国 NTP 快速授时服务
    "ntp.ntsc.ac.cn", // 国家授时中心 NTP 服务器
    "time.pool.aliyun.com", // 阿里云公共 NTP 服务器
    "cn.pool.ntp.org", // 国际 NTP 快速授时服务
};
#define SNTP_SERVERS ARRAY_SIZE(g_ntpServerList)
void SntpSetServernames(void)
{
    for (size_t i = 0; i < SNTP_SERVERS; i++) {
        sntp_setservername(i, g_ntpServerList[i]);
    }
}
#else
ip4_addr_t g_ntpServerList[SNTP_MAX_SERVERS];
void SntpSetServers(void)
{
    IP4_ADDR(&g_ntpServerList[0], 114, 67, 237, 130); // cn.ntp.org.cn
    IP4_ADDR(&g_ntpServerList[1], 114, 118, 7, 163);  // ntp.ntsc.ac.cn
    IP4_ADDR(&g_ntpServerList[2], 182, 92, 12, 11); // time.pool.aliyun.com
    IP4_ADDR(&g_ntpServerList[3], 193, 182, 111, 12); // cn.pool.ntp.org
#define SNTP_SERVERS 4
    for (size_t i = 0; i < SNTP_SERVERS; i++) {
        sntp_setserver(i, (ip_addr_t*)&g_ntpServerList[i]);
    }
}
#endif
void set_sntp_init(void)
{
/****************************/
#if SNTP_SERVER_DNS
    ip4_addr_t dnsServerAddr;
    IP4_ADDR(&dnsServerAddr, 192, 168, 1, 1);
    dns_setserver(0, (struct ip_addr *)&dnsServerAddr);
    dns_init();
    SntpSetServernames();
#else
    SntpSetServers();
#endif
/****************************/
}
SNTP初始化以及获取时间
sntp_setoperatingmode(SNTP_OPMODE_POLL);
    sntp_init();
    printf("sntp_enabled: %drn", sntp_enabled());
    for (size_t i = 0; i < SNTP_SERVERS; i++) {
        printf("sntp_getreachability(%d): %drn", i, sntp_getreachability(i));
    }
    osDelay(500);
    for (size_t i = 0; i < SNTP_SERVERS; i++) {
        printf("sntp_getreachability(%d): %drn", i, sntp_getreachability(i));
    }
时间显示
本样例源码仅作为一个底层模块,因此尚未有主程序。可以自行创建一个主程序进行测试获取时间,或者按照以下方式修改源码: 在sntp/test/sntp_test.c的SntpSetServers函数末尾添加以下代码(显示获取到的时间):
time_t ut;
ut = (unsigned int)((unsigned int)sntp_time_sec + ((unsigned int)2085978496L)); //转换成UTC时间(0时区)
struct tm *now_time = gmtime(&ut);
printf("%d %d %dn", now_time- >tm_hour, now_time- >tm_min, now_time- >tm_sec);
在sntp/test/sntp_test.c末尾添加以下代码(开机自启动):
SYS_RUN(set_sntp_init);
本文主要是对鸿蒙开发威廉希尔官方网站 OpenHarmony中的轻量系统-获取当地时间; 更多的鸿蒙实战开发可以去主页阅读,或找我保存一下鸿蒙开发威廉希尔官方网站 文档 :


鸿蒙开发威廉希尔官方网站 分布路线图如下,高清完整版找我保存 。

最后结果

审核编辑 黄宇
- 
                                芯片
                                +关注关注 455文章 50732浏览量 423268
- 
                                RTC
                                +关注关注 2文章 538浏览量 66474
- 
                                sntp
                                +关注关注 0文章 5浏览量 3703
- 
                                鸿蒙
                                +关注关注 57文章 2345浏览量 42822
- 
                                OpenHarmony
                                +关注关注 25文章 3716浏览量 16273
发布评论请先 登录
相关推荐
戈帅《OpenHarmony轻量系统从入门到精通50例》开发板与传感器配置说明
OpenHarmony属性信息怎么修改?触觉智能RK3566鸿蒙开发板来演示
 
    
如何在开源鸿蒙OpenHarmony开启SELinux模式?RK3566鸿蒙开发板演示
 
    
【开源鸿蒙】使用QEMU运行OpenHarmony轻量系统
 
    
瑞芯微RK3566鸿蒙开发板OpenHarmony标准系统应用兼容性测试指导
 
    
鸿蒙OpenHarmony南向/北向快速开发教程-迅为RK3568开发板
开源鸿蒙 编译OpenHarmony轻量系统QEMU RISC-V版本
 
    
鸿蒙OpenHarmony【轻量系统 编译】 (基于Hi3861开发板)
 
    
【开源鸿蒙】下载OpenHarmony 4.1 Release源代码
 
    
鸿蒙OpenHarmony【标准系统编写“Hello World”程序】 (基于RK3568开发板)
 
    
 
           
        
 
         鸿蒙开发-OpenHarmony轻量系统之获取当地时间
鸿蒙开发-OpenHarmony轻量系统之获取当地时间 
  
     
     
            
             
             
                 
             工商网监
工商网监
        
评论