WIFI Mesh wifi SSID存储问题

clg123
Posts: 4
Joined: Tue May 21, 2024 7:28 am

WIFI Mesh wifi SSID存储问题

Postby clg123 » Mon Jul 01, 2024 3:31 am

在程序中,我使用了
  1. esp_err_t err = esp_wifi_get_config(ESP_IF_WIFI_STA, &wifi_config);
函数读取WiFI STA存储在NVS中的信息,然后在将读到的信息使用esp_mesh_set_config函数设置Mesh网络,给Mesh 配网是使用字节写的ble通讯将app配置的WiFi配置及Mesh配置接收,WiFi信息调用如下方法写入配置:
  1. void config_wifi(char *ssid, char *pwd, uint8_t bssid[6]) {
  2.     bitSet(state_flag, BIT_CONFIG_DISCONNECT);   //设置配网断开标志
  3.     esp_wifi_stop();   // 停止Wi-Fi(如果它正在运行)
  4.     ESP_ERROR_CHECK( esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &ip_event_handler, NULL)); //注册WiFi事件
  5.     // 清除之前的配置(可选,但推荐)
  6.     wifi_config_t wifi_config = { .sta.threshold.authmode = WIFI_AUTH_OPEN,
  7.             .sta.pmf_cfg = { .capable = false, .required = false }, };
  8.     if (ESP_OK != esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config)) {
  9.         ESP_LOGE(MESH_TAG, "Failed to clear WiFi STA configuration");
  10.         return;
  11.     }
  12.     // 设置新的Wi-Fi配置
  13.     strcpy((char*) wifi_config.sta.ssid, ssid);
  14.     strcpy((char*) wifi_config.sta.password, pwd);
  15.     if(bssid!=NULL){
  16.         memcpy((uint8_t *) &wifi_config.sta.bssid, bssid, 6);
  17.     }
  18.     esp_wifi_set_storage(WIFI_STORAGE_FLASH);
  19.     esp_wifi_set_mode(WIFI_MODE_STA);
  20.     ESP_LOGI(MESH_TAG,"配置的SSID:%s,密码:%s",(char*)wifi_config.sta.ssid,(char*)wifi_config.sta.password);
  21.     if (ESP_OK != esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config)) {
  22.         ESP_LOGE(MESH_TAG, "Failed to set WiFi configuration");
  23.         return;
  24.     }
  25.     // 启动Wi-Fi
  26.     if (ESP_OK != esp_wifi_start()) {
  27.         ESP_LOGE(MESH_TAG, "Failed to start WiFi");
  28.         return;
  29.     }
  30. }
Mesh使用如下方法写入:
  1. typedef struct  {
  2.      uint8_t mesh_id[6];  /**<Mesh ID*/
  3.      char mesh_ap_pwd[16];   /**< 密码最大长度为16字符(包括终止符'\0')*/
  4. } nvs_mesh_info_t;
  5.  
  6. // 写入Mesh配置的函数
  7. esp_err_t esp_nvs_write_mesh_info(const nvs_mesh_info_t *mesh_config) {
  8.     esp_err_t err;
  9.     nvs_handle_t nvs_handle;
  10.     // 打开NVS命名空间
  11.     err = nvs_open(MESH_NAMESPACE, NVS_READWRITE, &nvs_handle);
  12.     if (err != ESP_OK) {
  13.         ESP_LOGE(NVS_TAG,"打开%s失败,原因:%s",MESH_NAMESPACE,esp_err_to_name(err));
  14.         return err;
  15.     }
  16.     // 写入Mesh ID
  17.     err = nvs_set_blob(nvs_handle, MESH_ID_KEY, &mesh_config->mesh_id, sizeof(mesh_config->mesh_id));
  18.     if (err != ESP_OK) {
  19.         nvs_close(nvs_handle);
  20.         ESP_LOGE(NVS_TAG,"写入mesh_id失败,原因:%s",esp_err_to_name(err));
  21.         return err;
  22.     }
  23.     // 写入Mesh密码
  24.     err = nvs_set_str(nvs_handle, MESH_PWD_KEY, mesh_config->mesh_ap_pwd);
  25.     if (err != ESP_OK) {
  26.         nvs_close(nvs_handle);
  27.         ESP_LOGE(NVS_TAG,"写入mesh_ap_pwd失败,原因:%s",esp_err_to_name(err));
  28.         return err;
  29.     }
  30. //  ESP_LOGE(NVS_TAG,"写入Mesh Id:%02x:%02x:%02x:%02x:%02x:%02x,Mesh pwd:%s",
  31. //          mesh_config->mesh_id[0],mesh_config->mesh_id[1],mesh_config->mesh_id[2],
  32. //          mesh_config->mesh_id[3],mesh_config->mesh_id[4],mesh_config->mesh_id[5],
  33. //          mesh_config->mesh_ap_pwd);
  34.     // 提交更改
  35.     err = nvs_commit(nvs_handle);
  36.     if (err != ESP_OK) {
  37.         nvs_close(nvs_handle);
  38.         return err;
  39.     }
  40.  
  41.     // 关闭NVS句柄
  42.     nvs_close(nvs_handle);
  43.     //仅验证一下写入的内容是否正确
  44.     //nvs_mesh_info_t rm_i;
  45.     //esp_nvs_read_mesh_info(&rm_i);
  46.     return ESP_OK;
  47. }
现在的问题是,Mesh 组网完成后,如果节点是根节点,所有配置信息都正常,如果不上根节点,esp_wifi_set_config函数写入的配置信息会丢失,就算写入的时候是根节点,已经确认没有丢失,下如重启如果已经有根节点,前面存储的wifi信息就会丢失

Who is online

Users browsing this forum: Bing [Bot] and 50 guests