WIFI Mesh wifi SSID存储问题
Posted: Mon Jul 01, 2024 3:31 am
在程序中,我使用了
函数读取WiFI STA存储在NVS中的信息,然后在将读到的信息使用esp_mesh_set_config函数设置Mesh网络,给Mesh 配网是使用字节写的ble通讯将app配置的WiFi配置及Mesh配置接收,WiFi信息调用如下方法写入配置:
Mesh使用如下方法写入:
现在的问题是,Mesh 组网完成后,如果节点是根节点,所有配置信息都正常,如果不上根节点,esp_wifi_set_config函数写入的配置信息会丢失,就算写入的时候是根节点,已经确认没有丢失,下如重启如果已经有根节点,前面存储的wifi信息就会丢失
- esp_err_t err = esp_wifi_get_config(ESP_IF_WIFI_STA, &wifi_config);
- 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;
- }
- }
- 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;
- }