第十四章 ESP32 新建一个WIFI热点

学习目的及目标

  1. 掌握WIFI的状态机结构
  2. 掌握乐鑫新建热点(AP)的程序

ESP32的WiFi特点

WiFi可作为AP、STA、AP+STA三种模式

作为AP时,可以被4个STA连接

AP 是 (Wireless) AccessPoint 的缩写,即 (无线) 访问接入点。简单来讲就像是无线路由器一样,设备打开后进入 AP 模式,在手机的网络列表里面,可以搜索到类似 TPLINK_XXX 的名字(SSID)

STA是每一个连接到无线网络中的终端(如笔记本电脑、手机、PAD及其它可以联网的用户设备)都可称为一个站点,STA本身并不接受无线的接入,它可以连接到AP。

软件设计

代码逻辑(来自网络

ESP32的I2C master接口介绍(来自网络

esp32wifi底层驱动是不开源的,以下是esp32 wifi状态机工作原理的流程图

ESP32的WIFI状态机总结

初始化wifi配置后,程序会根据WIFI的实时状态,在回调函数中给出状态返回,所以只需要在回调中进行相关操作,接下来讲解状态机的解析。

状态机解析

回调原型

static esp_err_t event_handler

(

void *ctx,

system_event_t *event

)

函数功能

WIFI状态机回调函数

参数

[in] event:

typedef struct {

system_event_id_t event_id; /*事件ID*/

system_event_info_t event_info; /*事件信息*/

} system_event_t;

//事件ID取值

typedef enum {

    SYSTEM_EVENT_WIFI_READY = 0,           /*WiFi准备好*/

    SYSTEM_EVENT_SCAN_DONE,                /*扫描AP完成*/

    SYSTEM_EVENT_STA_START,                /*作为STA开始工作*/

    SYSTEM_EVENT_STA_STOP,                 /*作为STA结束工作*/

    SYSTEM_EVENT_STA_CONNECTED,            /*作为STA连接上AP*/

    SYSTEM_EVENT_STA_DISCONNECTED,         /*作为STA断开AP*/

    SYSTEM_EVENT_STA_AUTHMODE_CHANGE,      /*作为STA连接的AP改变了*/

    SYSTEM_EVENT_STA_GOT_IP,               /*作为STA从AP获取了IP*/

    SYSTEM_EVENT_STA_LOST_IP,              /*作为STA丢掉了IP,也就是错了*/

    SYSTEM_EVENT_STA_WPS_ER_SUCCESS,    /*wps succeeds in enrollee mode */

    SYSTEM_EVENT_STA_WPS_ER_FAILED,    /* wps fails in enrollee mode */

    SYSTEM_EVENT_STA_WPS_ER_TIMEOUT,    /* wps timeout in enrollee mode */

    SYSTEM_EVENT_STA_WPS_ER_PIN,        /*wps pin code in enrollee mode */

    SYSTEM_EVENT_AP_START,                 /*AP开始*/

    SYSTEM_EVENT_AP_STOP,                  /*AP结束*/

    SYSTEM_EVENT_AP_STACONNECTED,          /*有STA连上SP32的AP*/

    SYSTEM_EVENT_AP_STADISCONNECTED,       /*有STA断开ESP32的AP*/

    SYSTEM_EVENT_AP_PROBEREQRECVED,        /*从AP中接收包*/

    SYSTEM_EVENT_GOT_IP6,                  /*获取IPv6*/

    SYSTEM_EVENT_ETH_START,                /*有线开始*/

    SYSTEM_EVENT_ETH_STOP,                 /*有线停止*/

    SYSTEM_EVENT_ETH_CONNECTED,            /*有线上线*/

    SYSTEM_EVENT_ETH_DISCONNECTED,         /*有线掉线*/

    SYSTEM_EVENT_ETH_GOT_IP,               /*有线获取了IP*/

    SYSTEM_EVENT_MAX

} system_event_id_t;

返回值

ESP_OK:成功

ESP_ERR_INVALID_ARG : 参数错误

WiFi初始化API介绍

设置WiFi回调函数esp_event_loop_init();

回调原型

esp_err_t esp_event_loop_init

(

)

函数功能

设置WiFi回调函数

参数

[in] cb:回调函数指针

[in] ctx:保留

返回值

ESP_OK:成功

other: 失败

初始化WiFi设置函数WIFI_INIT_CONFIG_DEFAULT();

设置WiFi工作模式函数esp_err_t esp_wifi_set_mode();

回调原型

esp_err_t esp_wifi_set_mode

(

wifi_mode_t mode

)

函数功能

设置WiFi工作模式函数

参数

[in] mode:wifi工作模式

返回值

ESP_OK:成功

other: 失败

启动WiFi函数:esp_err_t esp_wifi_start(void);

更多更详细接口请参考官方指南

WiFi初始化编写

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

void app_main()

{    

    ESP_ERROR_CHECK( nvs_flash_init() );

    tcpip_adapter_init();

    ESP_ERROR_CHECK(esp_event_loop_init(event_handler, NULL));

    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();

    ESP_ERROR_CHECK(esp_wifi_init(&cfg));

    wifi_config_t wifi_config = {

        .ap = {

            .ssid = "Helon_test",

            .ssid_len = 0,

            /* 最多只能被4个station同时连接,这里设置为只能被一个station连接 */

            .max_connection = 1,

            .password = "20180604",

            .authmode = WIFI_AUTH_WPA_WPA2_PSK,

        },

    };    

    ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP));

    ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_AP, &wifi_config));

    ESP_ERROR_CHECK(esp_wifi_start());    

}

作为AP的回调函数解析

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

static esp_err_t event_handler(void *ctx, system_event_t *event)

{

    switch (event->event_id)

    {

    case SYSTEM_EVENT_AP_START:

        printf("\nwifi_softap_start\n");

        break;

    case SYSTEM_EVENT_AP_STACONNECTED:

        printf("\nwifi_softap_connectted\n");

        break;

    case SYSTEM_EVENT_AP_STADISCONNECTED:

        printf("\nwifi_softap_disconnectted\n");

        break;

    default:

        break;

    }

    return ESP_OK;

}

效果展示

WiFi总结

点我->更多ESP32开发指南系列目录

发布了45 篇原创文章 · 获赞 48 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/qq_24550925/article/details/85853334