本帖最后由 aimejia 于 2018-5-31 10:17 编辑
1 Z6 _& P7 L* _# F* j9 s5 K; e3 N n8 I; H# z
作为接入点的第一个任务是使用esp_wifi_set_mode()函数设置ESP32 函数并传递请求,作为接入点,可以把ESP32设置为AP或者APSTA,即
7 Q1 t# C$ ~6 E
# O5 C: X7 _) x9 K/ f4 Yesp_wifi_set_mode(WIFI_MODE_STA)
4 E, I9 `$ }$ g4 ]. e或者9 S( ^5 [2 @ e
esp_wifi_set_mode(WIFI_MODE_APSTA)" P! d4 P% W$ @6 t# B) R4 K6 g8 V
2 w7 B- i, n' E. e8 x+ X: ?& Y接下来我们需要提供配置信息。 我们通过填充wifi_ap_config_t 来做到这一点。' r( V0 x2 I/ W5 Q
" _4 M1 `3 t1 M, ^8 l% g该 wifi_ap_config_t 包含:
! y: X6 N0 `, j+ `. q2 Z0 y3 A& T [/ b. d8 f$ X( W, z; p7 ?
• SSID - WiFi的SSID名称,用于连接站。' Z: @& b1 H7 m
: @& K [$ w- J
• ssid_len - SSID的字节长度,如果不是NULL终止。
- G E' ?' x0 W5 e8 X2 U( g! \0 r( Y5 k+ f. @! l5 v
• 密码 - 用于站验证的密码。3 J6 w+ G$ _6 L6 E
! o; `/ o: c m7 S- \9 | K9 u
• 渠道 - 这个例子中我们使用的网络通道。
7 |# |- k6 j, {3 Q; |- g7 S3 r
# Y3 ~: j' Z! L9 _( z• authmode - 我们如何想站进行身份验证(如果人)。 选择是
4 S6 q( G$ p" t. Q& ?+ D1 m, i7 e; r$ J6 m
◦ OPEN
9 R% d' O! O I5 Z- w: Y' f* N$ D; s, O1 Q8 }# F. S
◦ WEP6 U e& w7 l$ Y8 V
9 Q, d( c, |" b7 O; f1 H ◦ WPA2 R: K1 U( y7 E& g) T9 D; U" |+ B
9 k P& H1 l3 q# v O7 U" |
◦ WPA2
/ X$ E% T8 B" A( L5 _6 W. ?9 `( e8 B$ d. p; x
◦ wpa_wpa2
* X q5 t( \/ e8 @+ f! d2 \" t$ }! e
• ssid_hidden - 我们是否应该广播SSID我们。
& b0 Z0 T- ~" M' q. D/ S8 K3 l$ s0 C+ K: A/ R
• max_connection - 并发站的数量。 默认值和最大值是4。
5 M! J k3 T& p0 P# @2 D& s( u1 L% ~% v* s2 J5 F4 o
• beacon_interval - 未知。 100。
: @1 H. w1 e! X1 @- p. v
8 }3 Z" p O0 V此结构的初始化示例是:
+ x- J$ e5 G# |% X( h3 M \- wifi_config_t apConfig = {9 L3 Y4 V6 s6 L2 U8 n/ V! p
- .ap = {
4 a8 P0 [2 X, S4 W _- i0 v - .ssid="<access point name>",! L6 J& L( Q# c! H1 Z
- .ssid_len=0,
; G4 U3 D8 k5 n! w. a/ [ - .password="<password>",; b$ Y) N2 z6 u# W# F d
- .channel=0,
/ o2 P9 M) _ Q3 X - .authmode=WIFI_AUTH_OPEN,3 z; ~; [; H7 _ R/ z5 z
- .ssid_hidden=0,+ F; W' w8 h; U' x) G
- .max_connection=4,
# ~" ] z/ r1 w8 \- q- P1 ^ - .beacon_interval=100, A7 R/ O# ]/ k# `
- }
# z% ]5 T0 R1 D1 S8 y - };
复制代码 然后,我们调用1 l& A, f+ O/ M3 P
/ p, t0 q" {1 F! q! v0 G; ~
esp_wifi_set_config(WIFI_IF_AP,&apConfig);/ ]$ o4 `! y8 P8 F u1 r. G0 ~& S1 ^
5 F( m) [3 c% Q8 d; W
将参数进行设置,最后调用esp_wifi_start()使WIFI开始工作。0 R8 ]; m# r% k
: y/ @9 p$ }& a; a; t
下面是ESP32作为接入点的相关源码:/ ]& V/ [( H2 w8 @3 ^. x
- #include <string.h>( x& r$ B n& r7 B
- #include "freertos/FreeRTOS.h"3 h2 Y5 c1 }% V* p2 `$ q
- #include "freertos/task.h"
0 M' c. r8 C# P( k) [ - #include "freertos/event_groups.h", @* M; {* T8 l
- #include "esp_system.h"
% z, n) c+ x* B7 ]2 j9 _ - #include "esp_wifi.h"1 U( r2 d' w4 p3 v+ @/ x
- #include "esp_event_loop.h"
7 f) A3 ^# _% Z+ [. x - #include "esp_log.h"5 b; D( B3 q# f* Y8 p
- #include "nvs_flash.h"
. F$ l t1 J- K- q
) O: v' Y$ s1 r5 P9 U- v3 \- #include "driver/gpio.h"
. A( z& {* ^/ e) \/ i* n - #include "esp_types.h". I* D- m7 ^. [% L" Z
- 2 g+ Z1 I7 b7 \; p/ s1 r
- /* FreeRTOS Task Handle -------------------------------------------------------*/0 ]% E5 s! u3 W. `& H
7 }, O9 j1 u2 M0 W1 p2 d$ l- /* FreeRTOS Semaphore Handle --------------------------------------------------*/
) J6 D J" B0 U; R
3 N% O6 M7 f% Z) w# q- /* FreeRTOS event group to signal when we are connected & ready to make a request */4 u: B7 Y9 v) S; [% o; C
7 W0 z: O; E4 ?+ A
3 y1 j- z. f( u, L7 x- static const char *TAG = "example";
5 T! q( r7 P0 I( x" Y0 T b
: |% O; C+ R' \( P
& `( Q3 s7 s Z2 C$ d- //#define LED_GPIO_NUM GPIO_NUM_25- }& D& w- W. U$ b: C, m) B4 U
- #define LED_GPIO_NUM GPIO_NUM_4//LED闪烁接口,为以后通过LED显示连接状态做拓展准备。$ |9 k4 v9 ^" ^. k Q
- ) d. ~ ^. }3 D7 X! T5 }
- 4 |9 n5 h& n3 `' ` S
- #define CONFIG_AP_SSID "ESP32"- j; f5 K: v/ _
- #define CONFIG_AP_PASSWORD "12345678"//配置AP的SSID 和password
% W9 B6 k4 ^$ c" _
' M; P/ ~# @: `- a2 d- uint8_t ApMac[6];//网卡地址 }$ B' p% D6 e
, [* {7 @2 e1 }- /**
/ s! H& M) U6 B - * @brief no . + [; J2 h" z8 w; P
- * @note no.1 Z4 l7 g Y( g A4 T- P, u5 r& k
- * @param no.
2 O* [: W/ M: ^0 V# E/ I - * @retval no.
* [0 O! G5 Z# W$ Z1 ? - */
9 T! \2 g" R) E; S" j+ p# |5 y( \+ _ - esp_err_t event_handler(void *ctx, system_event_t *event)//等待回调事件2 U+ ]+ X% _: ]% A5 W" E, p9 p0 E& d4 r
- {4 w. S$ m, ^3 Z9 Q
- switch (event->event_id)//对事件进行识别
- [$ m9 C0 F8 a; L/ d. I' D - {( y8 {8 W2 [+ L* P6 ]. ~4 y
- case SYSTEM_EVENT_STA_START:
, P; W9 T& ^3 {4 w5 ]- t) X - ESP_LOGI(TAG, "Connecting to AP...");
* C9 S1 j# L8 J - esp_wifi_connect();
9 V4 Z5 y9 p# t2 C+ P- s: a - break;& H" j4 X3 e/ N9 L, d
- * {$ L) U; K2 W
- case SYSTEM_EVENT_STA_GOT_IP:/ C; D# J2 x# O$ A
- ESP_LOGI(TAG, "Connected.");
# K$ W% Y0 l+ v9 w - break;
5 y: E& s6 n' _) l6 h$ T2 F) e - 5 Z; H2 [* t$ v$ o( a2 I& }- `
- case SYSTEM_EVENT_STA_DISCONNECTED:7 H) E- v5 g" x+ R0 S( A0 C5 d
- //ESP_LOGI(TAG, "Wifi disconnected, try to connect again...");) ?5 e9 q/ v. N! m; i9 g& E
- esp_wifi_connect();! O. l2 J& w( b* B
- break;
' Y, P7 X# D% B5 F - ) z4 V/ h% U. Q. e( _" s
- default:
, Z3 w' t7 z6 i' \; M* e/ ]' q - break;
4 _$ T% E: U+ t: x% e - }
/ r$ d& Z; } X+ n9 B- C" g6 s: v - ) g, m9 ^- Q+ F- P+ |
- return ESP_OK;( @( q+ \) {+ \0 ?1 X& B+ d
- }. ~$ I" I; y5 Z; Y2 A/ [0 R7 F
- H/ }) e6 v1 M y- /**
# L3 X @4 D* z' G: k - * @brief no . " z9 v; K6 f3 M2 |7 D" o2 [: D- D5 g6 \
- * @note no.- K( e( R% @) O( ?) i/ y
- * @param no.
6 R4 b/ `9 _/ Z- g" l! y - * @retval no.
0 K* g1 h9 e6 h. A& L$ V. U5 M - */: i6 D% W; t3 ] X$ J" E7 O; P
- void led_init( void )
) P* o# L% w4 J8 a' y - {, \0 B6 B5 `5 M
- gpio_set_direction( LED_GPIO_NUM , GPIO_MODE_OUTPUT );0 E7 ~- _9 t) c* W7 V( j# a# v2 [
- }
! C K5 C; c& H( Y6 F( I: }) g - 5 {( o& P7 ~# Q* e) i: l
- /**7 @1 ]0 [0 V7 }; G3 L. S1 }
- * @brief no . ; j. [: L( `7 j# B& |& l0 H# i
- * @note no.
7 m( _9 u& {* F- K* ?4 ~ - * @param no.+ T# c: L; L/ ^4 k; {
- * @retval no.2 p- a; i2 w: { i
- */; H2 M8 g+ L" Z3 W Q
- void led_task( void *pvParameters ) O2 `2 M0 `: @. x0 U/ ]
- {
8 y. o& q$ `* ^4 C7 o& ]+ ~. [ - int level = 0;# s$ c" Y+ r8 e3 J4 R( W6 u
-
" J9 k+ x& ~5 f - for( ;; )( @& }" V$ B( V- g
- {( ?) D [) D. j8 O$ N! y
- gpio_set_level( LED_GPIO_NUM , level);9 Q% }% U: K1 |1 Y' f8 A
- level = !level;
$ r8 m' j* r2 R" O+ N" A - vTaskDelay(300 / portTICK_PERIOD_MS);1 H$ C. E# V0 A9 @ F
- }
! l: ?0 U4 k, n1 u7 b/ ] - }- Y: q/ s& Q8 r* Z% A" h: [
- 3 L+ w$ r( G- e2 K; `" Q, C/ E
- void app_main(void)
/ r5 V0 r8 u4 s# ]6 S - {
5 P) L# Y- M( {& _5 O - nvs_flash_init();//初始化NVS内存
) W$ N3 c- W- h7 a8 H& s! q - led_init();) `: w- y. j) v1 w" P
- tcpip_adapter_init();//tcp/IP配置
6 u% q% _! G1 o1 y# ? - ESP_ERROR_CHECK( esp_event_loop_init(event_handler, NULL) );//回调,当ESP32检测到某些类型的WiFi相关事件时调用。
6 W9 l: _$ p q/ O- W- ]! } - wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();//定义一个名为cfg的wifi_init_config_t结构体。wifi_init_config_t中的参数可由menuconfig配置, G7 [0 d2 V D8 k! [
- ESP_ERROR_CHECK( esp_wifi_init(&cfg) );! }) B( m! d6 d# s3 {3 U2 t
- ESP_ERROR_CHECK( esp_wifi_set_storage(WIFI_STORAGE_RAM) );//指示ESP32将这些设置记录到闪存
% g7 q5 B! i* ~3 U5 G! X. @ - ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_AP) );//模式设置为AP/ Y1 ?, s& @9 H- }) O4 Y; n) Y1 v
- 4 a2 ^0 j/ P( g4 s+ X- ]$ V& ^
- esp_wifi_get_mac( ESP_IF_WIFI_AP , ApMac );//获取DHCP分配的IP接口的mac。1 v! i7 ?+ ]% S
-
6 X) h" ?/ h( K9 r$ u - wifi_config_t ap_config = {
' K" {) n8 D, p - .ap = {
% i/ c$ r; t" L# I - // .ssid = ssid,9 E9 l3 l7 Z0 t+ T, z
- .password = CONFIG_AP_PASSWORD,6 q) Z2 A* X' R5 l
- .ssid_len = 0,7 A$ D# H0 K6 u
- .max_connection = 4,
8 l0 o* k0 B! X3 {/ p/ i - .authmode = WIFI_AUTH_WPA_PSK4 c' v% x( k9 }% Y7 R" @
- }+ l, w. v4 w: a5 g
- };//ap接入点参数配置。3 K( g$ i: m1 Y m6 m" W( k: {$ S
- g0 G5 H) _' W" [6 T9 ^
- sprintf( (char *)ap_config.ap.ssid , "%s_%02X%02X" , CONFIG_AP_SSID , ApMac[4] , ApMac[5] );
% ~! Y8 Q0 L! O! u8 e: g
# I. Q8 `4 J/ Y, \' {! R- esp_err_t tmp = esp_wifi_set_config(WIFI_IF_AP, &ap_config);+ g: e4 }/ J* r/ W; O: W! w
- ESP_ERROR_CHECK(esp_wifi_start());2 n, x8 P) q+ U4 T
- esp_wifi_connect();
) l( e, V/ r3 _( c! o! a. c2 ~ - 6 }/ H. b, W/ x, _2 o" a! ]' B) W
- xTaskCreate( &led_task, "led task", 512, NULL, 3, NULL );
+ O& ]: N" n: r1 T3 H5 C - 8 \' \3 d. f5 Z; p! |7 I' t+ x& w
- }
复制代码 实验现象:
9 m2 K' a0 \# y5 u" w( O# B4 E) x5 D( a1 Y
打开minicom可以看到输出:
% C/ J( j! |$ D
8 x9 L( d9 Q6 x4 ?8 }- N6 U+ e' s; }( p( \6 V
打开手机WIFI,可以看到名为ESP32_44F1的WIFI热点,打开热点,输入设置的PASSWORD:12345678即可连接成功,说明AP接口设置. k- D7 F i, I. n: n, a
+ h8 |1 z# _& n
# Z2 d, M4 Z, ^# r! z5 v
编程讲解:
. v1 _+ t; O# l5 {7 e! U8 O! n* q* F0 _- Q
使用连接站
2 q& E2 W% P1 |
1 S$ O& ]+ {, X3 I/ f/ ^9 ]当我们的ESP32是接入点时,我们说我们希望允许电台( p. E6 W$ v- o/ U; c8 Y
7 V y" {+ I4 z6 n0 i- i
合作 nnect它。 这带来了管理这些电台的故事。 常见的事情2 u6 x( @$ O) d7 `! a
% X) w! L+ }+ P7 l
我们可能想做的是:1 F! A6 C5 T, w7 a+ z8 z3 [
* [# ~2 @9 F, A2 |4 k, K8 Q6 V* D• 确定新车站何时连接/ A8 I& z7 s* V& }/ V5 k
) I- F+ X- w5 B8 a5 J- D• 确定以前连接的电台何时离开
, s; o4 B( R: x3 X# J0 P. ~4 Z' q' x. A. y; H& R9 L" F0 J
• 列出当前连接的电台" p" M6 {6 v+ I0 ]8 V& {
! }& B2 T5 w2 ]& R• 断开ÒNE 或多个当前连接的站! M- i5 ?! r2 y8 D8 k; r. S
O% \( [# N" s6 \% r2 Q
我们可以注册一个事件处理程序来检测新站连接和与现有站断开。 当我们成为接入点时,会产生ESP32 WiFi事件SYSTEM_EVENT_AP_START。当一个站连接时,ESP32西港岛线提高 SYSTEM_EVENT_AP_STACONNECTED事件。 当一个站断开,我们将看到 SYSTEM_EVENT_AP_DISCONNECTED事件。: i6 j8 l( c7 v5 }9 U
! |0 }/ j& }3 v4 X0 U9 x$ ^我们可以使esp_wifi_get_station_list()函数获取当前连接的电台,函数返回站的链表。 这个列表的存储被分配给我们,我们应该调用 esp_wifi_free_station_list()释放它当我们不再存在需要它时 。5 P2 C1 n1 ^/ g& q4 n% _0 s( m
, |* e" b3 S. G/ k7 G" \+ f
从ESP32中,我们可以判断很多为static项,比如当前连接数通过调用 wifi_softap_get_station_num()。 如果我们想找到那些站的细节,我们可以调用 wifi_softap_get_station_info(),它将返回链接列表wifi_sta_list_t,所以 我们必须调用wifi_softap_free_station_info()明确地释放此调用与分配的存储。5 ?3 O/ z4 V% [+ l
) R [! Q# K2 Z1 {0 h! j以下是一个代码段的示例,其中列出了连接站的详细信息:% d5 k; l/ b' B$ D- l; U: w
- uint8 stationCount = wifi_softap_get_station_num();0 c2 [( F; G& T: N7 r6 F
- os_printf("stationCount = %d\n", stationCount);" w- m- c. R9 i2 ?7 K. T* r
- wifi_sta_list_t *stationInfo = wifi_softap_get_station_info();
+ Z4 p6 k" i0 x3 M' r- x - if (stationInfo != NULL) {
6 Q$ S/ [+ Q- [" f4 K - while (stationInfo != NULL) {+ D( n2 y' y7 |( [9 M
- os_printf("Station IP: %d.%d.%d.%d\n", IP2STR(&(stationInfo->ip)));. P' K* s/ l- O! r4 n* }
- stationInfo = STAILQ_NEXT(stationInfo, next);, b; P$ ?( \3 b5 C7 ?
- }0 Y+ I8 j7 l" @2 b/ y8 p2 Z
- wifi_softap_free_station_info();
7 D0 h$ R% G0 |; D - }
复制代码 如果由于某种原因,我们环境中的程序想强制断开当前的连接的station,我们可以使用 esp_wifi_kick_station()来断开。
4 x% m' j: S5 K0 S+ `
5 o- _7 B9 J: n* Z0 BWiFi在启动时) F& q7 \3 S; J% x4 @' g7 u
* T- a4 A: b2 O8 y4 S
ESP32可以将WiFi启动信息存储在闪存中。 这允许它在启动时执行其功能,而无需向用户询问任何特殊的或附加信息。这种能力由函数esp_wifi_set_auto connect()和esp_wifi_get_auto_connect()完成。它们被用来自动连接的设置值和读取保存在闪存中的值,设置赋值的函数为esp_wifi_set_config(),存储方法通过esp_wifi_set_storage()来设置WiFi API配置存储类型。% v, p5 k& v7 |2 l, s, n
! p& v) M; _* a6 ~' |3 p2 u首先讲解DHCP前需要了解什么是DHCP,DHCP即动态主机配置协议,它的作用是集中分配IP地址给主机,使网络环境中的主机可以动态的获得IP地址.如果想详细了解,可以看如下链接' n0 V/ I. ~+ v4 n
& p! C$ e d+ \. khttp://baike.baidu.com/item/DHCP/218195?fr=aladdin
j" ]5 V, H% C& h! q/ V; @5 P
: K' o# }2 i' q# j* M& i本文这里重点讲解其在ESP32中的应用和配置。
# r$ E( s, S9 Z8 ^" L& I
7 e1 u8 Q9 j* O' W& Z, {3 lDHCP客户端) Q) T- T% z0 w* }
; o/ w/ |5 g, t0 W) p9 Y6 M5 D当ESP32作为站点连接到接入点时,它还运行DHCP客户端连接到它在接入点的DHCP服务器。 在那里,站点提供其IP地址,网关地址和网络掩码, 我们可以这样做:调用 tcpip_adapter_set_ip_info()在程序编写时。 * M% @6 \, K1 `) L4 i0 z6 w
$ X$ W$ q- J" k1 m! w B* b
函数逻辑如下+ _# U H% H: K, t7 i/ A5 @
- tcpip_adapter_init();- R7 C9 U% J. r5 ^& s5 `; x1 T
- tcpip_adapter_dhcpc_stop();
6 r r0 d& }3 \7 g - tcpip_adapter_set_ip_info();+ E, g; M2 m6 \! z% z% D
- esp_wifi_init();9 T' D! m8 U' S0 C v
- esp_wifi_set_mode();
, V! ~: }) ?- c8 n1 I - esp_wifi_set_config();
( u5 f, Y& f9 @: m, U - esp_wifi_start();; G! J$ v; ~( h/ u: r! g
- esp_wifi_config();
复制代码 但是当我们想为这些数据设置我们自己的值时。调用的tcpip_adapter_set_ip_info()时需要的参数可以按如下方法设置( P% _. U2 x+ Q/ p4 A
tcpip_adapter_ip_info_t ipInfo;
, H; B3 @- M8 Y0 ]+ BIP4_ADDR(&ipInfo.ip, 192,168,1,99);0 z3 i. F+ \! K' z# S- {
IP4_ADDR(&ipInfo.gw, 192,168,1,1);
0 V, I9 D, r5 r/ _IP4_ADDR(&ipInfo.netmask, 255,255,255,0);! \) N& _% e. q; c
tcpip_adapter_set_ip_info(TCPIP_ADAPTER_IF_STA, &ipInfo);
$ Y4 C) k" b+ O, l1 ]
3 E( l; w2 U$ x或者用字符串表示
/ k" T% W5 U) h; ~0 E/ {! s6 G1 f: E* y! p' s6 |& y% }
tcpip_adapter_ip_info_t ipInfo;9 W- H% L, c6 T |
inet_pton(AF_INET,“192.168.1.99”,&ipInfo.ip);4 `9 @' E2 q& W; ~2 _( k
inet_pton(AF_INET,“192.168.1.1”,&ipInfo.gw);' e3 @5 S9 y, A3 w+ c1 G
inet_pton(AF_INET,“255.255.255.0”,&ipInfo.netmask);
) p& {) T* u4 j: Htcpip_adapter_set_ip_info(TCPIP_ADAPTER_IF_STA,&ipInfo);
/ f* C2 s9 h2 g" G
& C. e0 `6 C% b- j% c( p5 B" yDHCP服务器# t8 H) z: X1 s, S" b) i9 E9 w. A
! X$ A2 A2 A3 }当ESP32作为接入点时,可能需要它作为DHCP服务器,以便连接站将能够自然而然的分配IP地址,并获得他们的子网掩码和网关。DHCP服务器可以启动和使用API调用设备中停止wifi_softap_dhcps_start() 和 wifi_softap_dhcps_stop(),当前DHCP服务器的状态(启动或停止),可以通过调用5 q9 v+ K2 h3 I F- P f: n
" G1 J% W0 B E; r" n4 u& V G8 gwifi_softap_dhcps_status()查看。
+ K( |6 d. h- H3 J+ J9 i( i' W
9 F% C- I2 Q8 ?由DHCP服务器提供的IP地址的默认范围是192.168.4.1向上。第一个地址成为分配给ESP32本身。我们需要注意的是它的地址和我们工作的LAN范围是不一样。即他形成了自己的网络地址空间,它们也许是一相同种类的网络IP(192.168.XX)出现的。当我们连接到它时,我们可以在PC上PING到它。
: d; G+ r3 f$ O, d. Y4 g: o3 ~' c$ O; v# ]
当前的IP地址,子网掩码和网关* c m6 T$ t# t! u8 q$ I8 d
J5 v1 H. F# d& ?) d- h当我们需要知道,当前环境中我们的ESP32中的IP地址,子网掩码和网关时,我们已经知道这些值是由DHCP服务器设置的,我们可以调用tcpip_adapter_get_ip_info()得到这些值,因为,由于ESP32可以有两个IP接口(一个用于接入点和一个用于站),我们需要通过参数使程序知道我们想要检索的接口。
3 n& i# p" c! O7 j( u+ a. l A' l3 b" K% B
WiFi保护设置 - WPS(定义)2 [6 d( s( N5 {
. |: J) r& S3 P: L7 Y该ESP32支持在站模式下的WiFi保护设置,这意味着,如果接入点支持,ESP32可以连接到接入点不呈现出密码。目前支持的只有“按钮模式”实现。利用这种机制,一个物理按钮被按下接入点,并且,对于一个周期的两分钟,在范围内的任何站可以使用加入网络WPS协议。官方给出了一个实际的应用例子是,当我们按下WPS的按键后,ESP32将调用wifi_wps_enable()和wifi_wps_start(),ESP32即可成功的连入计入端。
$ }! T( n( X, r3 W% ]5 s% `/ ]* `4 ~* X& n7 f, Y
" L ~3 \3 H& O
/ x; Y" a; c- d$ f- f( d8 A* v7 u6 ^9 q/ n
转载自noticeable
2 q$ S3 b6 J5 B) b* d7 ^
+ y8 ]7 C V. F$ W* K- b |