[填坑]ESP32修改softap IP地址后WiFi信号丢失问题

问题描述

ESP32 使用softap模式,默认网关地址为192.168.4.1,默认网络地址为192.168.4.1,可以使用tcpip_adapter_set_ip_info 进行自定义配置,该函数描述可以参考:链接

IDF文档描述指出,使用该函数之前应该停止DHCP服务,配置完成后再开启。按照该指导信息编写了如下代码(基于ESP_IDF release/v3.3):


    tcpip_adapter_init();
    tcpip_adapter_ip_info_t ip_info = {        
        .ip.addr = ipaddr_addr("192.168.43.42"),        
        .netmask.addr = ipaddr_addr("255.255.255.0"),        
        .gw.addr      = ipaddr_addr("192.168.43.42"),    
    };    
    ESP_ERROR_CHECK(tcpip_adapter_dhcps_stop(TCPIP_ADAPTER_IF_AP));    
    ESP_ERROR_CHECK(tcpip_adapter_set_ip_info(TCPIP_ADAPTER_IF_AP, &ip_info));    
    ESP_ERROR_CHECK(tcpip_adapter_dhcps_start(TCPIP_ADAPTER_IF_AP));
   
    ESP_ERROR_CHECK(esp_event_loop_init(event_handler, NULL))
    
    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    ESP_ERROR_CHECK(esp_wifi_init(&cfg));
    ESP_ERROR_CHECK(esp_wifi_get_mac(ESP_IF_WIFI_AP, mac));
    
    wifi_config_t wifi_config;
    memcpy(wifi_config.ap.ssid ,WIFI_SSID,strlen(WIFI_SSID)+1) ;
    wifi_config.ap.ssid_len = strlen(WIFI_SSID);
    memcpy(wifi_config.ap.password ,WIFI_PWD,strlen(WIFI_PWD)+1) ;
    wifi_config.ap.max_connection = MAX_STA_CONN;
    wifi_config.ap.authmode = WIFI_AUTH_WPA_WPA2_PSK;

    ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP));
    ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_AP, &wifi_config));
    ESP_ERROR_CHECK(esp_wifi_start());

以上代码出现以下现象:

  1. monitor无任何报错信息。
  2. WiFi 信号无法被搜索到(测试三台手机无法搜索到,只有一个电脑网卡可以搜索到型号: rtl8812AU_tenda_u12)。
  3. 能够搜索到WiFi信号的电脑网卡,可以正常链接和传输,且能获得修改后的网络段地址。
  4. 还原代码的修改,重新烧录,WiFi信号也搜不到了(需要erase flash 才能恢复)

解决方法

将修改softap IP的操作放置于esp_wifi_start之后,问题解决,原理不明,可能需要进一步查看WiFi相关驱动代码

    tcpip_adapter_init();
    ESP_ERROR_CHECK(esp_event_loop_init(event_handler, NULL))
    
    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    ESP_ERROR_CHECK(esp_wifi_init(&cfg));
    ESP_ERROR_CHECK(esp_wifi_get_mac(ESP_IF_WIFI_AP, mac));

    wifi_config_t wifi_config;
    memcpy(wifi_config.ap.ssid ,WIFI_SSID,strlen(WIFI_SSID)+1) ;
    wifi_config.ap.ssid_len = strlen(WIFI_SSID);
    memcpy(wifi_config.ap.password ,WIFI_PWD,strlen(WIFI_PWD)+1) ;
    wifi_config.ap.max_connection = MAX_STA_CONN;
    wifi_config.ap.authmode = WIFI_AUTH_WPA_WPA2_PSK;

    ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP));
    ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_AP, &wifi_config));
    ESP_ERROR_CHECK(esp_wifi_start());


    tcpip_adapter_ip_info_t ip_info = {        
        .ip.addr = ipaddr_addr("192.168.43.42"),        
        .netmask.addr = ipaddr_addr("255.255.255.0"),        
        .gw.addr      = ipaddr_addr("192.168.43.42"),    
    };    
    ESP_ERROR_CHECK(tcpip_adapter_dhcps_stop(TCPIP_ADAPTER_IF_AP));    
    ESP_ERROR_CHECK(tcpip_adapter_set_ip_info(TCPIP_ADAPTER_IF_AP, &ip_info));    
    ESP_ERROR_CHECK(tcpip_adapter_dhcps_start(TCPIP_ADAPTER_IF_AP));

你可能感兴趣的:(填坑,ESP系列物联网开发教程)