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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

文章目錄

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


前言

本文主要在官方DEMO上分析掃描和連接WIFI的步驟和所調(diào)用的函數(shù)。


一、WIFI掃描

1.函數(shù)解析

首先我們來看一下WIFI掃描所調(diào)用的函數(shù),如下:

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

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

下面來看一下wifi_scan_handler函數(shù),具體解析請(qǐng)看注釋

static void wifi_scan_handler(void) {char *buf = NULL; //緩存指針,用于接收wifi掃描的 “全部” 結(jié)果char *buf1 = NULL; //緩存指針,用于從buf復(fù)制wifi掃描結(jié)果的“單條”wifi信息u32 buflen; //緩存buf的長(zhǎng)度int i, j;int err; //錯(cuò)誤標(biāo)志u8 ssid[33]; //wifi名稱struct tls_scan_bss_t *wsr; //存放wifi掃描結(jié)果的個(gè)數(shù)和長(zhǎng)度指針struct tls_bss_info_t *bss_info; //存放“單條”wifi掃描結(jié)果的結(jié)構(gòu)體指針buflen = 2000; //申請(qǐng)內(nèi)存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掃描結(jié)果if (err){goto end;}wsr = (struct tls_scan_bss_t *)buf; //復(fù)制wifi掃描結(jié)果的個(gè)數(shù)和長(zhǎng)度,占8個(gè)字節(jié)bss_info = (struct tls_bss_info_t *)(buf + 8); //復(fù)制掃描結(jié)果開始處指針(buf的前8字節(jié)為個(gè)數(shù)和長(zhǎng)度,已經(jīng)存放在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); //接收信號(hào)強(qiáng)度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名稱的復(fù)制printf("%s\n", buf1); //打印所有信息bss_info ++;}//以下被注釋的地方是官方的代碼,可能會(huì)是bug。因?yàn)樵谏厦娲a發(fā)生錯(cuò)誤后指針仍為NULL,//會(huì)導(dǎo)致申請(qǐng)的內(nèi)存不能釋放 end:/*if(buf){tls_mem_free(buf);}if(buf1){tls_mem_free(buf1);}*/tls_mem_free(buf);tls_mem_free(buf1); }

2.演示

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

二、連接WIFI

1.函數(shù)解析

步驟:

  • 斷開原有的連接;
  • 設(shè)置協(xié)議參數(shù);
  • 登記回調(diào)函數(shù);
  • 調(diào)用連接函數(shù)。
  • //參數(shù) ssid:wifi名稱 // pwd:wifi密碼 int wifi_connect(char *ssid, char *pwd) {struct tls_param_ip *ip_param = NULL; //存在ip地址,掩碼,DNS地址等參數(shù)u8 wireless_protocol = 0; //協(xié)議標(biāo)準(zhǔn)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); //獲取協(xié)議參數(shù)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);} //設(shè)置infrastructure連接模式tls_wifi_set_oneshot_flag(0); //關(guān)閉一鍵連接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(動(dòng)態(tài)的獲得IP地址、Gateway地址、DNS服務(wù)器地址等信息)tls_netif_add_status_event(con_net_status_changed_event); //登記回調(diào)函數(shù)(當(dāng)網(wǎng)絡(luò)狀態(tài)參數(shù),如IP地址、子網(wǎng)掩碼改變時(shí),調(diào)用此回調(diào)函數(shù))tls_wifi_connect((u8 *)ssid, strlen(ssid), (u8 *)pwd, strlen(pwd)); //連接wifiprintf("\nplease wait connect net......\n");return WM_SUCCESS; }

    然后再看一下網(wǎng)絡(luò)狀態(tài)改變時(shí),調(diào)用的回調(diào)函數(shù)。

    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)中調(diào)用wifi_connect(char *ssid, char *pwd)函數(shù),設(shè)置和打開手機(jī)熱點(diǎn)。

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

    串口發(fā)送如下:

    此時(shí)在手機(jī)上可以看到連接的設(shè)備


    三、進(jìn)群討論分享!

    如果你喜歡我的文章,歡迎關(guān)注下方公眾號(hào),在公眾號(hào)內(nèi)回復(fù)“交流群”,進(jìn)群一起討論分享!

    總結(jié)

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

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。