在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

【HarmonyOS HiSpark Wi-Fi IoT 套件試用連載】九:遠程TCP通信

開發板試用精選 ? 來源:開發板試用 ? 作者:電子發燒友論壇 ? 2022-11-02 14:18 ? 次閱讀
本文來源電子發燒友社區,作者:李元江, 帖子地址:https://bbs.elecfans.com/jishu_2028163_1_1.html

今天的帖子是關于如何讓手機可以與wifiiot進行遠程通信。通過遠程的TCP中轉服務端,讓手機與板子進行可以進行遠程數據傳輸。
一、數據傳輸過程
該過程與局域網內的TCP服務端與客戶端數據傳輸過程很類似。局域網內是這樣的,兩個設備在同一個局域網內,一個作為TCP服務端,一個作為TCP客戶端,這樣這兩個設備就是進行局域網內的數據通信。但是兩個設備不在同一個網絡內,數據傳輸在上面的方法是行不通的。這時可以借助一個在公網的TCP中轉服務端,實現兩個設備的遠程數據傳輸。數據傳輸過程為兩個設備都作為TCP客戶端,一個設備把數據傳輸到服務端,然后服務端把數據傳輸到另一個設備。但是這也要求,這兩個設備的網絡是可以連接到公網的,否則是無法連接到公網的TCP服務端。
二、軟件設計
首先我們需要一個在公網的TCP客戶端。如果各位自己有云服務器的,可以自行搭建一個TCP中轉服務端。我使用的客戶端是別人用于測試的客戶端。軟件方面需要考慮幾個問題:
  • 連接服務器的切換在我的上幾個帖子上,需要連接其他服務器獲取時間數據或者獲取天氣數據。這時,我們需要在進行連接服務器切換,確保獲取的數據正常。
  • 連接狀態檢測我們還需要進行連接狀態檢查,如果與TCP服務端斷開,是無法正常進行數據交互的。
  • 連接重連如果檢查到連接斷開,或者沒有連接成功,需要重新嘗試進行與服務端的連接。
