乐鑫技术交流
直播中

楼斌

8年用户 815经验值
私信 关注
[问答]

根据espesp-idfexampleswifismart_config例程来编写的智能配网,怎么做才能判断智能配网连接是否失败?

我是根据espesp-idfexampleswifismart_config例程来编写的智能配网,如果输入密码是错的,程序也不会返回信息给手机APP,要怎么做才能判断智能配网连接是否失败?这是我的一部分代码
static void event_handler(void* arg, esp_event_base_t event_base,
                                int32_t event_id, void* event_data)
{
    static int retry_num = 0;           /* 记录wifi重连次数 */
    esp_err_t err;  
    /* 系统事件为WiFi事件 */
    if (event_base == WIFI_EVENT)
    {
        if(event_id == WIFI_EVENT_STA_START)    /* 事件id为STA开始 */
        {
            err= esp_wifi_connect();
            printf("err = %drn",err);
        }
        else if (event_id == WIFI_EVENT_STA_DISCONNECTED) /* 事件id为失去STA连接 */
        {
            gpio_set_level(led, 1);
            err=esp_wifi_connect();
            printf("err111111 = %drn",err);
            retry_num++;
            printf("retry to connect to the AP %d times. n",retry_num);
            if (retry_num > 5)  /* WiFi重连次数大于10 */
            {
                /* 将WiFi连接事件标志组的WiFi连接失败事件位置1 */
                xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT);
            }
            /* 清除WiFi连接成功标志位 */
            xEventGroupClearBits(s_wifi_event_group, CONNECTED_BIT);
        }
    }
    /* 系统事件为ip地址事件,且事件id为成功获取ip地址 */
    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; /* 获取IP地址信息*/
        printf("got ip:%d.%d.%d.%d n" , IP2STR(&event->ip_info.ip));  /* 打印ip地址*/
        retry_num = 0;                                              /* WiFi重连次数清零 */
        /* 将WiFi连接事件标志组的WiFi连接成功事件位置1 */
        xEventGroupSetBits(s_wifi_event_group, CONNECTED_BIT);
    }
    /* 系统事件为智能配网事件 */
    else if (event_base == SC_EVENT)
    {
        led_mode = Connect_led;
        if(event_id == SC_EVENT_SCAN_DONE )             /* 开始扫描智能配网设备端 */
            printf("Scan donen");
        else if(event_id == SC_EVENT_FOUND_CHANNEL)     /* 得到了智能配网通道 */
            printf("Found channel n");
        else if(event_id == SC_EVENT_GOT_SSID_PSWD)     /* 得到了智能配网设备提供的ssid和password */
        {
            printf("smartconfig got SSID and passwordn");
            /* 获取智能配网设备端提供的数据信息 */
            smartconfig_event_got_ssid_pswd_t *evt = (smartconfig_event_got_ssid_pswd_t *)event_data;
            /* 定义WiFi配置结构体和用了结收ssid和password的数组 */
            wifi_config_t wifi_config;
            char ssid[32] = { 0 };
            char password[64] = { 0 };

            bzero(&wifi_config, sizeof(wifi_config_t)); /* 将结构体数据清零 */
             /* 将智能配网设备发送来的WiFi的ssid、password及MAC地址复制到wifi_config */
            memcpy(wifi_config.sta.ssid, evt->ssid, sizeof(wifi_config.sta.ssid));
            memcpy(wifi_config.sta.password, evt->password, sizeof(wifi_config.sta.password));
            wifi_config.sta.bssid_set = evt->bssid_set;
            if (wifi_config.sta.bssid_set == true) {
                memcpy(wifi_config.sta.bssid, evt->bssid, sizeof(wifi_config.sta.bssid));
            }
            /* 打印WiFi名称和密码 */
            memcpy(ssid, evt->ssid, sizeof(evt->ssid));
            memcpy(password, evt->password, sizeof(evt->password));
            printf("SSID:%s n", ssid);
            printf("PASSWORD:%s n", password);

            /* 将得到的WiFi名称和密码存入NVS*/
            nvs_handle wificfg_nvs_handler;
            ESP_ERROR_CHECK( nvs_open("WiFi_cfg", NVS_READWRITE, &wificfg_nvs_handler) );
            ESP_ERROR_CHECK( nvs_set_str(wificfg_nvs_handler,"wifi_ssid",ssid) );
            ESP_ERROR_CHECK( nvs_set_str(wificfg_nvs_handler,"wifi_passwd",password) );
            ESP_ERROR_CHECK( nvs_commit(wificfg_nvs_handler) ); /* 提交 */
            nvs_close(wificfg_nvs_handler);                     /* 关闭 */
            printf("smartconfig save wifi_cfg to NVS .n");
             /* 根据得到的WiFi名称和密码连接WiFi*/
            ESP_ERROR_CHECK( esp_wifi_disconnect() );
            ESP_ERROR_CHECK( esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config) );
            ESP_ERROR_CHECK( esp_wifi_connect() );
        }
        else if (event_id == SC_EVENT_SEND_ACK_DONE)    /* 智能配网成功,已经给智能配网设备发送应答*/
        {
            xEventGroupSetBits(s_wifi_event_group, SMART_CONFIG_BIT);
        }
    }
}0.png

回帖(1)

尚文清

2024-6-19 16:32:49
要判断智能配网连接是否失败,您可以在 `event_handler` 函数中添加对连接失败事件的处理。以下是一些建议的步骤:

1. 首先,检查事件 ID 是否为 `WIFI_EVENT_STA_DISCONNECTED`。这个事件表示 Wi-Fi 连接已断开。

2. 如果事件 ID 是 `WIFI_EVENT_STA_DISCONNECTED`,您可以检查 `retry_num` 变量,以确定是否需要重试连接。

3. 如果 `retry_num` 达到一定次数(例如 3 次),则可以认为配网连接失败。此时,您可以将 `retry_num` 重置为 0,并通知手机 APP 配网失败。

4. 如果 `retry_num` 未达到重试次数限制,您可以增加 `retry_num` 的值,并尝试重新连接。

以下是修改后的 `event_handler` 函数示例:

```c
static void event_handler(void* arg, esp_event_base_t event_base,
                          int32_t event_id, void* event_data) {
    static int retry_num = 0;

    if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {
        wifi_event_sta_disconnected_t* disconnected = (wifi_event_sta_disconnected_t*) event_data;
        ESP_LOGI(TAG, "Disconnect reason : %d", disconnected->reason);

        if (retry_num < MAX_RETRY_NUM) {
            retry_num++;
            ESP_LOGI(TAG, "Retrying to connect, attempt %d", retry_num);
            // 重新连接的代码
        } else {
            retry_num = 0;
            ESP_LOGE(TAG, "Smart config failed after %d attempts", MAX_RETRY_NUM);
            // 通知手机 APP 配网失败的代码
        }
    }
}
```

请注意,您需要替换 `MAX_RETRY_NUM` 为您希望尝试的最大重试次数,并添加适当的日志记录和通知手机 APP 的代码。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分