在程序中,我使用了
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信息调用如下方法写入配置:
void config_wifi(char *ssid, char *pwd, uint8_t bssid[6]) {
bitSet(state_flag, BIT_CONFIG_DISCONNECT); //设置配网断开标志
esp_wifi_stop(); // 停止Wi-Fi(如果它正在运行)
ESP_ERROR_CHECK( esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &ip_event_handler, NULL)); //注册WiFi事件
// 清除之前的配置(可选,但推荐)
wifi_config_t wifi_config = { .sta.threshold.authmode = WIFI_AUTH_OPEN,
.sta.pmf_cfg = { .capable = false, .required = false }, };
if (ESP_OK != esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config)) {
ESP_LOGE(MESH_TAG, "Failed to clear WiFi STA configuration");
return;
}
// 设置新的Wi-Fi配置
strcpy((char*) wifi_config.sta.ssid, ssid);
strcpy((char*) wifi_config.sta.password, pwd);
if(bssid!=NULL){
memcpy((uint8_t *) &wifi_config.sta.bssid, bssid, 6);
}
esp_wifi_set_storage(WIFI_STORAGE_FLASH);
esp_wifi_set_mode(WIFI_MODE_STA);
ESP_LOGI(MESH_TAG,"配置的SSID:%s,密码:%s",(char*)wifi_config.sta.ssid,(char*)wifi_config.sta.password);
if (ESP_OK != esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config)) {
ESP_LOGE(MESH_TAG, "Failed to set WiFi configuration");
return;
}
// 启动Wi-Fi
if (ESP_OK != esp_wifi_start()) {
ESP_LOGE(MESH_TAG, "Failed to start WiFi");
return;
}
}
Mesh使用如下方法写入:
typedef struct {
uint8_t mesh_id[6]; /**<Mesh ID*/
char mesh_ap_pwd[16]; /**< 密码最大长度为16字符(包括终止符'\0')*/
} nvs_mesh_info_t;
// 写入Mesh配置的函数
esp_err_t esp_nvs_write_mesh_info(const nvs_mesh_info_t *mesh_config) {
esp_err_t err;
nvs_handle_t nvs_handle;
// 打开NVS命名空间
err = nvs_open(MESH_NAMESPACE, NVS_READWRITE, &nvs_handle);
if (err != ESP_OK) {
ESP_LOGE(NVS_TAG,"打开%s失败,原因:%s",MESH_NAMESPACE,esp_err_to_name(err));
return err;
}
// 写入Mesh ID
err = nvs_set_blob(nvs_handle, MESH_ID_KEY, &mesh_config->mesh_id, sizeof(mesh_config->mesh_id));
if (err != ESP_OK) {
nvs_close(nvs_handle);
ESP_LOGE(NVS_TAG,"写入mesh_id失败,原因:%s",esp_err_to_name(err));
return err;
}
// 写入Mesh密码
err = nvs_set_str(nvs_handle, MESH_PWD_KEY, mesh_config->mesh_ap_pwd);
if (err != ESP_OK) {
nvs_close(nvs_handle);
ESP_LOGE(NVS_TAG,"写入mesh_ap_pwd失败,原因:%s",esp_err_to_name(err));
return err;
}
// ESP_LOGE(NVS_TAG,"写入Mesh Id:%02x:%02x:%02x:%02x:%02x:%02x,Mesh pwd:%s",
// mesh_config->mesh_id[0],mesh_config->mesh_id[1],mesh_config->mesh_id[2],
// mesh_config->mesh_id[3],mesh_config->mesh_id[4],mesh_config->mesh_id[5],
// mesh_config->mesh_ap_pwd);
// 提交更改
err = nvs_commit(nvs_handle);
if (err != ESP_OK) {
nvs_close(nvs_handle);
return err;
}
// 关闭NVS句柄
nvs_close(nvs_handle);
//仅验证一下写入的内容是否正确
//nvs_mesh_info_t rm_i;
//esp_nvs_read_mesh_info(&rm_i);
return ESP_OK;
}
现在的问题是,Mesh 组网完成后,如果节点是根节点,所有配置信息都正常,如果不上根节点,esp_wifi_set_config函数写入的配置信息会丢失,就算写入的时候是根节点,已经确认没有丢失,下如重启如果已经有根节点,前面存储的wifi信息就会丢失