你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

ESP32作为接入点AP

[复制链接]
aimejia 发布时间:2018-5-31 10:16
本帖最后由 aimejia 于 2018-5-31 10:17 编辑
# A, Y2 C: E& z1 J/ @) y" J# L# f
& [  G6 Z  P) b) A6 z$ O& L' O- }作为接入点的第一个任务是使用esp_wifi_set_mode()函数设置ESP32 函数并传递请求,作为接入点,可以把ESP32设置为AP或者APSTA,即
1 E. W  e; ~* E2 n- d* J" q/ ^$ ?7 |8 s
esp_wifi_set_mode(WIFI_MODE_STA)
7 ~" S# \, ?" U或者/ g( h  }# Q# z, Q. ]1 Z
esp_wifi_set_mode(WIFI_MODE_APSTA)
8 M/ w; d# u. c; X
3 {7 T9 l3 D; r, g5 I: B接下来我们需要提供配置信息。 我们通过填充wifi_ap_config_t 来做到这一点。3 J$ W1 Q2 @! o# X5 e9 s0 L. I' b) _
6 s5 v0 v, i5 I- h2 x2 ^
该 wifi_ap_config_t 包含:1 j2 G* G! U. }6 L0 ]% B

, [. l5 |- m/ A- v7 u+ l8 n•    SSID - WiFi的SSID名称,用于连接站。
1 Y6 z! J& e: t4 [% q' [/ u/ J6 _7 l* a# h" E: t- t
•    ssid_len - SSID的字节长度,如果不是NULL终止。  U: K; U  M$ T) d) A! d3 h

