日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

W800/W801学习记录网络部分(一):WIFI的扫描和连接

發布時間:2023/12/15 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 W800/W801学习记录网络部分(一):WIFI的扫描和连接 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 前言
  • 一、WIFI掃描
    • 1.函數解析
    • 2.演示
  • 二、連接WIFI
    • 1.函數解析
    • 2.演示
  • 三、進群討論分享!


前言

本文主要在官方DEMO上分析掃描和連接WIFI的步驟和所調用的函數。


一、WIFI掃描

1.函數解析

首先我們來看一下WIFI掃描所調用的函數,如下:

int wifi_scan(void) {tls_wifi_scan_result_cb_register(wifi_scan_handler);tls_wifi_scan();return WM_SUCCESS; }

我們先來看第一個函數tls_wifi_scan_result_cb_register,在注釋中可以知道函數的功能是登記回調函數。其中wifi_scan_handler是另外一個函數的入口,在調用tls_wifi_scan之前必須使用tls_wifi_scan_result_cb_register進行登記。運行完tls_wifi_scan函數后,再運行回調函數(也就是wifi_scan_handler)。

下面來看一下wifi_scan_handler函數,具體解析請看注釋

static void wifi_scan_handler(void) {char *buf = NULL; //緩存指針,用于接收wifi掃描的 “全部” 結果char *buf1 = NULL; //緩存指針,用于從buf復制wifi掃描結果的“單條”wifi信息u32 buflen; //緩存buf的長度int i, j;int err; //錯誤標志u8 ssid[33]; //wifi名稱struct tls_scan_bss_t *wsr; //存放wifi掃描結果的個數和長度指針struct tls_bss_info_t *bss_info; //存放“單條”wifi掃描結果的結構體指針buflen = 2000; //申請內存buf = tls_mem_alloc(buflen);if (!buf){goto end;}buf1 = tls_mem_alloc(300);if(!buf1){goto end;}memset(buf1, 0, 300); err = tls_wifi_get_scan_rslt((u8 *)buf, buflen); //獲取wifi掃描結果if (err){goto end;}wsr = (struct tls_scan_bss_t *)buf; //復制wifi掃描結果的個數和長度,占8個字節bss_info = (struct tls_bss_info_t *)(buf + 8); //復制掃描結果開始處指針(buf的前8字節為個數和長度,已經存放在wsr)printf("\n");for(i = 0; i < wsr->count; i++){j = sprintf(buf1, "bssid:%02X%02X%02X%02X%02X%02X, ", bss_info->bssid[0], bss_info->bssid[1],bss_info->bssid[2], bss_info->bssid[3], bss_info->bssid[4], bss_info->bssid[5]); //路由器MAC地址j += sprintf(buf1 + j, "ch:%d, ", bss_info->channel); //WiFi信道 j += sprintf(buf1 + j, "rssi:%d, ", (signed char)bss_info->rssi); //接收信號強度j += sprintf(buf1 + j, "wps:%d, ", bss_info->wps_support); //是否支持WPSj += sprintf(buf1 + j, "max_rate:%dMbps, ", bss_info->max_data_rate); //最大傳輸速率j += sprintf(buf1 + j, "%s, ", scan_mode_string(bss_info->mode)); //ap類型j += sprintf(buf1 + j, "%s, ", scan_privacy_string(bss_info->privacy)); //加密方式memcpy(ssid, bss_info->ssid, bss_info->ssid_len);ssid[bss_info->ssid_len] = '\0'; j += sprintf(buf1 + j, "%s", ssid); //完成wifi名稱的復制printf("%s\n", buf1); //打印所有信息bss_info ++;}//以下被注釋的地方是官方的代碼,可能會是bug。因為在上面代碼發生錯誤后指針仍為NULL,//會導致申請的內存不能釋放 end:/*if(buf){tls_mem_free(buf);}if(buf1){tls_mem_free(buf1);}*/tls_mem_free(buf);tls_mem_free(buf1); }

2.演示

在user_main()中直接調用wifi_scan()。下載運行后,打開串口接收wifi掃描信息,如下:

二、連接WIFI

1.函數解析

步驟:

  • 斷開原有的連接;
  • 設置協議參數;
  • 登記回調函數;
  • 調用連接函數。
  • //參數 ssid:wifi名稱 // pwd:wifi密碼 int wifi_connect(char *ssid, char *pwd) {struct tls_param_ip *ip_param = NULL; //存在ip地址,掩碼,DNS地址等參數u8 wireless_protocol = 0; //協議標準if (!ssid){return WM_FAILED;}printf("\nssid:%s\n", ssid);printf("password=%s\n", pwd);tls_wifi_disconnect(); //斷開原有連接tls_param_get(TLS_PARAM_ID_WPROTOCOL, (void *) &wireless_protocol, TRUE); //獲取協議參數if (TLS_PARAM_IEEE80211_INFRA != wireless_protocol){tls_wifi_softap_destroy();wireless_protocol = TLS_PARAM_IEEE80211_INFRA;tls_param_set(TLS_PARAM_ID_WPROTOCOL, (void *) &wireless_protocol, FALSE);} //設置infrastructure連接模式tls_wifi_set_oneshot_flag(0); //關閉一鍵連接ip_param = tls_mem_alloc(sizeof(struct tls_param_ip));if (ip_param){tls_param_get(TLS_PARAM_ID_IP, ip_param, FALSE);ip_param->dhcp_enable = TRUE;tls_param_set(TLS_PARAM_ID_IP, ip_param, FALSE);//tls_mem_free(ip_param);}tls_mem_free(ip_param); //開啟DHCP(動態的獲得IP地址、Gateway地址、DNS服務器地址等信息)tls_netif_add_status_event(con_net_status_changed_event); //登記回調函數(當網絡狀態參數,如IP地址、子網掩碼改變時,調用此回調函數)tls_wifi_connect((u8 *)ssid, strlen(ssid), (u8 *)pwd, strlen(pwd)); //連接wifiprintf("\nplease wait connect net......\n");return WM_SUCCESS; }

    然后再看一下網絡狀態改變時,調用的回調函數。

    static void con_net_status_changed_event(u8 status ) {switch(status){case NETIF_WIFI_JOIN_SUCCESS: //連接成功printf("NETIF_WIFI_JOIN_SUCCESS\n");break;case NETIF_WIFI_JOIN_FAILED: //連接失敗printf("NETIF_WIFI_JOIN_FAILED\n");break;case NETIF_WIFI_DISCONNECTED: //斷開wifiprintf("NETIF_WIFI_DISCONNECTED\n");break;case NETIF_IP_NET_UP: //獲得ip地址{struct tls_ethif *tmpethif = tls_netif_get_ethif();print_ipaddr(&tmpethif->ip_addr); #if TLS_CONFIG_IPV6print_ipaddr(&tmpethif->ip6_addr[0]);print_ipaddr(&tmpethif->ip6_addr[1]);print_ipaddr(&tmpethif->ip6_addr[2]); //打印ip地址 #endif}break;default://printf("UNKONWN STATE:%d\n", status);break;} }

    2.演示

    在void UserMain(void)中調用wifi_connect(char *ssid, char *pwd)函數,設置和打開手機熱點。

    void UserMain(void) {printf("\n user main \n");wifi_connect("程序猿Aki", "1234567890"); }

    串口發送如下:

    此時在手機上可以看到連接的設備


    三、進群討論分享!

    如果你喜歡我的文章,歡迎關注下方公眾號,在公眾號內回復“交流群”,進群一起討論分享!

    總結

    以上是生活随笔為你收集整理的W800/W801学习记录网络部分(一):WIFI的扫描和连接的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。