ESP32连接wifi热点,代码:

#include "freertos/FreeRTOS.h"
#include "esp_wifi.h"
#include "esp_system.h"
#include "esp_event.h"
#include "esp_event_loop.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "driver/gpio.h"

#define TAG  "app_sta"

esp_err_t event_handler(void *ctx, system_event_t *event)
{
    switch (event->event_id)
    {
    case SYSTEM_EVENT_STA_START:
        ESP_LOGI(TAG, "Connecting to AP...");
        esp_wifi_connect();
        break;

    case SYSTEM_EVENT_STA_GOT_IP:
        ESP_LOGI(TAG, "Connected.");
        break;

    case SYSTEM_EVENT_STA_DISCONNECTED:
        ESP_LOGI(TAG, "Wifi disconnected, try to connect ...");
        esp_wifi_connect();
        break;

    default:
        break;
    }

    return ESP_OK;
}
void app_main(void)
{
    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) );
    //ESP_ERROR_CHECK( esp_wifi_set_storage(WIFI_STORAGE_FLASH) );
    ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_STA) );
    wifi_config_t sta_config = {
        .sta = {
            .ssid = CONFIG_WIFI_SSID,
            .password = CONFIG_WIFI_PASSWORD,
            .bssid_set = false
        }
    };

    ESP_ERROR_CHECK( esp_wifi_set_config(WIFI_IF_STA, &sta_config) );
    ESP_ERROR_CHECK( esp_wifi_start() );
}

主程序

  1. 初始化tcpip适配器
  2. 初始化事件调度器
  3. 初始化Wifi驱动
  4. 设置Wifi的参数
  5. 启动Wifi

状态机:

整个 wifi 协议栈是一个状态机,event_handler函数捕获各个状态并且处理。

//system_event_id_t
typedef enum {
    SYSTEM_EVENT_WIFI_READY = 0,           /**< ESP32 WiFi 准备就绪*/
    SYSTEM_EVENT_SCAN_DONE,                /**< ESP32 完成扫描 AP */
    SYSTEM_EVENT_STA_START,                /**< ESP32 sta 启动 */
    SYSTEM_EVENT_STA_STOP,                 /**< ESP32 sta 停止 */
    SYSTEM_EVENT_STA_CONNECTED,            /**< ESP32 sta 连接到 AP */
    SYSTEM_EVENT_STA_DISCONNECTED,         /**< ESP32 sta 从 AP 断开连接 */
    SYSTEM_EVENT_STA_AUTHMODE_CHANGE,      /**< ESP32 sta 所连接的 AP 的授权模式改变了 */
    SYSTEM_EVENT_STA_GOT_IP,               /**< ESP32 sta 从 AP 获取到 IP 地址 */
    SYSTEM_EVENT_STA_WPS_ER_SUCCESS,       /**< ESP32 sta wps succeeds in enrollee mode */
    SYSTEM_EVENT_STA_WPS_ER_FAILED,        /**< ESP32 sta wps fails in enrollee mode */
    SYSTEM_EVENT_STA_WPS_ER_TIMEOUT,       /**< ESP32 sta wps timeout in enrollee mode */
    SYSTEM_EVENT_STA_WPS_ER_PIN,           /**< ESP32 sta wps pin code in enrollee mode */
    SYSTEM_EVENT_AP_START,                 /**< ESP32 soft-AP 启动*/
    SYSTEM_EVENT_AP_STOP,                  /**< ESP32 soft-AP 停止*/
    SYSTEM_EVENT_AP_STACONNECTED,          /**< 有 sta 连接到 ESP32 soft-AP */
    SYSTEM_EVENT_AP_STADISCONNECTED,       /**< 有 sta 从 ESP32 soft-AP 断开连接 */
    SYSTEM_EVENT_AP_PROBEREQRECVED,        /**< soft-AP 接口接收到探测请求报文*/
    SYSTEM_EVENT_AP_STA_GOT_IP6,           /**< ESP32 sta/ap 接口获取到 IPv6 地址 */
    SYSTEM_EVENT_ETH_START,                /**< ESP32 ethernet start */
    SYSTEM_EVENT_ETH_STOP,                 /**< ESP32 ethernet stop */
    SYSTEM_EVENT_ETH_CONNECTED,            /**< ESP32 ethernet phy link up */
    SYSTEM_EVENT_ETH_DISCONNECTED,         /**< ESP32 ethernet phy link down */
    SYSTEM_EVENT_ETH_GOT_IP,               /**< ESP32 ethernet got IP from connected AP */
    SYSTEM_EVENT_MAX
} system_event_id_t;

需要注意的是:如果没有nvs_flash_init(),会出现:

W (24) wifi: wifi nvs_open fail ret=4353

首先利用make menuconfig配置wifi的ssid和password,然后烧写flash,运行得到结果

I (0) cpu_start: App cpu up.
I (297) heap_init: Initializing. RAM available for dynamic allocation:
I (304) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
I (310) heap_init: At 3FFB8DF0 len 00027210 (156 KiB): DRAM
I (316) heap_init: At 3FFE0440 len 00003BC0 (14 KiB): D/IRAM
I (322) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (329) heap_init: At 4008FD48 len 000102B8 (64 KiB): IRAM
I (335) cpu_start: Pro cpu start user code
I (17) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
I (166) wifi: wifi firmware version: 111e74d
I (166) wifi: config NVS flash: enabled
I (166) wifi: config nano formating: disabled
I (166) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE
I (176) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE
I (206) wifi: Init dynamic tx buffer num: 32
I (206) wifi: Init data frame dynamic rx buffer num: 64
I (206) wifi: Init management frame dynamic rx buffer num: 64
I (216) wifi: wifi driver task: 3ffc080c, prio:23, stack:4096
I (216) wifi: Init static rx buffer num: 10
I (226) wifi: Init dynamic rx buffer num: 64
I (226) wifi: Init rx ampdu len mblock:7
I (226) wifi: Init lldesc rx ampdu entry mblock:4
I (236) wifi: wifi power manager task: 0x3ffc5c78 prio: 21 stack: 2560
I (266) phy: phy_version: 362.0, 61e8d92, Sep  8 2017, 18:48:11, 0, 0
I (266) wifi: mode : sta (30:ae:a4:35:ef:b8)
I (266) app_sta: Connecting to AP...
I (396) wifi: n:4 1, o:1 0, ap:255 255, sta:4 1, prof:1
I (1376) wifi: state: init -> auth (b0)
I (1376) wifi: state: auth -> assoc (0)
I (1386) wifi: state: assoc -> run (10)
I (1686) wifi: connected with TagSys, channel 4
I (3116) event: sta ip: 192.168.10.7, mask: 255.255.255.0, gw: 192.168.10.1
I (3116) app_sta: Connected.
I (4386) wifi: pm start, type:0

results matching ""

    No results matching ""