目录
背景知识
wifi的基本连接使用
WiFi篇—— WiFi两种模式文章中二、WiFi 的启动(STA 及 AP 模式)
输出现象
通过websocket控制LED
实践验证
实验现象
-
背景知识
WIFI是ESP32非常重要的一个功能,想要使用一下IDF的API实现将ESP32连接到AP节点中,正好idf的example中有提供一个叫做fast scan的demo。在此之前可以阅读一下下面这篇文章,ESP32 WIFI的背景知识介绍的非常详细,并且提供了一些参考代码,可以进行学习一下:
WiFi两种模式
-
wifi的基本连接使用
WiFi篇—— WiFi两种模式文章中二、WiFi 的启动(STA 及 AP 模式)
文章的这个小节对STA模式的连接过程及API调用有很详细的描述,而在demo中也正如文章所描述的一致。
#include "freertos/FreeRTOS.h"
#include "freertos/event_groups.h"
#include "esp_wifi.h"
#include "esp_log.h"
#include "esp_event.h"
#include "nvs_flash.h"// ......
//以上这一堆是通过Kconfig进行配置的参数,包括设置需要连接AP的名称,密码,以及信号强度。static const char *TAG = "scan";static void event_handler(void* arg, esp_event_base_t event_base,int32_t event_id, void* event_data)
{if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {esp_wifi_connect();} else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {esp_wifi_connect();} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;ESP_LOGI(TAG, "got ip:" IPSTR, IP2STR(&event->ip_info.ip));}
}/* Initialize Wi-Fi as sta and set scan method */
static void fast_scan(void)
{ESP_ERROR_CHECK(esp_netif_init());ESP_ERROR_CHECK(esp_event_loop_create_default());wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();ESP_ERROR_CHECK(esp_wifi_init(&cfg));ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL, NULL));ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL, NULL));// Initialize default station as network interface instance (esp-netif)esp_netif_t *sta_netif = esp_netif_create_default_wifi_sta();assert(sta_netif);// Initialize and start WiFiwifi_config_t wifi_config = {.sta = {.ssid = DEFAULT_SSID,.password = DEFAULT_PWD,.scan_method = DEFAULT_SCAN_METHOD,.sort_method = DEFAULT_SORT_METHOD,.threshold.rssi = DEFAULT_RSSI,.threshold.authmode = DEFAULT_AUTHMODE,},};ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config));ESP_ERROR_CHECK(esp_wifi_start());
}void app_main(void)
{// Initialize NVSesp_err_t ret = nvs_flash_init();if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {ESP_ERROR_CHECK(nvs_flash_erase());ret = nvs_flash_init();}ESP_ERROR_CHECK( ret );fast_scan();
}
其中调用nvs_flash_init
和esp_netif_init
进行初始化是为了设置和配置与网络相关的两个重要组件:NVS(Non-Volatile Storage)和网络接口(esp_netif
),nvs_flash
是ESP32中用于非易失性存储的组件我以为初始化它是为了后面保存wifi的配置信息,但是我屏蔽这段esp_wifi_init初始化会提示错误:
应该是有一些初始化参数还是存在NVS中,也有可能是NVS的使能导致的,所以避免出错还是要按照demo中的流程进行配置。
-
输出现象
这里设置了RSSI的阈值,如果小于设定值,那么wifi连接会失败:
-
通过websocket控制LED
通过网页控制LED灯的亮灭,一般的ESP32开发板都可以实现,下面这篇文章是国外开发者提供的一个通过websocket控制LED的实例, 文章对如何实现有非常详细的描述,但是需要魔法才能访问如下连接:
esp32-esp-idf-websocket-web-server
对应的工程源码在github可以找到:
ESP32-ESP-IDF-WebSocket-Web-Server
-
实践验证
我这里是在ubuntu 22.04中使用了v5.1.1-dirty的idf版本进行编译,由于idf版本的问题,我这里需要将main.c中修改下面的接口为gpio_reset_pin:
其次,我这里根据我使用的ESP32,修改了csv文件,需要的可以参考一下:
# Name, Type, SubType, Offset, Size, Flags
# Note: if you change the phy_init or app partition offset, make sure to change the offset in Kconfig.projbuild
nvs, data, nvs, , 0x6000,
phy_init, data, phy, , 0x1000,
factory, app, factory, , 0x100000,
storage, data, spiffs, , 0x80000,
-
实验现象
获得ESP32的wifi ip:
通过浏览器访问该ip,点击按键可以观察到led的亮灭状态:
小结
使用ESP32 IDF还是需要一些背景知识,比如说最基本的编译和烧录,还有menuconfig没接触过的可能还是会比较懵,如果是这样,那就得多花些时间去填充知识的盲区。