【HarmonyOS HiSpark Wi-Fi IoT 套件试用连载】wifi-iot板连接家庭wifi并实现tcp通讯

描述

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

1,首先要获得hisi3861芯片的wifi开发的相关接口和文档:https://bbs.elecfans.com/jishu_2028821_1_1.html
这里就有相关的资料
2.liteos_m文档库里面也有好多资料,在doc文件夹里
3.首先需要连接wifi,可以参考文档:Hi3861V100/Hi3861LV100 Wi-Fi软件 开发指南.pdf
4.找到sta模式,里面讲的很清楚,基于实际需求,把流程进行简化:
STA功能开发的典型流程:
步骤1 调用hi_wifi_sta_start,启动STA。
步骤2 调用hi_wifi_sta_scan,hi_wifi_sta_scan_results,获取扫描结果。
步骤3 根据接入网络需求,自定义筛选扫描结果,调用hi_wifi_sta_connect,进行连接。
步骤4 调用hi_wifi_sta_get_connect_info,查询Wi-Fi连接状态。
步骤5 连接成功后,调用netifapi_dhcp_start,启动DHCP客户端,获取IP地址。
步骤6 调用hi_wifi_sta_disconnect ,离开当前连接的网络。
步骤7 调用netifapi_dhcps_stop,停止DHCP客户端。
步骤8 调用hi_wifi_sta_stop ,关闭STA。
----结束,注意5,6,7步骤不是必须的
5.在连接成功的毁掉开启dhcp获取ip地址之后并不会立马得到ip地址,所以我们开启一个线程不停得在等待拿到ip地址:
  1. case HI_WIFI_EVT_CONNECTED:
  2.                 printf("WiFi: Connectedn");
  3.  
  4.                 printf("connected info: %s %sn", hisi_event->info.wifi_connected.ssid, hisi_event->info.wifi_connected.ifname);
  5.                 netifapi_dhcp_start(g_lwip_netif);
  6.                 {
  7.  
  8.                         osThreadAttr_t attr;
  9.  
  10.                         attr.name = "netTask";
  11.                         attr.attr_bits = 0U;
  12.                         attr.cb_mem = NULL;
  13.                         attr.cb_size = 0U;
  14.                         attr.stack_mem = NULL;
  15.                         attr.stack_size = 2048;
  16.                         attr.priority = 24;
  17.  
  18.                         if (osThreadNew((osThreadFunc_t)netTask, NULL, &attr) == NULL)
  19.                         {
  20.                                 printf("[LedExample] Falied to create LedTask!n");
  21.                         }
  22.                 }
  23.  
  24.                 break;
复制代码
  1.  
  2. static void *netTask(const char *arg)
  3. {
  4.  
  5.         printf("netTask:%pn", arg);
  6.  
  7.         u8_t ip_arr[4] = {0};
  8.         u8_t ip_zero[4] = {0};
  9.         // 下面这种方式也可以打印 IP、网关、子网掩码信息
  10.         ip4_addr_t ip = {0};
  11.         ip4_addr_t netmask = {0};
  12.         ip4_addr_t gw = {0};
  13.  
  14.         int ret = 0;
  15.  
  16.         do
  17.         {
  18.                 sleep(1);
  19.                 ret = netifapi_netif_get_addr(g_lwip_netif, &ip, &netmask, &gw);
  20.                 printf("netifapi_netif_get_addr: %drn", ret);
  21.                 if (ret == ERR_OK)
  22.                 {
  23.                         printf("ip = %srn", ip4addr_ntoa(&ip));
  24.                         printf("netmask = %srn", ip4addr_ntoa(&netmask));
  25.                         printf("gw = %srn", ip4addr_ntoa(&gw));
  26.  
  27.                         memcpy(ip_arr, &ip.addr, sizeof(ip_arr));
  28.                 }
  29.  
  30.         } while (memcmp(ip_arr, ip_zero, sizeof(ip_arr)) == 0 || (ip_arr[0] != 192));
  31.  
  32.         printf("got ip :%d.%d.%d.%dn", ip_arr[0], ip_arr[1], ip_arr[2], ip_arr[3]);
  33.  
  34.         sample_tcp_client();
  35.  
  36.         return NULL;
  37. }
复制代码
拿到ip地址之后我们的wifi才能段真正连接成功
6.之后就开启tcp客户端,相关代码 在demo_app里有,在文档:Hi3861V100/Hi3861LV100 lwIP 开发指南.pdf 里面也有,直接拷贝使用:
  1.  
  2. int sample_tcp_client(void)
  3. {
  4.         s32_t sfd = -1;
  5.         struct sockaddr_in srv_addr = {0};
  6.         //        struct sockaddr_in cln_addr = {0};
  7.         //        socklen_t cln_addr_len = sizeof(cln_addr);
  8.         s32_t ret = 0, i = 0;
  9.         /* tcp client connection */
  10.         printf("going to call socketn");
  11.         sfd = socket(AF_INET, SOCK_STREAM, 0);
  12.         if (sfd == -1)
  13.         {
  14.                 printf("socket failed, return is %dn", sfd);
  15.                 goto FAILURE;
  16.         }
  17.         printf("socket succeeded, sfd %dn", sfd);
  18.         srv_addr.sin_family = AF_INET;
  19.         srv_addr.sin_addr.s_addr = inet_addr(PEER_IP);
  20.         srv_addr.sin_port = htons(PEER_PORT);
  21.         printf("going to call connectn");
  22.         ret = connect(sfd, (struct sockaddr *)&srv_addr, sizeof(srv_addr));
  23.         if (ret != 0)
  24.         {
  25.                 printf("connect failed, return is %dn", ret);
  26.                 goto FAILURE;
  27.         }
  28.         printf("connec succeeded, return is %dn", ret);
  29.         /* tcp client connection */
  30.         /* send */
  31.         memset(g_buf, 0, BUF_SIZE);
  32.         strcpy((char *)g_buf, MSG);
  33.         printf("calling send...n");
  34.         ret = send(sfd, g_buf, sizeof(MSG), 0);
  35.         if (ret <= 0)
  36.         {
  37.                 printf("send failed, return is %d,i is %dn", ret, i);
  38.                 goto FAILURE;
  39.         }
  40.         printf("send finished ret is %dn", ret);
  41.         /* send */
  42.         /* recv */
  43.         memset(g_buf, 0, BUF_SIZE);
  44.         printf("going to call recvn");
  45.         ret = recv(sfd, g_buf, sizeof(g_buf), 0);
  46.         if (ret <= 0)
  47.         {
  48.                 printf("recv failed, return is %dn", ret);
  49.                 goto FAILURE;
  50.         }
  51.         printf("recv succeeded, return is %dn", ret);
  52.         printf("received msg is : %sn", g_buf);
  53.         /* recv */
  54.         lwip_close(sfd);
  55.         return 0;
  56. FAILURE:
  57.         lwip_close(sfd);
  58.         // printf("errno is %dn", errno);
  59.         return -1;
  60. }
  61.  
复制代码
7.在电脑上用一个tcp工具,开启一个tcp的服务器,如图:
HiSpark
8.把开发板上电,程序下载进去,经过调试之后,正常就应该会连到电脑上的tcp服务器,然后并自动发送14个字节的数据,如图:
HiSpark
9.在电脑tcp服务器回复对应数据,可以在开发板终端上看到对应的数据,到此,本阶段实验结束,为后面的实验做铺垫.
HiSpark
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分