0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【HarmonyOS HiSpark Wi-Fi IoT 套件试用连载】六、同步网络时间

开发板试用精选 ? 来源:开发板试用 ? 作者:电子发烧友论坛 ? 2022-11-02 15:13 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本文来源电子发烧友社区,作者:李元江, 帖子地址:https://bbs.elecfans.com/jishu_2025289_1_1.html

今天的帖子我写的是关于网络时间同步,主要功能为按下按键,进入网络NTP时间获取功能,最后完成网络时间的同步。

一、NTP时间获取

首先说说怎么获取网络时钟。现在很多NTP时间服务器,从服务器中就能获取网络时间。我所使用的时间服务器为time.windows.com,IP地址为52.231.114.183,端口号为123,采用UDP协议。需要先采用UDP方式,连接到该服务器。之后再发送48个字节的十六进制数(不用回车加换行):0b 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 d6 6d d9 00 00 00 00 00然后就可以看到时间服务器返回来的数据,下图是我使用调试组手获得的数据,正常情况下一共会收到48个字节数据,第41-44字节的数据是我们所需要的时间数据。如下获得的NTP数据为0xE398556A。

  • 注意:该NTP数据是从1900年开始算的,而时间戳是从1970年开始算的
215103y02ouoeqajofgbah.jpg
二、软件设计
首先需要移植许思维老师例程的部分代码。其中包括:net_common.h、net_demo.h、net_params.h、wifi_connecter.c、wifi_connecter.h。
其中net_params.h需要注意
PARAM_HOTSPOT_SSID改为你的路由器或者wifi热点名字,PARAM_HOTSPOT_PSK更改为路由器获取热点密码。
  1. #ifndef PARAM_HOTSPOT_SSID
  2. #define PARAM_HOTSPOT_SSID "YYYYY" // your AP SSID
  3. #endif
  4. ?
  5. #ifndef PARAM_HOTSPOT_PSK
  6. #define PARAM_HOTSPOT_PSK"123456"// your AP PSK
  7. #endif
复制代码
1. getNTP.c

该函数主要完成网络连接,连接时间服务器及时间获取,并根据获取到的NTP时间计算出对应的时间戳。获取到的NTP时间数值是从1900年开始计算,时间戳数值从1970年开始计算。因此需要减去1970-1900年间的数值,才能得到我们所需的时间戳。

  1. #include
  2. #include
  3. #include
  4. #include
  5. ?
  6. #include "net_demo.h"
  7. #include "net_common.h"
  8. #include "net_params.h"
  9. #include "wifi_connecter.h"
  10. #include "ohos_init.h"
  11. #include "cmsis_os2.h"
  12. ?
  13. #define NTPIPADDR "52.231.114.183"
  14. #define NTPPORT 123
  15. ?
  16. #define NTP_TIMESTAMP_DELTA 2208988800ull
  17. ?
  18. externuint32_t timedata;
  19. extern bool GetNTPFlag;
  20. ?
  21. void getNtpTime(void)
  22. {
  23. ?
  24. uint32_t NTP_Time;
  25. unsigned char buf[48];//存储NTP服务器返回的数据
  26. unsigned char NTP_Data[]=
  27. { 0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  28. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  29. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  30. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  31. 0x0d6,0x06d,0x0d9,0x00,0x00,0x00,0x00,0x00};
  32. ; //48字节的报文
  33. ?
  34. ?
  35. WifiDeviceConfig config = {0};
  36. ?
  37. // 准备AP的配置参数
  38. strcpy(config.ssid, PARAM_HOTSPOT_SSID);
  39. strcpy(config.preSharedKey, PARAM_HOTSPOT_PSK);
  40. config.securityType = PARAM_HOTSPOT_TYPE;
  41. osDelay(10);
  42. int netId = ConnectToHotspot(&config);
  43. ?
  44. ssize_t retval = 0;
  45. int sockfd = socket(AF_INET, SOCK_DGRAM, 0); // UDP socket
  46. ?
  47. struct sockaddr_in toAddr = {0};
  48. toAddr.sin_family = AF_INET;
  49. toAddr.sin_port = htons(NTPPORT); // 端口号,从主机字节序转为网络字节序
  50. if (inet_pton(AF_INET, NTPIPADDR, &toAddr.sin_addr) <= 0) { // 将主机IP地址从“点分十进制”字符串 转化为 标准格式(32位整数)
  51. printf("inet_pton failed!rn");
  52. goto do_cleanup;
  53. }
  54. ?
  55. // UDP socket 是 “无连接的” ,因此每次发送都必须先指定目标主机和端口,主机可以是多播地址
  56. retval = sendto(sockfd, NTP_Data, 48, 0, (struct sockaddr *)&toAddr, sizeof(toAddr));
  57. if (retval < 0) {
  58. printf("sendto failed!rn");
  59. goto do_cleanup;
  60. }
  61. ?
  62. printf("send NTP message %ld done!rn",retval);
  63. for(uint8_t i = 0;i<48;i++)
  64. {
  65. printf("%02xt",(unsigned char)NTP_Data[i]);
  66. if( (i+1) % 8 == 0 )
  67. printf("rn");
  68. }
  69. struct sockaddr_in fromAddr = {0};
  70. socklen_t fromLen = sizeof(fromAddr);
  71. ?
  72. // UDP socket 是 “无连接的” ,因此每次接收时前并不知道消息来自何处,通过 fromAddr 参数可以得到发送方的信息(主机、端口号)
  73. retval = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&fromAddr, &fromLen);
  74. if (retval <= 0) {
  75. printf("recvfrom failed or abort, %ld, %d!rn", retval, errno);
  76. goto do_cleanup;
  77. }
  78. ?
  79. NTP_Time = buf[40]<<24 | buf[40+1]<<16|buf[40+2]<<8 |buf[40+3];
  80. timedata = NTP_Time - NTP_TIMESTAMP_DELTA;
  81. ?
  82. printf("timedata is %ldn",timedata);
  83. //response[retval] = '';
  84. printf("recv UDP message {%s} %ld done!rn", buf, retval);
  85. printf("peer info: ipaddr = %s, port = %drn", inet_ntoa(fromAddr.sin_addr), ntohs(fromAddr.sin_port));
  86. GetNTPFlag = false;
  87. ?
  88. for(uint8_t i = 0;i<48;i++)
  89. {
  90. printf("%02xt",(unsigned char)buf[i]);
  91. if( (i+1) % 8 == 0 )
  92. printf("rn");
  93. }
  94. do_cleanup:
  95. ?
  96. GetNTPFlag = false;
  97. printf("do_cleanup...rn");
  98. close(sockfd);
  99. ?
  100. printf("disconnect to AP ...rn");
  101. DisconnectWithHotspot(netId);
  102. printf("disconnect to AP done!rn");
  103. }