, z/ r7 G# N' [7 v3 v•    密码 - 用于站验证的密码。& B+ z8 c6 P4 V0 K
; x8 @  j( I* x' j) b
•    渠道 - 这个例子中我们使用的网络通道。
: G  B( x7 C* W, K
  S* `/ C5 ]. v" w% Z•    authmode - 我们如何想站进行身份验证(如果人)。 选择是
! r) _' v& i  b; X$ ^7 U# W
& {: N: |$ d; O  ◦       OPEN; @+ z+ I3 b& D6 ~; v! ~4 a
8 S7 ^* K' h, Z3 n0 l- ~9 R+ _
  ◦       WEP
* {) d# x) [# K6 g; P1 z4 {# [1 |
0 w+ r" s& O# h  c9 c  ◦       WPA  o# I) k0 a4 A& W7 }, }
" W* Z4 T, E1 B+ b  R
  ◦       WPA28 s* N' N9 ~3 [0 D2 w& r5 F
) P" }+ ^$ z5 t
  ◦       wpa_wpa2* F9 @1 d. {1 p& p, Q- H" A
- H3 F* P( t. j# a5 h. O8 ]( s
•      ssid_hidden - 我们是否应该广播SSID我们。6 u, P6 x7 t" h2 |7 y! N% k0 t3 k4 _

6 D6 u6 B8 R3 v! W' S7 i•      max_connection - 并发站的数量。 默认值和最大值是4。
0 R4 L/ [/ O8 G, _1 i" n' h3 T7 f) O
•      beacon_interval - 未知。 100。
/ u/ S& d5 x% P0 n* P/ [
& d( C$ X' }! q( {  s此结构的初始化示例是:
9 k/ x/ p. J5 I
  1. wifi_config_t apConfig = {
    $ r2 H6 i% ?+ ^1 j
  2.    .ap = {
    & l/ T$ ?6 H- W" l# R0 s
  3.       .ssid="<access point name>",4 D4 v9 \: @" q2 O: P; U3 B
  4.       .ssid_len=0,
      K3 s5 N( o  X: \: f3 w+ C
  5.       .password="<password>",
    , j2 S# ~3 b/ U4 p+ _  }
  6.       .channel=0,
    , g' B% @8 f9 x% ^
  7.       .authmode=WIFI_AUTH_OPEN,! \, u. M4 s9 T* H! i5 E8 W
  8.       .ssid_hidden=0,
    - l/ q$ T9 W/ O3 D" o. }0 |1 \( m& \; L
  9.       .max_connection=4," a6 l- O8 b  R
  10.       .beacon_interval=100- o+ |0 o" a) \- @
  11.    }/ {* [& s$ y5 i
  12. };
复制代码
然后,我们调用' q+ I# `" x3 U0 C9 ]

7 q2 x4 M" V- M: I/ Z  Gesp_wifi_set_config(WIFI_IF_AP,&apConfig);
8 Y+ r# h# `8 e. M' K# @
2 e/ C0 J0 ]& b将参数进行设置,最后调用esp_wifi_start()使WIFI开始工作。/ O0 Z4 g6 f2 a5 Q: z
3 r5 g! A/ u! r3 o1 ~
下面是ESP32作为接入点的相关源码:" B  B- c3 W; |" l# J% P
  1. #include <string.h>
    $ F, d) M( ^0 m( F* |' w  \
  2. #include "freertos/FreeRTOS.h"
      u  h: |% J. T- {! [7 L
  3. #include "freertos/task.h"4 o0 F3 y- Q8 M
  4. #include "freertos/event_groups.h"2 g; Q, J) {+ f
  5. #include "esp_system.h"
      `( b5 }6 I2 m1 K" T3 ~
  6. #include "esp_wifi.h"
    . [0 M2 _/ F0 d/ o9 J! t/ b# ?
  7. #include "esp_event_loop.h"% G' M4 W& [" H9 Y  \1 ^5 a
  8. #include "esp_log.h"6 Z) G% s: j# x( U
  9. #include "nvs_flash.h": }2 D$ x- b9 o( }4 ]% P) y! w2 R: V5 M% Y
  10. $ K, l  \, H9 y
  11. #include "driver/gpio.h"& M3 R3 S/ H" e" ~1 V
  12. #include "esp_types.h"+ @7 W; ]6 {& _7 {1 F
  13. 7 r+ u4 D) m( H& v/ t* g8 f3 R+ O) a  w: ~
  14. /* FreeRTOS Task Handle -------------------------------------------------------*/
    5 J* [; V" h* d- I1 M
  15. " x6 L2 b) V& X, o
  16. /* FreeRTOS Semaphore Handle --------------------------------------------------*/: m' r. K% s% O( H& T( h& q
  17. % {% F' i* P  U1 N6 f8 s% b
  18. /* FreeRTOS event group to signal when we are connected & ready to make a request */
    ' H/ g  a0 z8 H7 q

  19. / A. `- f- b# {! s! s
  20. 4 {2 n- c) m' k% O* X4 f
  21. static const char *TAG = "example";
    - s0 d2 l: V4 T/ m, ]

  22. 3 R+ }% O! ~5 f! O4 j, O

  23. : ~  ?: x; u8 `
  24. //#define     LED_GPIO_NUM    GPIO_NUM_258 }/ O  l- N# e. @. Z8 f0 a6 j8 Q
  25. #define     LED_GPIO_NUM    GPIO_NUM_4//LED闪烁接口,为以后通过LED显示连接状态做拓展准备。
    . u+ e7 P# u' y8 }, ?. ~7 u8 x
  26. 8 Z; b" `2 u: n- h

  27. % _" R& K' ?7 |! Q' P% i4 a- t
  28. #define CONFIG_AP_SSID    "ESP32"7 O7 a2 R* o  Z( T$ `' T0 t: B1 p
  29. #define CONFIG_AP_PASSWORD    "12345678"//配置AP的SSID 和password
    " [6 p  l' y; \) a

  30. : |; n% V+ k# o
  31. uint8_t ApMac[6];//网卡地址
    ) c) P7 A. H! a" t, l6 G/ ], g

  32. : E, E# ?; ]. E% R0 v: C( {' Q
  33. /**7 ~+ v6 b+ d( W" ^' G9 S+ X; H
  34.     * @brief  no .    ) c0 W7 o4 Y3 H- U$ `% R, d; k
  35.     * @note   no.- G  @( ]( ^  g0 g9 y( p; Z
  36.     * @param  no.% _; M0 E. W" E& ^* U" w
  37.     * @retval no.
    0 Z: W3 R  d! b4 V( ~0 M
  38.     */; v7 y3 v: F+ H1 Q( x
  39. esp_err_t event_handler(void *ctx, system_event_t *event)//等待回调事件4 P: D2 @$ a2 _/ g7 P. Y8 Y
  40. {0 F" S) s, L3 L
  41.     switch (event->event_id)//对事件进行识别
    ; T( B8 ]8 f) E+ b0 q
  42.     {
    4 N. K( ?* C2 o) S
  43.     case SYSTEM_EVENT_STA_START:$ S$ ?) k( ?! |5 I+ k3 A3 I0 }
  44.         ESP_LOGI(TAG, "Connecting to AP...");
    ) r; Z' M6 a0 |$ c4 [
  45.         esp_wifi_connect();
    ; L1 M; g$ @+ t3 O/ G/ R
  46.         break;
    6 x8 V' Z: s1 f' q/ x2 c: \7 J* O

  47. % s* E5 ?( [' q# p$ P9 g1 g
  48.     case SYSTEM_EVENT_STA_GOT_IP:
      I! j8 [4 x# h/ l% J
  49.         ESP_LOGI(TAG, "Connected.");
    6 N. M1 J: L( e, [5 d7 R
  50.         break;
    ' n6 Y% k' R! I5 u: m: `
  51. + J* j; j+ o  s! e
  52.     case SYSTEM_EVENT_STA_DISCONNECTED:6 a+ Z8 t7 M3 K" N( @- m
  53.         //ESP_LOGI(TAG, "Wifi disconnected, try to connect again...");* c% Z: k2 `( O: f! n
  54.         esp_wifi_connect();
    2 k* {. @. r$ \% A1 V( z7 _4 g) n
  55.         break;( x, H( ]8 ^+ D
  56. ( l6 [- ?5 t( c* l+ B
  57.     default:
    9 `9 e7 c# M$ q+ `5 h
  58.         break;4 s1 Y9 _7 w' D$ s9 U
  59.     }  I7 `. i4 V3 i: u5 J+ U4 F) |
  60.     8 f) Z3 Y) n5 q9 [* a. H/ K- m% }( |, I
  61.     return ESP_OK;5 x) E/ k9 ]& O" b0 l; ^) |
  62. }  l7 M) h( k1 d5 g5 E" m
  63. ! a- q4 [; \, Y' e) u
  64. /**/ y* {/ E+ ]* v+ `  D! L* ]
  65.     * @brief  no .   
    % j0 t; E* r# X% I; Y1 ]
  66.     * @note   no.
    1 X  a' n0 N! }4 E1 r, \
  67.     * @param  no.
    6 o  \- \  }* \1 a, y5 A9 o
  68.     * @retval no./ {- s1 `3 q! c8 B& P
  69.     */# t* ?  _* E- D% J3 |% ~
  70. void led_init( void )
    6 _5 T, f1 o. Y0 f6 K( A, `
  71. {, ^1 }: r9 |% d+ G5 s; x$ H5 V- p) j
  72.     gpio_set_direction( LED_GPIO_NUM , GPIO_MODE_OUTPUT );3 x2 _3 I" e& g1 X( R# `  v& u
  73. }- i* m0 z( ]5 P) K! r/ @% e% h

  74. : F7 P- b* B+ [. K/ B: R" E. Y
  75. /**0 r# x7 E' a4 Y; S
  76.     * @brief  no .   
    ) H0 T% |+ L: B5 j: M. F& l1 F) L
  77.     * @note   no.# b/ f) K, G6 P: g) e! a0 Z, ]2 m
  78.     * @param  no.6 N& F) t4 Y+ y: y% i. c! [) _+ `
  79.     * @retval no.' f- }+ g6 `9 Q4 }' t
  80.     */0 ]5 c' B! x. E
  81. void led_task( void *pvParameters ): I+ @6 [. E4 s3 N: P0 h
  82. {
    # N) }+ r( e& ^7 `" Y9 m3 i  \
  83.     int level = 0;
    0 ], ?3 O, W5 u6 Q/ d; ^
  84.     4 K) N# p) K/ P) {2 z2 R! r$ N/ p
  85.     for( ;; )
    2 W8 ^7 }- r/ O9 l  w: y
  86.     {
    $ u3 p- B) i1 r3 f
  87.         gpio_set_level( LED_GPIO_NUM , level);
    , A- e1 b; v1 u( S3 w4 p, k* O
  88.         level = !level;
    3 n/ c/ e! {2 F& ~3 p
  89.         vTaskDelay(300 / portTICK_PERIOD_MS);
    ) j7 b3 j8 @7 k0 d( q
  90.     }
    : c7 \# h. z$ T
  91. }
    2 }0 l  b0 U( M  A' d( y
  92. . l4 U- Q  ~% X/ A, R  e
  93. void app_main(void)( \4 C+ l9 Z. Q1 ^, }
  94. {
    2 C; u6 [7 b+ [, ]: p# u% Z( Y# U
  95.     nvs_flash_init();//初始化NVS内存
    5 ?! b. r. [4 A" d! {1 \1 V
  96.     led_init();
    ; E/ y# o+ @8 M' J, G
  97.     tcpip_adapter_init();//tcp/IP配置
    6 n- C; p5 J- B8 [* D
  98.     ESP_ERROR_CHECK( esp_event_loop_init(event_handler, NULL) );//回调,当ESP32检测到某些类型的WiFi相关事件时调用。7 }! ^5 J3 z, p, m& J4 l
  99.     wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();//定义一个名为cfg的wifi_init_config_t结构体。wifi_init_config_t中的参数可由menuconfig配置$ Z0 L' Q6 V- ?3 `2 v3 T
  100.     ESP_ERROR_CHECK( esp_wifi_init(&cfg) );3 f" L6 X  t0 l2 Y
  101.     ESP_ERROR_CHECK( esp_wifi_set_storage(WIFI_STORAGE_RAM) );//指示ESP32将这些设置记录到闪存
    6 U% o6 r) z- c
  102.     ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_AP) );//模式设置为AP- V% ]8 ]; D  R8 |- \- ?
  103. ) q  n0 L0 k5 n; l
  104.     esp_wifi_get_mac( ESP_IF_WIFI_AP , ApMac );//获取DHCP分配的IP接口的mac。
    , Z1 e) G5 ], s7 B" \+ E' ?( e4 |
  105.     : S9 t) m, t; M  k  N
  106.     wifi_config_t ap_config = {
    * f( ~2 J+ l; Q# G6 U: S
  107.         .ap = {
    3 u' J: R) H/ X7 W4 q* A/ u
  108. //            .ssid = ssid,. ]6 H: V3 R0 ?& ~# F
  109.             .password = CONFIG_AP_PASSWORD,
    * W) O( A" _) _+ A! B: q7 p3 a! z
  110.             .ssid_len = 0,5 H) _: ]7 U1 C: @
  111.             .max_connection = 4,: m$ ], h: Q+ A9 \; ~8 j+ n  g
  112.             .authmode = WIFI_AUTH_WPA_PSK
    8 k& z$ X; y* q& \! [% f
  113.         }5 S. W' {: r4 }( l! O
  114.     };//ap接入点参数配置。
    2 E. M% W# B2 n4 e, A2 u
  115. ) z/ `. t* A6 ^, a7 H5 y
  116.     sprintf( (char *)ap_config.ap.ssid , "%s_%02X%02X" , CONFIG_AP_SSID , ApMac[4] , ApMac[5] );& k3 m; P% a1 A% z

  117. 9 o8 t5 x' ^: |+ @! B) c8 K
  118.     esp_err_t tmp =  esp_wifi_set_config(WIFI_IF_AP, &ap_config);
    $ G; }3 m+ D' P2 H
  119.     ESP_ERROR_CHECK(esp_wifi_start());
    7 O7 ~: }- a) M7 U$ y0 K! x' ]2 H* Q
  120.     esp_wifi_connect();
    . {" v( j* M1 m" ~/ p2 Q
  121.     ( r5 l/ Y& ?4 z
  122.     xTaskCreate( &led_task, "led task", 512, NULL, 3, NULL );
    ; `) i2 f+ p" T' u! K3 G/ R
  123. + |! g7 S% t( ?6 r( Q; m  d. A
  124. }
复制代码
实验现象:
: i2 l1 t' _  q7 ^9 r2 W8 M# j: G/ F' v
打开minicom可以看到输出:0 Z- g+ x% Q7 z! S/ H! H0 h

+ ?9 [4 j& E+ y8 j5 |
1.png
0 E$ w! j& B% ]3 F$ |4 q
打开手机WIFI,可以看到名为ESP32_44F1的WIFI热点,打开热点,输入设置的PASSWORD:12345678即可连接成功,说明AP接口设置
1 T$ t  f/ p1 e. e1 y
! f# A) e) E2 [9 w
2.png
* }. ?- ?2 Y% J0 d6 P7 T) X& a
编程讲解:) I7 B3 @) G) C' q" H$ U/ |

) l2 K5 E# Y9 J% V) k# a& z使用连接站2 K: o1 N/ b) P, f

