sntp(简单网络时间协议)是一种网络时间协议,是NTP(网络时间协议)的简化版本。
该项目是从LwIP 中提取的SNTP 代码。
“Hi3861 SDK”已包含预编译的lwip,但未启用SNTP功能(无法修改静态库)。
您必须确保连接到模块的热点可以访问您的网络。
修改网络参数
在Hi3861开发板上运行以上四个测试程序之前,需要根据您的无线路由器和Linux系统IP修改net_params.h文件中的相关代码。
将PARAM_HOTSPOT_SSID 更改为您的热点名称。将PARAM_HOTSPOT_PSK 更改为您的热点密码。
您可能需要更改学校时间服务器的IP地址并更改以下代码。
无效SntpSetServers(无效)
{
IP4_ADDR(g_ntpServerList[0], 223, 113, 97, 98); //cn.ntp.org.cn
IP4_ADDR(g_ntpServerList[1], 114, 118, 7, 163); //ntp.ntsc.ac.cn
IP4_ADDR(g_ntpServerList[2], 120, 25, 108, 11); //time.pool.aliyun.com
IP4_ADDR(g_ntpServerList[3], 119, 28, 206, 193); //cn.pool.ntp.org
for (size_t i=0; i SNTP_SERVERS; i++) {
sntp_setserver(i, (ip_addr_t*)g_ntpServerList[i]);
}
}
此方法对URL 执行ping 操作并从返回的消息中确定IP 地址。
代码编写
修改D:\\DevEcoProjects\\test\\src\\vendor\\rtplay\\rt_hi3861\\demo\\BUILD.gn文件。
# 版权所有(c) 2023 北京华清远见教育科技有限公司
# 根据Apache 许可证2.0 版(“许可证”)获得许可。
# 除非按照许可证,否则您不得使用此文件。
# 许可证副本可在以下位置获取:
#
#http://www.apache.org/licenses/LICENSE-2.0
#
# 软件,除非适用法律要求或经我们书面同意。
# 根据许可证分发的任何内容均“按原样”分发。
# 不提供任何形式的明示或暗示的保证或条件。
# 具体语言的权限管理请参见许可证。
# 基于许可证的限制。
导入(\’//build/lite/config/component/lite_component.gni\’)
lite_component(\’演示\’) {
特征=[
#\’base_00_helloworld:base_helloworld_example\’,
#\’base_01_led:base_led_example\’,
#\’base_02_loopkey:base_loopkey_example\’,
#\’base_03_irqkey:base_irqkey_example\’,
#\’base_04_adc:base_adc_example\’,
#\’base_05_pwm:base_pwm_example\’,
#\’base_06_ssd1306:base_ssd1306_example\’,
#\’kernel_01_task:kernel_task_example\’,
#\’kernel_02_timer:kernel_timer_example\’,
#\’kernel_03_event:kernel_event_example\’,
#\’kernel_04_mutex:kernel_mutex_example\’,
#\’kernel_05_semaphore_as_mutex:kernel_semaphore_as_mutex_example\’,
#\’kernel_06_semaphore_for_sync:kernel_semaphore_for_sync_example\’,
#\’kernel_07_semaphore_for_count:kernel_semaphore_for_count_example\’,
#\’kernel_08_message_queue:kernel_message_queue_example\’,
#\’wifi_09_hotspot:wifi_hotspot_example\’,
#\’wifi_10_sta:wifi_sta_example\’,
#\’tcp_11_server:tcp_server_example\’,
#\’tcp_12_client:tcp_client_example\’,
#\’udp_13_server:udp_server_example\’,
#\’udp_14_client:udp_client_example\’,
#\’network_15_mqtt:network_mqtt_example\’,
\’network_16_sntp:network_sntp_example\’,
]
}
创建D:\\DevEcoProjects\\test\\src\\vendor\\rtplay\\rt_hi3861\\demo\\network_16_sntp 文件夹
在文件夹中创建D:\\DevEcoProjects\\test\\src\\vendor\\rtplay\\rt_hi3861\\demo\\network_16_sntp\\BUILD.gn文件
# 版权所有(c) 2020,HiHope 社区。
#
# 以源代码和二进制形式重新分发和使用(有或没有)
# 如果满足以下条件则允许更改:
#
#1. 源代码的重新分发必须保留上述版权声明。
# 条件列表和以下免责声明。
#
# 2. 以二进制形式重新分发必须复制上述版权声明。
# 文档中的条件列表和以下免责声明
# 和/或分发时附带的其他材料。
#
#3. 未列出版权所有者的姓名或名称。
# 贡献者可用于认可或推广源自以下内容的产品:
# 未经事先书面许可,不得使用本软件。
#
# 本软件由版权所有者和贡献者“按原样”提供。
# 以及任何明示或暗示的保证,包括但不限于:
# 不承担适销性和特定用途适用性的默示保证。
否认。在任何情况下,版权所有者或贡献者均不承担任何责任。
# 对于任何直接的、间接的、偶然的、特殊的、模范的或后果性的事情。
# 损害(包括但不限于替代或替代采购)
# 使用、数据或利润丢失或业务中断。
# 基于责任的原因和理论(无论合同或严格责任)
# 除使用以外的任何方式引起的侵权行为(包括疏忽或其他原因)
# 即使您已被告知可能会造成此类损害,也请勿使用该软件。
static_library(\’network_sntp_example\’) {
来源=[
\’network_sntp_example.c\’,
\’wifi_connecter.c\’,
\’//第三方/sntp/src/sntp.c\’,
\’//第三方/sntp/src/sntp_port.c\’,
\’//第三方/sntp/src/sntp_debug.c\’
]
定义=[
#\’SNTP_SERVER_DNS=1\’,
\’LWIP_HAVE_INT64=0\’,
\’LWIP_DEBUG\’,
\’SNTP_DEBUG=0xA0\’,
“LWIP_DBG_TYPES_ON=LWIP_DBG_ON”
]
include_dirs=[
\’//第三方/sntp/include\’,
\’//third_party/sntp/include/lwip/apps\’,
\’//基础/通信/wifi_lite/接口/wifiservice\’,
\’//供应商/hisi/hi3861/hi3861/third_party/lwip_sack/include/\’,
]
}
在文件夹中创建D:\\DevEcoProjects\\test\\src\\vendor\\rtplay\\rt_hi3861\\demo\\network_16_sntp\\wifi_connecter.h文件。头文件包含用于Wi-Fi 连接的宏。该文件与tcp_12_client\\wifi_connecter.h 相同
添加以下宏定义。
#ifndef PARAM_HOTSPOT_TYPE
#define PARAM_HOTSPOT_TYPE WIFI_SEC_TYPE_PSK /* 在wifi_device_config.h 中定义*/
万一
在文件夹中创建D:\\DevEcoProjects\\test\\src\\vendor\\rtplay\\rt_hi3861\\demo\\network_16_sntp\\wifi_connecter.c文件。这与tcp_12_client\\wifi_connecter.c 相同。
在文件夹中创建文件D:\\DevEcoProjects\\test\\src\\vendor\\rtplay\\rt_hi3861\\demo\\network_16_sntp\\network_sntp_example.c
/*
* 版权所有(c) 2020,HiHope 社区。
*
* 以源代码和二进制形式重新分发和使用,有或没有
*如果满足以下条件,则允许更改:
*
* 1. 源代码的再分发必须保留上述版权声明。
*下面列出了条款和条件以及免责声明。
*
* 2. 以二进制形式重新分发必须复制上述版权声明。
* 此条件列表和文件中的免责声明如下
* 和/或分发时附带的其他材料。
*
*3. 未列出版权所有者姓名和版权所有者姓名。
* 贡献者可用于认可或推广源自以下来源的产品:
*未经事先书面许可,不得使用本软件。
*
*本软件由版权所有者和贡献者“按原样”提供。
* 以及任何明示或暗示的保证,包括但不限于:
*不提供适销性和特定用途适用性的默示保证。
* 在任何情况下,版权所有者或贡献者均不承担任何责任。
* 对于任何直接的、间接的、偶然的、特殊的、模范的或后果性的事情。
* 损坏(包括但不限于替代品或购买替代产品)
* 服务、使用、数据或利润损失或业务中断。
* 基于任何责任原因或理论,无论是合同责任还是严格责任。
* 或以使用以外的任何方式引起的任何侵权行为(包括疏忽或其他行为);
* 即使被告知可能造成此类损害,也禁止使用该软件。
*/
#include stdio.h
#include \’ohos_init.h\’
#include \’cmsis_os2.h\’
#include \’sntp.h\’
#include \’wifi_connecter.h\’
#include \’lwip/pbuf.h\’
#include \’lwip/dns.h\’
#include \’lwip/ip4_addr.h\’
#定义SNTP_SERVERS 4
//#define ARRAY_SIZE(a) sizeof(a)/sizeof(a[0])
#定义堆栈大小(4096)
#定义DELAY_TICKS_500 (500)
静态int g_netId=-1;
#如果SNTP_SERVER_DNS
静态const char* g_ntpServerList[]={
//参考来自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)
无效SntpSetServernames(无效)
{
for (size_t i=0; i SNTP_SERVERS; i++) {
sntp_setservername(i, g_ntpServerList[i]);
}
}
除此之外
//ip4_addr_t g_ntpServerList[SNTP_MAX_SERVERS];
ip4_addr_t g_ntpServerList[SNTP_SERVERS];
无效SntpSetServers(无效)
{
IP4_ADDR(g_ntpServerList[0], 223, 113, 97, 98); //cn.ntp.org.cn
IP4_ADDR(g_ntpServerList[1], 114, 118, 7, 163); //ntp.ntsc.ac.cn
IP4_ADDR(g_ntpServerList[2], 120, 25, 108, 11); //time.pool.aliyun.com
IP4_ADDR(g_ntpServerList[3], 119, 28, 206, 193); //cn.pool.ntp.org
for (size_t i=0; i SNTP_SERVERS; i++) {
sntp_setserver(i, (ip_addr_t*)g_ntpServerList[i]);
}
}
万一
静态无效SntpTask(无效)
{
WifiDeviceConfig 设置={0};
//准备AP配置参数
//strcpy(config.ssid, PARAM_HOTSPOT_SSID);
//strcpy(config.preSharedKey, PARAM_HOTSPOT_PSK);
strcpy_s(config.ssid, WIFI_MAX_SSID_LEN, PARAM_HOTSPOT_SSID);
strcpy_s(config.preSharedKey, WIFI_MAX_KEY_LEN, PARAM_HOTSPOT_PSK);
config.securityType=PARAM_HOTSPOT_TYPE;
g_netId=ConnectToHotspot(配置);
printf(\’netId=%d\\r\\n\’, g_netId);
#如果SNTP_SERVER_DNS
ip4_addr_t dnsServerAddr;
IP4_ADDR(dnsServerAddr, 202, 98, 0, 68);
dns_setserver(0, (结构ip_addr *)dnsServerAddr);
dns_init();
SntpSetServernames();
除此之外
SntpSetServers();
万一
sntp_setoperatingmode(SNTP_OPMODE_POLL);
sntp_init();
printf(\’sntp_enabled: %d\\r\\n\’, sntp_enabled());
for (size_t i=0; i SNTP_SERVERS; i++) {
printf(\’sntp_getreachability(%zu): %d\\r\\n\’, i, sntp_getreachability(i));
}
osDelay(DELAY_TICKS_500);
for (size_t i=0; i SNTP_SERVERS; i++) {
printf(\’sntp_getreachability(%zu): %d\\r\\n\’, i, sntp_getreachability(i));
}
}
静态无效SntpEntry(无效)
{
osThreadAttr_t 属性={0};
attr.name=\’SntpTask\’;
attr.stack_size=STACK_SIZE;
attr.priority=osPriorityNormal;
if (osThreadNew(SntpTask, NULL, attr)==NULL) {
printf(\'[SntpEntry] 创建SntpTask 失败!\\n\’);
}
}
SYS_RUN(SntpEntry);
使用构建。编译成功后,使用upload进行写入。
#Hi3861 以上有关OpenHarmony嵌入式应用入门的相关内容摘自互联网,仅供参考。相关信息请参见官方公告。
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/93081.html