复制代码
2. oled_demo.c

在oled_demo.c文件中增加获取时间功能代码。按下按键进入时间同步功能。

  1. AdcRead(ANALOG_KEY_CHAN_NAME, &data, WIFI_IOT_ADC_EQU_MODEL_4, WIFI_IOT_ADC_CUR_BAIS_DEFAULT, 0);
  2. float voltage = ConvertToVoltage(data);
  3. ?
  4. if(voltage>0.45 && voltage<0.65)
  5. {
  6. OledShowString(16,7,"Sync time...",1);
  7. getNtpTime();
  8. OledFillScreen(0);
  9. }
复制代码
3. BUILD.gn
修改BUILD.gn,增加wifi_connecter.c和getNTP.c
  1. sources = [
  2. "oled_demo.c",
  3. "oled_ssd1306.c",
  4. "timeconv.c",
  5. "envrionment_demo.c",
  6. "aht20.c",
  7. "wifi_connecter.c",
  8. "getNTP.c"
  9. ]
复制代码
三、结果演示
按下OLED显示板左边按键,进入时间同步功能。会显示“Sync time...”提示。
214839pxg5b11jxb1gdqbe.jpg
时间同步完成后,可以看到OLED显示为最新同步的时间。
214855vqzeqqhzdkvl55eq.jpg

