侧边栏壁纸
  • 累计撰写 10 篇文章
  • 累计创建 1 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

dpp-enrollee配网

Z_Tam
2022-05-04 / 1 评论 / 3 点赞 / 1300 阅读 / 4740 字

功能: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的串口终端此时显示已经连接成功的信息。

3

评论区