W800/W801学习记录网络部分(一):WIFI的扫描和连接
生活随笔
收集整理的這篇文章主要介紹了
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.函數解析
步驟:
然后再看一下網絡狀態改變時,調用的回調函數。
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的扫描和连接的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ⊱静心抄经,是对抗这个浮躁社会的最好武器
- 下一篇: 汇编-5