1、TCP相關函數
新建tcp_connect.c tcp_connect.h文件,里面主要是與TCP連接、TCP連接斷開、TCP數據發送、數據接收相關的函數。注意:TCPIPADDR、TCPPORT是公網TCP客戶端IP地址和端口號。其實這幾個函數是在之前的tcp例程中拆分出來的,把一個函數劃分為四個函數而已。
  • 設置接收超時之前的例程中,沒有加入接收超時機制,如果沒有接收到數據,會一直呈現阻塞狀態,其他任務可能會出現無法正常運行的狀態,所以我們需要加入超時機制,超過一定時間沒接收到數據,也會推出退出接收過程。timeval 在頭文件中。//設置接收超時struct timeval timeout={2,0};//1sif (setsockopt(sockfd,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(struct timeval)) == -1){ printf("setsockopt failed!rn"); //goto do_cleanup;}
  • tcp_connect.c
  1. #include "tcp_connect.h"
  2. //#define TCPIPADDR "192.168.3.9"
  3. //#define TCPPORT 5678
  4. #define TCPIPADDR "115.29.109.104"
  5. #define TCPPORT 6545
  6. ?
  7. static int sockfd;
  8. static int netId;
  9. static struct sockaddr_in serverAddr = {0};
  10. ?
  11. TCP_STATIC connect_status = DISCONNECTED;
  12. //extern char sendData[30];
  13. ?
  14. bool TcpConnect(void)
  15. {
  16. bool connectflag = false;
  17. WifiDeviceConfig config = {0};
  18. ?
  19. // 準備AP的配置參數
  20. strcpy(config.ssid, PARAM_HOTSPOT_SSID);
  21. strcpy(config.preSharedKey, PARAM_HOTSPOT_PSK);
  22. config.securityType = PARAM_HOTSPOT_TYPE;
  23. osDelay(10);
  24. netId= ConnectToHotspot(&config);
  25. ?
  26. sockfd = socket(AF_INET, SOCK_STREAM, 0); // TCP socket
  27. ?
  28. serverAddr.sin_family = AF_INET;// AF_INET表示IPv4協議
  29. serverAddr.sin_port = htons(TCPPORT);// 端口號,從主機字節序轉為網絡字節序
  30. if (inet_pton(AF_INET, TCPIPADDR , &serverAddr.sin_addr) <= 0) {??// 將主機IP地址從“點分十進制”字符串 轉化為 標準格式(32位整數)
  31. printf("inet_pton failed!rn");
  32. goto do_cleanup;
  33. }
  34. ?
  35. //設置接收超時
  36. struct timeval timeout={2,0};//1s
  37. if (setsockopt(sockfd,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(struct timeval)) == -1)
  38. {
  39. printf("setsockopt failed!rn");
  40. //goto do_cleanup;
  41. }
  42. ?
  43. // 嘗試和目標主機建立連接,連接成功會返回0 ,失敗返回 -1
  44. if (connect(sockfd, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0) {
  45. printf("connect failed!rn");
  46. goto do_cleanup;
  47. }
  48. printf("connect to server %s success!rn",TCPIPADDR);
  49. connectflag = true;
  50. connect_status = CONNECTED;
  51. do_cleanup:
  52. return connectflag;
  53. }
  54. ?
  55. bool TcpDisconnect(void){
  56. ?
  57. close(sockfd);
  58. DisconnectWithHotspot(netId);
  59. connect_status = DISCONNECTED;
  60. return true;
  61. }
  62. ?
  63. bool TcpSend(char *data,int len){
  64. // printf("send start!n");
  65. int retval = send(sockfd, data , len, 0);
  66. if (retval < 0) {
  67. //printf("send request failed!rn");
  68. return false;
  69. }
  70. else{
  71. // printf("send OK!n");
  72. return true;
  73. }
  74. }
  75. ?
  76. extern char revData[30];
  77. bool TcpRev(void){
  78. int retval =0;
  79. retval = recv(sockfd, &revData, sizeof(revData), 0);
  80. if (retval <= 0) {
  81. // printf("rev from server failed or done, %ld!rn", retval);
  82. return false;
  83. }
  84. revData[retval] = '';
  85. return true;
  86. }
復制代碼
  • tcp_connect.h
  1. #ifndef __TCP_CONNECT_H
  2. #define __TCP_CONNECT_H
  3. ?
  4. ?
  5. #include
  6. #include
  7. #include
  8. ?
  9. #include "net_demo.h"
  10. #include "net_common.h"
  11. #include "net_params.h"
  12. #include "wifi_connecter.h"
  13. #include "ohos_init.h"
  14. #include "cmsis_os2.h"
  15. ?
  16. typedef enum{
  17. DISCONNECTED = 0,
  18. CONNECTED,
  19. }TCP_STATIC;
  20. ?
  21. extern TCP_STATIC connect_status;
  22. ?
  23. bool TcpConnect(void);
  24. bool TcpDisconnect(void);
  25. bool TcpSend(char *data,int len);
  26. bool TcpRev(void);
  27. ?
  28. #endif/*__TCP_CONNECT_H*/
復制代碼
2、TCP數據接收和發送任務
新建tcptask.c 這里面這要是新建兩個任務,一個是數據發送任務,一個是數據發送任務。
  • 數據發送任務在數據發送任務中,如果與服務端連接狀態正常,會每隔兩秒發送一次數據到服務端。這里有連接狀態檢查和連接重連機制,如果數據發送不成功,則把連接狀態看為是未連接狀態。在未連接狀態,每隔兩秒會嘗試重新連接服務端,直到再一次成功連接上服務端。
  • 數據接收任務為了保證能夠隨時接收到服務端發送過來的數據,該任務會每10ms調度一次。在連接狀態為已連接情況下,會執行TCP數據接收函數。

  1. #include
  2. #include
  3. #include
  4. ?
  5. #include "tcp_connect.h"
  6. #include "ohos_init.h"
  7. #include "cmsis_os2.h"
  8. ?
  9. char sendData[]="hellow tcp!";
  10. char revData[30]="";
  11. typedef enum{
  12. GET_NORMAL =0 ,
  13. GET_PROPRESS,
  14. GET_SUC,
  15. GET_FAIL,
  16. }GET_STATUS;
  17. ?
  18. extern GET_STATUS Get_Status;
  19. ?
  20. static void TcpSendTask(void *arg)
  21. {
  22. sleep(3);
  23. uint8_t i = 0;
  24. while(1){
  25. if(TcpConnect())
  26. {
  27. printf("Tcp Connect Sucn");
  28. break;
  29. }
  30. else{
  31. i++;
  32. }
  33. if(i>10)
  34. break;
  35. }
  36. if(i>10)
  37. printf("Tcp Connect failn");
  38. ?
  39. (void)arg;
  40. while(1)
  41. {
  42. if(connect_status == CONNECTED)
  43. {
  44. if(!TcpSend(sendData,sizeof(sendData)-1)){
  45. connect_status = DISCONNECTED;
  46. TcpDisconnect();
  47. }
  48. }
  49. else{
  50. if(Get_Status == GET_NORMAL){
  51. if(TcpConnect()){
  52. printf("Tcp Connect Sucn");
  53. }
  54. }
  55. }
  56. sleep(2);
  57. }
  58. }
  59. ?
  60. static void TcpSendTaskHandle(void)
  61. {
  62. osThreadAttr_t attr;
  63. attr.name = "TcpSendTask";
  64. attr.attr_bits = 0U;
  65. attr.cb_mem = NULL;
  66. attr.cb_size = 0U;
  67. attr.stack_mem = NULL;
  68. attr.stack_size = 4096;
  69. attr.priority = osPriorityNormal;
  70. if (osThreadNew(TcpSendTask, NULL, &attr) == NULL) {
  71. printf("[TcpSendTaskHandle] Falied to create TcpSendTask!n");
  72. }
  73. }
  74. APP_FEATURE_INIT(TcpSendTaskHandle);
  75. ?
  76. ?
  77. static void TcpRevTask(void *arg){
  78. (void)arg;
  79. while(1)
  80. {
  81. if(connect_status == CONNECTED)
  82. {
  83. if(TcpRev()){
  84. printf("%s",revData);
  85. }
  86. }
  87. usleep(10000);
  88. }
  89. }
  90. ?
  91. static void TcpRevTaskHandle(void)
  92. {
  93. osThreadAttr_t attr;
  94. attr.name = "TcpRevTask";
  95. attr.attr_bits = 0U;
  96. attr.cb_mem = NULL;
  97. attr.cb_size = 0U;
  98. attr.stack_mem = NULL;
  99. attr.stack_size = 4096;
  100. attr.priority = osPriorityNormal;
  101. if (osThreadNew(TcpRevTask, NULL, &attr) == NULL) {
  102. printf("[TcpRevTaskHandle] Falied to create TcpRevTask!n");
  103. }
  104. }
  105. APP_FEATURE_INIT(TcpRevTaskHandle);
復制代碼
3、連接服務器切換
前面也說了,在獲取時間或者天氣數據時,需要進行連接服務端的切換,確保能接收到正確的數據。在keytask.c文件進行修改。在獲取時間和天氣函數前加上TCP服務斷開函數,獲取完之后,加上TCP連接函數。

  1. if((voltage>0.45 && voltage<0.65)&&(!keyflag))
  2. {
  3. keyflag = true;
  4. if(connect_status == CONNECTED)
  5. TcpDisconnect();
  6. //OledShowString(16,7,"Sync time...",1);
  7. //getNtpTime();
  8. //OledFillScreen(0);
  9. switch (Now_Screen){
  10. case TIMESCREEN:
  11. //OledShowString(16,7,"Sync time...",1);
  12. Get_Status = GET_PROPRESS;
  13. if(getNtpTime()){
  14. Get_Status = GET_SUC;
  15. }
  16. //OledFillScreen(0);
  17. else
  18. {
  19. //OledShowString(0,7,"Get fail...",1);
  20. Get_Status = GET_FAIL;
  21. }
  22. break;
  23. case NOWSCREEN:
  24. //OledShowString(0,7,"Get Weather...",1);
  25. Get_Status = GET_PROPRESS;
  26. if(getWeather())
  27. //OledFillScreen(0);
  28. Get_Status = GET_SUC;
  29. else
  30. {
  31. //OledShowString(0,7,"Get fail...",1);
  32. Get_Status = GET_FAIL;
  33. }
  34. break;
  35. case TOSCREEN:
  36. Get_Status = GET_PROPRESS;
  37. if(getWeather())
  38. Get_Status = GET_SUC;
  39. else
  40. {
  41. Get_Status = GET_FAIL;
  42. }
  43. break;
  44. case ATOSCREEN:
  45. Get_Status = GET_PROPRESS;
  46. if(getWeather())
  47. Get_Status = GET_SUC;
  48. else
  49. {
  50. Get_Status = GET_FAIL;
  51. }
  52. break;
  53. ?
  54. default:
  55. break;
  56. }
  57. TcpConnect();
  58. }
復制代碼
三、演示情況
在手機端需要安裝網絡調試助手,附件里有我在大學時自己做的一個APP,里面包含網絡調試功能。感興趣的可以自己下載安裝,就是界面很丑,有時間再進行好好進行優化。
連接到服務端,該服務端與wifiiot連接的服務端IP和端口一致。
211727v97o5r3o58pd1o0p.jpg
手機數據接收情況,每隔兩秒會接收到wifiiot發送過來的“hello tcp!”信息。
211735a2sxxx3z07fxsosx.jpg
手機端發送123456,wifiiot成功接收到數據,并通過串口打印出來。
211751uy3ml242j8338z1b.png
四、總結
通過公網的TCP中轉服務端,實現兩個不同網絡的設備之間進行遠程數據傳輸,這只是兩個設備之間進行遠程通信的一種方式?,F在不能設置連接wifi和服務端的IP、端口,后面有時間再慢慢進行改進吧。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • wi-fi
    +關注

    關注

    14

    文章

    2238

    瀏覽量

    126530
  • HarmonyOS
    +關注

    關注

    80

    文章

    2084

    瀏覽量

    32246
  • HiSpark
    +關注

    關注

    1

    文章

    156

    瀏覽量

    7329
收藏 人收藏

    評論

    相關推薦
    熱點推薦

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

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

    Wi-Fi 8:開啟極高可靠性 (UHR) 連接的新紀元——1

    。2021年,Wi-Fi 6E 橫空出世,憑借6GHz 頻帶的獨特優勢,使Wi-Fi 正式邁入真三頻 (Real Tri-Band) 共存的通信技術時代。2024年,科學家們再次憑借著4096QAM
    發表于 06-13 11:09

    基于 Wi-Fi 的定位服務

    以下捕獲使用 location_wifi_get 函數請求 Wi-Fi 定位服務。該事件的總功耗為 125.85mC,日志顯示精確度為 30.0m。 Got location: method
    發表于 04-17 15:16

    nRF Cloud Wi-Fi 定位服務

    、Predictive-GPS、Single-Cell、Multi-Cell 和 Wi-Fi 定位。通過利用 nRF Cloud 的優化定位算法,基于 Nordic SoC 和 模組的產品可在定位用例
    發表于 04-17 15:07

    Wi-Fi 定位服務

    Wi-Fi 是一種著名的無線網絡技術,用于設備的局域網和互聯網接入。Wi-Fi 通過 Wi-Fi 網絡為家庭、辦公室和學校等環境提供便捷的無線互聯網接入服務。 Wi-Fi 定位是一種
    發表于 04-17 15:01

    Wi-Fi 7 與頻率控制的關系

    作者:Poornima Apte 投稿人:DigiKey 北美編輯 2024-12-18 Wi-Fi 需要使用一定范圍的無線電頻率才能讓設備進行通信撥號。多年來,Wi-Fi 一直使用 2.4 GHz
    的頭像 發表于 01-25 14:45 ?573次閱讀
    <b class='flag-5'>Wi-Fi</b> 7 與頻率控制的關系

    移遠通信再擴短距離通信模組版圖:Wi-Fi 7/6、Wi-Fi Halow等六款新品助力無線連接升級

    在CES 2025期間,全球領先的物聯網整體解決方案供應商移遠通信對外宣布,將推出六款新型短距離通信模組。該系列模組覆蓋Wi-Fi 6/7、Wi-Fi HaLow、藍牙等多種前沿技術,
    發表于 01-09 11:29 ?363次閱讀
    移遠<b class='flag-5'>通信</b>再擴短距離<b class='flag-5'>通信</b>模組版圖:<b class='flag-5'>Wi-Fi</b> 7/6、<b class='flag-5'>Wi-Fi</b> Halow等六款新品助力無線連接升級

    村田: 遠距、高速、低功耗的Wi-Fi HaLow?通信模塊

    株式會社村田制作所開發了實現1公里以上的遠距離高速數據傳輸并支持Wi-Fi?標準“Wi-Fi HaLow?”的通信模塊“Type 2HK”和“Type 2HL”。本產品配備了使用Arm
    的頭像 發表于 12-19 13:17 ?688次閱讀
    村田: 遠距、高速、低功耗的<b class='flag-5'>Wi-Fi</b> HaLow?<b class='flag-5'>通信</b>模塊

    華為海思正式進入Wi-Fi FEM賽道?

    轉載自——鐘林談芯 昨天在網上看到一份聯UNR050 BE3600無線路由器拆機報告,Wi-Fi主芯片是海思新款Wi-Fi7芯片Hi1155,速率2.5G。 在海思AP Wi-Fi
    發表于 12-11 17:42

    摩爾斯微電子發布Wi-Fi HaLow評估套件,加速物聯網開發

    近日,全球領先的Wi-Fi HaLow解決方案提供商摩爾斯微電子正式推出一款開創性的評估套件——MM6108-EKH05。這款完全整合的開發平臺,旨在推動各行業物聯網解決方案的快速發展
    的頭像 發表于 12-11 13:40 ?618次閱讀

    Wi-Fi 4到Wi-Fi 7:網速飆升40倍的無線革命

    1 Wi-Fi技術的快速發展 每一代新的Wi-Fi協議發布,都會帶來更高的無線速率。 ? 從Wi-Fi 4到Wi-Fi 7:無線網絡技術顯著提升,實現了網速的巨大飛躍。 ? ?
    的頭像 發表于 12-09 10:10 ?921次閱讀
    從<b class='flag-5'>Wi-Fi</b> 4到<b class='flag-5'>Wi-Fi</b> 7:網速飆升40倍的無線革命

    Wi-Fi 7有哪些底層技術優勢

    您在多個Wi-Fi行業活動中代表LitePoint。Wi-Fi 7帶來了哪些新穎且有趣的特點?
    的頭像 發表于 11-15 15:27 ?1174次閱讀

    Wi-Fi 7與Wi-Fi 6E有什么區別

    也許很多人還在考慮是否要將使用的Wi-Fi設備升級到Wi-Fi 6或Wi-Fi 6E,而這些標準的繼任者卻已經開始“登堂入室”了。Wi-Fi 7是新一代
    的頭像 發表于 11-07 11:38 ?3136次閱讀

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

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

    未來的Wi-Fi路由器

    轉載自——鐘林談芯 沒有創新就沒有未來,Wi-Fi路由器也是如此。 進入2024年以后,Wi-Fi路由器市場變得更加艱難,利潤大幅下滑,BOM成本價高于市場價,接不接訂單,都陷入兩難。 國內主芯片
    的頭像 發表于 06-20 15:32 ?731次閱讀
    主站蜘蛛池模板: 免费又爽又黄禁片视频在线播放 | 免费jlzzjlzz在线播放视频 | 天天翘夜夜洗澡天天做 | 日本不卡一区二区三区在线观看 | 欧美宗合网 | 欧美视频在线观在线看 | 寡妇影院首页亚洲图片 | 天天精品视频 | 免费理论片在线观看播放 | 欧美午夜性春猛交bbb | 欧美在线视频7777kkkk | 亚洲1234区乱码 | 久久久久国产一级毛片高清版 | 免费看美女毛片 | 欧美精品色精品一区二区三区 | 日产精品卡二卡三卡四卡无卡乱码 | 免费一级网站 | 一级午夜免费视频 | 国产欧美在线一区二区三区 | 福利色播 | 人人福利 | 日本精品一在线观看视频 | 97色婷婷成人综合在线观看 | 34pao强力打造免费永久视频 | 日本a网站| 日韩黄色录像 | 欧美无遮挡一区二区三区 | 亚洲欧美人成网站综合在线 | 激情文学综合丁香 | 毛片免费高清免费 | 色先锋av资源中文字幕 | 日本黄色一区 | 天堂资源bt种子在线 | 欧美日韩一级视频 | 久久精品视频免费观看 | 天天摸天天做天天爽天天弄 | 男女交性视频免费 | 黑色丝袜美女被网站 | 天天看天天爽天天摸天天添 | 四虎永久影院永久影库 | 国产高清免费 |