功能:wifi直连配网
硬件:ESP32-S
框架:ESP-IDF 4.3
编译器:VSCode
打开工程
-
Ctrl
+Shift
+p
打开ESP32的示例demo。
-
选择
dpp-enrollee
工程。
代码说明
- 主函数入口。
void app_main(void)
{
/* 非易失性存储(NVS)库旨在将 键值对 存储在flash中 */
esp_err_t ret = nvs_flash_init(); /* 初始化片内flash */
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);
dpp_enrollee_init(); /* dpp-enrollee 初始化,需要对flash进行读写所有要先初始化nvs */
}
dpp-enrollee
初始化。
void dpp_enrollee_init(void)
{
s_dpp_event_group = xEventGroupCreate(); /* 创建事件组,配网程序通过事件创建并等待配网 */
ESP_ERROR_CHECK(esp_netif_init());
ESP_ERROR_CHECK(esp_event_loop_create_default());
esp_netif_create_default_wifi_sta();
/* 为 event_handler函数 注册WIFI事件和IP事件 */
ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL));
ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL));
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); /* 获取wifi默认配置 */
ESP_ERROR_CHECK(esp_wifi_init(&cfg)); /* 初始化wifi */
ESP_ERROR_CHECK(esp_supp_dpp_init(dpp_enrollee_event_cb)); /* 注册dpp回调函数 */
/* Currently only supported method is QR Code 配置为生成二维码模式 */
ESP_ERROR_CHECK(esp_supp_dpp_bootstrap_gen(EXAMPLE_DPP_LISTEN_CHANNEL_LIST, DPP_BOOTSTRAP_QR_CODE,
EXAMPLE_DPP_BOOTSTRAPPING_KEY, EXAMPLE_DPP_DEVICE_INFO));
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); /* 配置wifi为STA模式 */
ESP_ERROR_CHECK(esp_wifi_start()); /* 启动wifi */
/* Waiting until either the connection is established (WIFI_CONNECTED_BIT) or connection failed for the maximum
* number of re-tries (WIFI_FAIL_BIT). The bits are set by event_handler() (see above) */
EventBits_t bits = xEventGroupWaitBits(s_dpp_event_group, /* 添加事件到事件组 */
DPP_CONNECTED_BIT | DPP_CONNECT_FAIL_BIT | DPP_AUTH_FAIL_BIT, /* 事件位 */
pdFALSE,
pdFALSE,
portMAX_DELAY); /* 最大等待时间 */
/* xEventGroupWaitBits() returns the bits before the call returned, hence we can test which event actually
* happened. */
if (bits & DPP_CONNECTED_BIT) {
ESP_LOGI(TAG, "connected to ap SSID:%s password:%s",
s_dpp_wifi_config.sta.ssid, s_dpp_wifi_config.sta.password);
} else if (bits & DPP_CONNECT_FAIL_BIT) {
ESP_LOGI(TAG, "Failed to connect to SSID:%s, password:%s",
s_dpp_wifi_config.sta.ssid, s_dpp_wifi_config.sta.password);
} else if (bits & DPP_AUTH_FAIL_BIT) {
ESP_LOGI(TAG, "DPP Authentication failed after %d retries", s_retry_num);
} else {
ESP_LOGE(TAG, "UNEXPECTED EVENT");
}
esp_supp_dpp_deinit(); /* dpp失能 */
ESP_ERROR_CHECK(esp_event_handler_unregister(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler)); /* IP事件失能 */
ESP_ERROR_CHECK(esp_event_handler_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler)); /* wifi事件失能 */
vEventGroupDelete(s_dpp_event_group);
}
演示效果
-
编译成功后下载到ESP32。
-
打开VSCode的串口终端。
- 串口终端的二维码有问题,无法识别。
- 串口终端的二维码有问题,无法识别。
-
复制二维码上方的字符串用网页二维码生成器生成新的二维码。
-
手机连接上wifi后,通过右上角的二维码扫描生成的二维码。
-
扫描二维码后,点击连接。
-
VSCode的串口终端此时显示已经连接成功的信息。
评论区