espressif/esp-mesh-lite

esp_mesh_lite_get_level returns 0 (AEGHB-812)

Opened this issue · 5 comments

Checklist

  • Checked the issue tracker for similar issues to ensure this is not a duplicate
  • Read the documentation to confirm the issue is not addressed there and your configuration is set correctly
  • Tested with the latest version to ensure the issue hasn't been fixed

How often does this bug occurs?

rarely

Expected behavior

esp_mesh_lite_get_level should be return 1 or grater then 1

Actual behavior (suspected bug)

When the wifi mesh is networked, when the function esp_mesh_lite_get_level is called to obtain the level, 0 is returned. According to the code on GitHub, the function returns 1 to indicate that it is a router node. If the return value is greater than 1, it is a leaf node or an intermediate node. However, the return value is not defined as 0, and now 0 is returned, and the data is not processed, resulting in the module not being able to send the data to the route through the mesh.

Error logs or terminal output

void mesh_node_task(void *arg)
{
    unsigned int retry_timeout = 0;
    EventBits_t bits = 0;
    EventBits_t waitBits = IPV4_CONNECTED_BIT;
    // xEventGroupWaitBits(network_event_group, waitBits, false, true, portMAX_DELAY);

    bits = xEventGroupWaitBits(network_event_group, waitBits, false, true, pdMS_TO_TICKS(30000));
    if((bits & waitBits) != waitBits){
        ESP_LOGE(TAG, "IPV4_CONNECTED_BIT fail....");
        esp_wifi_disconnect();
        esp_netif_destroy_default_wifi(g_station_netif);
        esp_netif_destroy_default_wifi(g_softap_netif);
        esp_wifi_deinit();
        esp_mesh_lite_erase_rtc_store();
        esp_restart();
    }

    sbus_set_dbg_indicate_cb(dbg_indicate);
    sbus_setEventCallback(&dev_listener);
    sbus_rpc_setEventCallback(&dev_rpc_listener);
    
    TickType_t next_wake_time = xTaskGetTickCount();
    while (true) {
        uint8_t layer = esp_mesh_lite_get_level();//the problem is here returns 0
        if(g_layer!=layer){
            g_layer=layer;
            is_force_sbus_restart = 1;
            dev_prop_updata(29, g_layer);
            // status_light_set(g_layer);
        }
        if(is_force_sbus_restart){
            if(is_rpc_client_conn){
                sbus_rpc_reportStatus(g_dev_id, false);
                sbus_rpc_disconnect();
                is_rpc_client_conn = false;
            }
            if(is_sbus_srv_start){
                sbus_reportStatus(g_dev_id, false);
                sbus_stop();
                is_sbus_srv_start = false;
            }
            is_force_sbus_restart = 0;
        }

        //ESP_LOGI(TAG, "g_layer[%d]", g_layer);
        //g_layer = 0;
        if(g_layer==0){
        }else if(g_layer==1){
            // if(g_need_sync_time){
            //     obtain_time();
            // }
            // ROOT node, sbus srv mode
            if(is_rpc_client_conn){
                sbus_rpc_reportStatus(g_dev_id, false);
                sbus_rpc_disconnect();
                is_rpc_client_conn = false;
            }
            if(!is_sbus_srv_start){
                if(retry_timeout==0){
                    is_sbus_srv_start=sbus_start(SBUS_SERVER_PORT, RPC_SERVER_PORT, g_dev_id);
                    if(!is_sbus_srv_start){
                        retry_timeout = 2000/DEV_WORK_LOOP_INTERVAL;
                    }
                    else{
                        send_reportDev();
                    }
                }else{
                    retry_timeout--;
                }
            }else{
                if(g_need_sync_time){
                    obtain_time();
                }
                if(!ota_flag)
                    sbus_loop(DEV_WORK_LOOP_INTERVAL);
            }
        }else{
            // device node, sbus rpc client mode
            if(is_sbus_srv_start){
                sbus_reportStatus(g_dev_id, false);
                sbus_stop();
                is_sbus_srv_start = false;
            }
            if(!is_rpc_client_conn){
                if(retry_timeout==0){
                    char * root_ip = NULL;
                    if(!get_mesh_root_ip(&root_ip) || !(is_rpc_client_conn=sbus_rpc_connect(root_ip, RPC_SERVER_PORT, g_dev_id))){
                        retry_timeout = 2000/DEV_WORK_LOOP_INTERVAL;
                    }
                    else{
                        send_reportDev();
                    }
                }else{
                    retry_timeout--;
                }
            }else{
                if(g_need_sync_time){ //lgw . add 20240912
                    obtain_time();
                }
                if(!ota_flag)
                    sbus_rpc_loop(DEV_WORK_LOOP_INTERVAL);

                if(retry_timeout==0){
                    if(is_mesh_root_ip_changed())
                    {
                        ESP_LOGI(TAG, "detect mesh root ip changed, force sbus restart");
                        is_force_sbus_restart = 1;
                    }else
                        retry_timeout = 2000/DEV_WORK_LOOP_INTERVAL;
                }else{
                    retry_timeout--;
                }
            }
        }

        vTaskDelayUntil(&next_wake_time, pdMS_TO_TICKS(DEV_WORK_LOOP_INTERVAL));    
    }
    sbus_stop();
    vTaskDelete(NULL);
}

Steps to reproduce the behavior

I used 15 modules to network, and after 7 days of operation, 2 modules had this situation

Project release version

mesh lite version:v0.9.0 - 2023-10-31

System architecture

ARM 64-bit (Apple M1/M2, Raspberry Pi 4/5)

Operating system

Windows

Operating system version

freeRTOS

Shell

other (details in Additional context)

Additional context

No response

Can you provide the log? esp_mesh_lite_get_level returns 0, which means WiFi is not connected properly.

Can you provide the log? esp_mesh_lite_get_level returns 0, which means WiFi is not connected properly.

there is no more log.this happen in the code "uint8_t layer = esp_mesh_lite_get_level();". If I execute the function "esp_restart" and then restart, it's still the same. If I reset via hardware, the function "esp_mesh_lite_get_level" returns 1 or greater than 1 and then it works.

Can you provide the log? esp_mesh_lite_get_level returns 0, which means WiFi is not connected properly.

Uploading 勘察箱异常数据日志.txt…

Can you provide the log? esp_mesh_lite_get_level returns 0, which means WiFi is not connected properly.

The device is next to the router, and it doesn't feel like it's not connected to Wifi

Please update mesh lite to the latest version and try again.