吴忠躺衫网络科技有限公司

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"http:// 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

    文章

    2169

    瀏覽量

    125019
  • HarmonyOS
    +關注

    關注

    79

    文章

    1982

    瀏覽量

    30579
  • HiSpark
    +關注

    關注

    1

    文章

    156

    瀏覽量

    6955
收藏 人收藏

    評論

    相關推薦

    Wi-Fi 8要來了!未來Wi-Fi技術演進方向揭秘

    產品銷售中,雖然Wi-Fi 7產品的銷量份額快速從年初的個位數百分比增長至14%,但Wi-Fi 6產品的銷量份額依然穩定在60%左右。如果從存量設備來看,那么Wi-Fi 7路由器的占比將遠遠小于這個數。 ? 智能手機等終端設備已
    的頭像 發表于 11-24 03:14 ?2061次閱讀
    <b class='flag-5'>Wi-Fi</b> 8要來了!未來<b class='flag-5'>Wi-Fi</b>技術演進方向揭秘

    華為海思正式進入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 ?411次閱讀
    從<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 ?1215次閱讀

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

    Wi-Fi Halow是Wi-Fi聯盟推出的專門面向物聯網市場的標準。
    的頭像 發表于 08-30 09:58 ?2156次閱讀
    最典型的3家<b class='flag-5'>Wi-Fi</b> Halow芯片企業

    IR900 Wi-Fi聯網的配置過程

    例如上圖,IR900 通過Wi-Fi接口連接公司辦公無線網絡 inhand-office (SSID為無線網絡的名稱) 首先將Wi-Fi接口與WLAN接口解綁 登陸IR900后,進
    發表于 07-25 06:09

    AT 0.60.0.0看不到我的Wi-Fi網絡,為什么?

    我對 AT 0.60.0.0 有一點問題。當我通過 AT CWLAP 顯示所有網絡時,我看不到我的路由器 AP 網絡,但我可以連接到它。當我在智能手機中打開 Wi-Fi 熱點時,我可以看到我的熱點
    發表于 07-18 08:31

    未來的Wi-Fi路由器

    轉載自——鐘林談芯 沒有創新就沒有未來,Wi-Fi路由器也是如此。 進入2024年以后,Wi-Fi路由器市場變得更加艱難,利潤大幅下滑,BOM成本價高于市場價,接不接訂單,都陷入兩難。 國內主芯片
    的頭像 發表于 06-20 15:32 ?499次閱讀

    DA16200 超低功耗 Wi-Fi 模塊開發套件 Pro數據手冊

    電子發燒友網站提供《DA16200 超低功耗 Wi-Fi 模塊開發套件 Pro數據手冊.rar》資料免費下載
    發表于 05-30 17:53 ?1次下載
    DA16200 超低功耗 <b class='flag-5'>Wi-Fi</b> 模塊開發<b class='flag-5'>套件</b> Pro數據手冊

    DA16200 超低功耗 Wi-Fi 模塊開發套件數據手冊

    電子發燒友網站提供《DA16200 超低功耗 Wi-Fi 模塊開發套件數據手冊.rar》資料免費下載
    發表于 05-30 17:13 ?0次下載
    DA16200 超低功耗 <b class='flag-5'>Wi-Fi</b> 模塊開發<b class='flag-5'>套件</b>數據手冊

    華為獲得全球首個國際Wi-Fi聯盟WFA企業級Wi-Fi 7認證!

    Wi-Fi聯盟已發布Wi-Fi 7認證標準,華為是第一批送測廠商,獲得業界首個企業級Wi-Fi 7 的Wi-Fi聯盟官方認證。
    的頭像 發表于 04-28 10:17 ?807次閱讀
    華為獲得全球首個國際<b class='flag-5'>Wi-Fi</b>聯盟WFA企業級<b class='flag-5'>Wi-Fi</b> 7認證!

    驗證物聯網Wi-Fi HaLow用例的MM6108-EKH08開發套件來啦

    驗證物聯網Wi-Fi HaLow用例的MM6108-EKH08開發套件來啦 MM6108-EKH08開發套件專為驗證物聯網Wi-Fi HaLow用例而設計。該
    的頭像 發表于 04-11 12:01 ?1848次閱讀
    驗證物聯網<b class='flag-5'>Wi-Fi</b> HaLow用例的MM6108-EKH08開發<b class='flag-5'>套件</b>來啦

    Wi-Fi 7與Wi-Fi 6的相關知識科普

    科普:Wi-Fi 7 vs. Wi-Fi 6,青出于藍
    的頭像 發表于 03-12 10:59 ?869次閱讀
    <b class='flag-5'>Wi-Fi</b> 7與<b class='flag-5'>Wi-Fi</b> 6的相關知識科普

    Wi-Fi的誕生與發展

    和5GHz兩個頻段,承載著不斷增長的網絡需求。ABIResearch顯示,2022年Wi-Fi上傳流量激增80%,Wi-Fi數據流量已超過蜂窩流量,且成為流量增量貢
    的頭像 發表于 03-07 08:26 ?1437次閱讀
    <b class='flag-5'>Wi-Fi</b>的誕生與發展

    WI-FI基礎知識及飛易通SOC模塊

    什么是Wi-Fi/What is Wi-Fi,首先Wi-Fi又稱“無線熱點”或“無線網絡”,是Wi-Fi聯盟的商標,一個基于IEEE 802
    的頭像 發表于 03-01 15:01 ?779次閱讀
    <b class='flag-5'>WI-FI</b>基礎知識及飛易通SOC模塊
    金海岸百家乐的玩法技巧和规则| 泽州县| 百家乐国际娱乐平台| 有钱人百家乐官网的玩法技巧和规则 | 安徽棋牌游戏中心| 金三角百家乐的玩法技巧和规则| 百家乐官网种类| 博彩百家乐官网带连线走势图| 百家乐官网德州扑克轮盘| 奉新县| 在线体育投注| bet365 备用| 百家乐手机游戏下载| 新葡京百家乐官网娱乐城| 百家乐官网平台那家好| 真人百家乐官网海立方| 皇室百家乐官网娱乐城| 百家乐官网分析仪博彩正网| 百家乐官网不能视频| 开心8百家乐官网现金网| 金球国际娱乐城| 平顺县| 百家乐官网小游戏开发| 真人百家乐官网分析软件是骗局| 百家乐官网输了100万| 太阳城百家乐官网怎样开户| 百家乐官网下载游戏| 玩百家乐官网技巧看路| 赌场百家乐官网技巧| 网上百家乐官网真的假| 皮山县| 百家乐使用技法| 百家乐官网光纤冼牌机| 网络百家乐官网现金游戏哪里的信誉好啊 | 三公百家乐玩法| 百家乐高手打| 大发888怎么申请账号| 百家乐牌机的破解法| 威斯汀百家乐的玩法技巧和规则 | bet365合作计划| 百家乐官网取胜秘笈|