四、总结
NTP时间获取很简单,只需要设备连接到网络,并且连接到时间服务器,再发送48个字节的固定数据到服务器,服务器会自动返回带有NTP时间数值的报文。下一篇我打算写一篇关于获取天气预报的贴子,涉及到如何从网络获取天气预报数据,如何使用CJson解析Json格式的天气预报内容。
还有2个多小时就2021年了,祝各位工程师2021越来越好。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • wi-fi
    +关注

    关注

    14

    文章

    2276

    浏览量

    127378
  • HarmonyOS
    +关注

    关注

    80

    文章

    2130

    浏览量

    33650
  • HiSpark
    +关注

    关注

    1

    文章

    156

    浏览量

    7446
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Wi-Fi 8要来了!未来Wi-Fi技术演进方向揭秘

    产品销售中,虽然Wi-Fi 7产品的销量份额快速从年初的个位数百分比增长至14%,但Wi-Fi 6产品的销量份额依然稳定在60%左右。如果从存量设备来看,那么Wi-Fi 7路由器的占比将远远小于这个数。 ? 智能手机等终端设备已
    的头像 发表于 11-24 03:14 ?4147次阅读
    <b class='flag-5'>Wi-Fi</b> 8要来了!未来<b class='flag-5'>Wi-Fi</b>技术演进方向揭秘

    锐捷网络Wi-Fi 7加速演进,2025年进入快速爬坡期

    随着4K/8K、VR/AR、远程医疗、工业物联网等新型应用的不断涌现,家庭、企业和工业环境对Wi-Fi网络提出了更高要求。在此驱动下,行业正向Wi-Fi 7加速演进,而2025年成为Wi-Fi
    的头像 发表于 08-01 10:29 ?209次阅读
    锐捷<b class='flag-5'>网络</b>:<b class='flag-5'>Wi-Fi</b> 7加速演进,2025年进入快速爬坡期

    科普|公司的Wi-Fi,为什么这么慢?

    大家在公司上班,经常会使用到Wi-Fi。最近这几年,随着时代的发展,高清视频会议等大带宽网络应用越来越普遍。而公司的网络,却非常不给力,频繁卡顿,严重影响使用体验。哪怕IT的同事已经把网络
    的头像 发表于 06-20 06:06 ?631次阅读
    科普|公司的<b class='flag-5'>Wi-Fi</b>,为什么这么慢?

    Wi-Fi 8:开启极高可靠性 (UHR) 连接的新纪元——2

    ) Hi-Priority EDCA (HIP EDCA) 在Wi-Fi 网络架构中,每个终端设备的每一个将被传输或接收的数据都会在特定时间点进行调度。通过优先级排序和相应算法,大多数数据传输能够在规定
    发表于 06-13 11:15

    Wi-Fi 8:开启极高可靠性 (UHR) 连接的新纪元——1

    的802.11bn (Wi-Fi 8) 标准化工作的时间表。图中提及的“UHR”是指UHR Study Group (简称UHR SG) ,该小组成立于2022 年7 月,旨在讨论关于UHR项目授权请求 (UHR
    发表于 06-13 11:09

    华为加速Wi-Fi 7技术在行业场景的应用

    华为数据通信创新峰会2025期间,华为面向中东中亚地区举办第三季“Imagine Wi-Fi 7 to Reality”创新应用大赛颁奖典礼,9位参赛者凭借Wi-Fi 7的应用创新成果脱颖而出并获奖。会上,华为同步发布第四季赛事
    的头像 发表于 05-21 16:09 ?527次阅读

    基于 Wi-Fi 的定位服务

    以下捕获使用 location_wifi_get 函数请求 Wi-Fi 定位服务。该事件的总功耗为 125.85mC,日志显示精确度为 30.0m。 Got location: method
    发表于 04-17 15:16

    nRF Cloud Wi-Fi 定位服务

    中实现高性能和超低功耗。对于 Wi-Fi 定位请求,nRF Cloud 可借助 Wi-Fi 数据库计算设备位置,该数据库包含不同 Wi-Fi 网络的坐标。然后,设备位置将从 nRF C
    发表于 04-17 15:07

    Wi-Fi 定位服务

    Wi-Fi 是一种著名的无线网络技术,用于设备的局域网和互联网接入。Wi-Fi 通过 Wi-Fi 网络为家庭、办公室和学校等环境提供便捷的
    发表于 04-17 15:01

    推出了期待已久的 nRF7002 低功耗Wi-Fi 6

    支持长寿命的电池供电Wi-Fi操作。 借助 Wi-Fi 6,我们将支持用于 Matter 的所有无线协议、用于调试的蓝牙 LE、用于低功耗mesh网络的 Thread 以及用于高吞吐量的Wi-
    发表于 03-26 11:00

    2.4GHz+5GHz双频低功耗 Wi-Fi 6协同IC -nRF7002

    /VR设备的应用:VR头戴显示器:确保高清画面流畅传输和低延迟响应。AR智能眼镜:提供稳定的无线连接,延长续航时间。无线体感手套和控制器:高效同步交互,增强用户体验。云VR/AR设备:通过Wi-Fi
    发表于 02-26 14:54

    华为海思正式进入Wi-Fi FEM赛道?

    大家都知道了,2018年11 月离开锐迪科(RDA),前往福建晋江创立三伍微,专注于Wi-Fi射频前端芯片,从路由器Wi-Fi FEM,到手机Wi-Fi FEM,再到IoT FEM全覆
    发表于 12-11 17:42

    Wi-Fi 4到Wi-Fi 7:网速飙升40倍的无线革命

    1 Wi-Fi技术的快速发展 每一代新的Wi-Fi协议发布,都会带来更高的无线速率。 ? 从Wi-Fi 4到Wi-Fi 7:无线网络技术显著
    的头像 发表于 12-09 10:10 ?1144次阅读
    从<b class='flag-5'>Wi-Fi</b> 4到<b class='flag-5'>Wi-Fi</b> 7:网速飙升40倍的无线革命

    Wi-Fi 7与Wi-Fi 6E有什么区别

    也许很多人还在考虑是否要将使用的Wi-Fi设备升级到Wi-Fi 6或Wi-Fi 6E,而这些标准的继任者却已经开始“登堂入室”了。Wi-Fi 7是新一代
    的头像 发表于 11-07 11:38 ?3877次阅读

    最典型的3家Wi-Fi Halow芯片企业

    Wi-Fi Halow是Wi-Fi联盟推出的专门面向物联网市场的标准。
    的头像 发表于 08-30 09:58 ?4350次阅读
    最典型的3家<b class='flag-5'>Wi-Fi</b> Halow芯片企业