W800/W801学习记录网络部分(一):WIFI的扫描和连接
文章目錄
- 前言
- 一、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ù)解析
步驟:
然后再看一下網(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ⊱静心抄经,是对抗这个浮躁社会的最好武器
- 下一篇: 汇编-5