6 U9 a" f9 D1 h+ T0 [2 D8 |. q: f当我们的ESP32是接入点时,我们说我们希望允许电台
; i1 H( v4 `2 Y/ Z) y/ w$ l" S( i) c4 r& o. P% y8 e$ R) H$ v  d% B5 ]
合作 nnect它。 这带来了管理这些电台的故事。 常见的事情
+ L9 f4 n' d) \* D. E4 z
/ h2 m' l) K* w我们可能想做的是:
" W$ C# @! o! B& B
1 ^, q  j* \$ S# |' N•     确定新车站何时连接
2 w. S- N# ]& l( [! F  d$ m! W" ^% f5 c
•     确定以前连接的电台何时离开' N! `+ F( t9 Q

: o( R% Y1 C; d5 _) L& J•     列出当前连接的电台! A$ w' N* C. K' U5 _

& Y0 U& A- X5 O/ Y  s  Z! x* \! N•     断开ÒNE 或多个当前连接的站  t0 E. g  A5 d" N
3 p( B. B+ n; b
我们可以注册一个事件处理程序来检测新站连接和与现有站断开。 当我们成为接入点时,会产生ESP32 WiFi事件SYSTEM_EVENT_AP_START。当一个站连接时,ESP32西港岛线提高 SYSTEM_EVENT_AP_STACONNECTED事件。 当一个站断开,我们将看到 SYSTEM_EVENT_AP_DISCONNECTED事件。5 l! C3 f: _: E) ~. v

* Y4 \, B- z' r' a# H" x( |8 ^% T9 b我们可以使esp_wifi_get_station_list()函数获取当前连接的电台,函数返回站的链表。 这个列表的存储被分配给我们,我们应该调用 esp_wifi_free_station_list()释放它当我们不再存在需要它时 。
/ n2 @& ?$ \7 j+ V" m. f
- x" l6 \6 h& C% H- ^从ESP32中,我们可以判断很多为static项,比如当前连接数通过调用 wifi_softap_get_station_num()。 如果我们想找到那些站的细节,我们可以调用 wifi_softap_get_station_info(),它将返回链接列表wifi_sta_list_t,所以 我们必须调用wifi_softap_free_station_info()明确地释放此调用与分配的存储。
6 r! B: a5 E! F* T4 Y
: O9 i9 E9 ]3 x7 P+ I" `( Z以下是一个代码段的示例,其中列出了连接站的详细信息:$ W% r- Y: X) o4 x5 R* Y: m
  1. uint8 stationCount = wifi_softap_get_station_num();# ^+ I. B6 G) F- A1 L; q2 j6 q
  2. os_printf("stationCount = %d\n", stationCount);8 x& Q5 U, r- j$ h
  3. wifi_sta_list_t *stationInfo = wifi_softap_get_station_info();- _: _/ p1 j0 N  y0 b4 `- ~
  4. if (stationInfo != NULL) {& e) c, p9 r4 k( n: f
  5.    while (stationInfo != NULL) {. F+ ~/ I" A* O* N7 @; e! B
  6.       os_printf("Station IP: %d.%d.%d.%d\n", IP2STR(&(stationInfo->ip)));
    ! _, h, S2 E, q) x
  7.       stationInfo = STAILQ_NEXT(stationInfo, next);
    : y1 |3 L( P: Y. @. c
  8.    }( `, t1 B% R! a' _1 o
  9.    wifi_softap_free_station_info();
    & Y9 W, i1 v* }& m) R
  10. }
复制代码
如果由于某种原因,我们环境中的程序想强制断开当前的连接的station,我们可以使用 esp_wifi_kick_station()来断开。
6 @) @/ z: ]/ V' n" |6 \, ^" B  ^' @' `2 c8 M! j' M
WiFi在启动时
& Z  {- Q6 _6 D' r6 h! s: d2 S. I3 S/ y2 L3 I% z" f: u+ j$ \
ESP32可以将WiFi启动信息存储在闪存中。 这允许它在启动时执行其功能,而无需向用户询问任何特殊的或附加信息。这种能力由函数esp_wifi_set_auto connect()和esp_wifi_get_auto_connect()完成。它们被用来自动连接的设置值和读取保存在闪存中的值,设置赋值的函数为esp_wifi_set_config(),存储方法通过esp_wifi_set_storage()来设置WiFi API配置存储类型。
$ ?+ ^+ S8 C3 I$ c' h$ Y/ _% C3 I. ?( D( a8 m; ?: k0 r+ F
首先讲解DHCP前需要了解什么是DHCP,DHCP即动态主机配置协议,它的作用是集中分配IP地址给主机,使网络环境中的主机可以动态的获得IP地址.如果想详细了解,可以看如下链接& y) l) _) U% ~3 N( G

" K, n! f; Z1 h* d. u8 R; Mhttp://baike.baidu.com/item/DHCP/218195?fr=aladdin) @/ L6 T' h2 j% r. m) @% A8 W

7 r! s; v- C; R3 {1 W8 t本文这里重点讲解其在ESP32中的应用和配置。
, j+ O' F9 `. Y: V- x8 {; e) T! _7 `0 \2 N
DHCP客户端# j+ k2 D; P  ^! g

! r0 o" @4 ?& ?1 H3 h5 q  ~当ESP32作为站点连接到接入点时,它还运行DHCP客户端连接到它在接入点的DHCP服务器。 在那里,站点提供其IP地址,网关地址和网络掩码, 我们可以这样做:调用 tcpip_adapter_set_ip_info()在程序编写时。 7 K3 ?- O5 \& S3 p1 ?7 C

1 t  \5 g' _1 [函数逻辑如下
$ f! Z8 A/ B2 c0 ~
  1. tcpip_adapter_init();
    5 G! V7 f9 j$ K9 ^/ ?- ^
  2. tcpip_adapter_dhcpc_stop();
    * L+ P. S! W7 `) T' f. h) y
  3. tcpip_adapter_set_ip_info();+ w& X) |4 U, B) G# J: x
  4. esp_wifi_init();5 w7 G& {* L6 @. o( s- E6 @
  5. esp_wifi_set_mode();' \5 O1 _; d4 Q: X
  6. esp_wifi_set_config();, B; ^, L. w+ T% t
  7. esp_wifi_start();( ?( v3 ?6 U; ^& H; Y; l
  8. esp_wifi_config();
复制代码
但是当我们想为这些数据设置我们自己的值时。调用的tcpip_adapter_set_ip_info()时需要的参数可以按如下方法设置& i. `+ g3 x+ t3 t# L
tcpip_adapter_ip_info_t ipInfo;
1 d6 g/ v. f: I; @3 Y; C+ X$ RIP4_ADDR(&ipInfo.ip, 192,168,1,99);
( Z8 D$ s+ w; h) r% A, G; LIP4_ADDR(&ipInfo.gw, 192,168,1,1);" ^7 Q8 O# H, ?0 Y# K+ ~% I
IP4_ADDR(&ipInfo.netmask, 255,255,255,0);0 ^& H, S7 D2 w6 p# f) I+ a% X
tcpip_adapter_set_ip_info(TCPIP_ADAPTER_IF_STA, &ipInfo);9 C: R1 i2 K7 Q

. X  P8 {+ f# S: F3 G' R% I或者用字符串表示
3 K! s1 o2 S. T( F- w
% J3 M2 h6 x) n+ Jtcpip_adapter_ip_info_t ipInfo;% `* ^3 b4 Q2 s
inet_pton(AF_INET,“192.168.1.99”,&ipInfo.ip);% y+ ?$ e9 m5 W2 C
inet_pton(AF_INET,“192.168.1.1”,&ipInfo.gw);+ n) ^$ N: I: }2 ~9 x/ r& E
inet_pton(AF_INET,“255.255.255.0”,&ipInfo.netmask);
% P. B8 V9 f1 {7 @: I8 Z; e4 @  [8 itcpip_adapter_set_ip_info(TCPIP_ADAPTER_IF_STA,&ipInfo);
3 X; F1 P4 A0 Y% x% H- @, H0 z) O6 q# M/ L- a
DHCP服务器) ]# F" F, f" k# D5 T

7 z, w2 c5 k7 _& d4 ~2 z当ESP32作为接入点时,可能需要它作为DHCP服务器,以便连接站将能够自然而然的分配IP地址,并获得他们的子网掩码和网关。DHCP服务器可以启动和使用API​​调用设备中停止wifi_softap_dhcps_start() 和 wifi_softap_dhcps_stop(),当前DHCP服务器的状态(启动或停止),可以通过调用+ w5 X% y8 P6 w6 c
7 ?) }" A- t8 G' b. a% s
wifi_softap_dhcps_status()查看。
* ^" ~& M1 i# [3 T9 o  s7 }/ f( ^0 c( b
由DHCP服务器提供的IP地址的默认范围是192.168.4.1向上。第一个地址成为分配给ESP32本身。我们需要注意的是它的地址和我们工作的LAN范围是不一样。即他形成了自己的网络地址空间,它们也许是一相同种类的网络IP(192.168.XX)出现的。当我们连接到它时,我们可以在PC上PING到它。9 B* p; m& |2 w2 K) M7 \6 T* c
7 S( ~( k4 I6 ^: Q: O
当前的IP地址,子网掩码和网关) x. q  [2 [6 p/ }- j
9 Q% v+ U1 b& Z  H5 J
当我们需要知道,当前环境中我们的ESP32中的IP地址,子网掩码和网关时,我们已经知道这些值是由DHCP服务器设置的,我们可以调用tcpip_adapter_get_ip_info()得到这些值,因为,由于ESP32可以有两个IP接口(一个用于接入点和一个用于站),我们需要通过参数使程序知道我们想要检索的接口。
; j# S) ]' h" {1 x  j6 W4 S
, B8 q  E0 P0 I, n! P3 N# SWiFi保护设置 - WPS(定义)
. L6 f: W% S; Z9 g- |* u7 Z
* e9 y, i; z" i3 o- Q该ESP32支持在站模式下的WiFi保护设置,这意味着,如果接入点支持,ESP32可以连接到接入点不呈现出密码。目前支持的只有“按钮模式”实现。利用这种机制,一个物理按钮被按下接入点,并且,对于一个周期的两分钟,在范围内的任何站可以使用加入网络WPS协议。官方给出了一个实际的应用例子是,当我们按下WPS的按键后,ESP32将调用wifi_wps_enable()和wifi_wps_start(),ESP32即可成功的连入计入端。
$ t) a3 E  ?7 {/ G, x' [$ k# {7 q& N  |3 T2 i+ y# G
9 l3 a. V  b( K

' ^8 E4 ~0 ~4 b7 y1 m: e0 m. V( S; |7 b- V6 x" w1 ]2 I
转载自noticeable$ P% S  k3 f& Q  u  k$ U! Y

# v' R1 B0 ]2 D/ Y8 A" v
收藏 评论2 发布时间:2018-5-31 10:16

举报

2个回答
wolfgang 回答时间:2018-5-31 14:05:37
不错,介绍很详细,有具体的电路连接方式就更好了~~
木森林的年轮 回答时间:2018-6-1 08:12:03
那么强大的esp32就这么使用不浪费吗

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版