从NV中读取之前保存的网络信息

本文介绍了一个函数ZDApp_RestoreNetworkState,该函数用于从非易失性存储(NV)中恢复之前保存的网络信息。首先初始化NWK NV项,接着尝试从NV中恢复信息。如果设备是协调器,会设置相应的逻辑类型,并恢复设备启动模式。此外,如果安全功能启用,函数还会处理网络密钥的恢复。最后,根据NV操作的状态返回网络状态恢复的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

改函数的功能就是读取NV之前保存的网络信息,将之前写进NV中的信息读出来:
uint8 ZDApp_RestoreNetworkState( void )
{
  uint8 nvStat;
  nwkActiveKeyItems keyItems;

  // Initialize NWK NV items
  nvStat = NLME_InitNV();

  if ( nvStat != NV_OPER_FAILED )
  {
    if ( NLME_RestoreFromNV() )
    {
      // Are we a coordinator
      ZDAppNwkAddr.addr.shortAddr = NLME_GetShortAddr();
      if ( ZDAppNwkAddr.addr.shortAddr == 0 )
        ZDO_Config_Node_Descriptor.LogicalType = NODETYPE_COORDINATOR;
      devStartMode = MODE_RESUME;
      osal_cpyExtAddr( ZDO_UseExtendedPANID, _NIB.extendedPANID );
    }
    else
      nvStat = NV_ITEM_UNINIT;

    if ( ZG_SECURE_ENABLED )
    {
      nwkFrameCounterChanges = 0;
      osal_memset( &keyItems, 0, sizeof( nwkActiveKeyItems ) );
      osal_nv_item_init( ZCD_NV_NWKKEY, sizeof(nwkActiveKeyItems), (void *)&keyItems );

      if ( ZG_BUILD_COORDINATOR_TYPE && ZG_DEVICE_COORDINATOR_TYPE )
      {
        ZDApp_RestoreNwkKey();
      }
    }

    // The default for RxOnWhenIdle is true for Routers and false for end devices
    // [setup in the NLME_RestoreFromNV()].  Change it here if you want something
    // other than default.
  }

  if ( nvStat == ZSUCCESS )
    return ( ZDO_INITDEV_RESTORED_NETWORK_STATE );
  else
    return ( ZDO_INITDEV_NEW_NETWORK_STATE );
}
ESP32的Non-Volatile (NV) 区,也称为闪存分区,通常用于存储像用户配置、应用程序数据等不需要频繁擦除的信息。要读取ESP32 NV区的内容,首先需要通过编程接口,如AT commands、SDK库或者第三方库如`esp_err_t esp_nvs_flash_read(const char *tag, void *dest, size_t length)`。 这里是一个简单的步骤概述: 1. **初始化NVS**:在程序启动时,需要先初始化ESP32的NVS模块。你可以使用`nvs_flash_init()`函数完成此操作。 ```c esp_err_t ret = nvs_flash_init(); if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { // 如果内存不足或者发现旧版本,可以尝试清除并创建新的NVS分区 ret = nvs_flash_erasepartition(NVS_DEFAULT_PARTITION_ID); } ``` 2. **打开NVS区域**:使用`esp_err_t esp_nvs_open(const char* tag, esp_nvs_mode_t mode, esp_nvs_handle *handle)`函数打开指定的NVS区域。 ```c esp_nvs_handle handle; esp_err_t open_ret = esp_nvs_open("my_nv_tag", NVS_READ_ONLY, &handle); ``` 3. **读取内容**:如果打开成功,可以用`esp_err_t esp_nvs_read(esp_nvs_handle handle, const char* key, void* value, size_t len)`来读取数据。 ```c char buffer[100]; open_ret = esp_nvs_read(handle, "my_key", buffer, sizeof(buffer)); ``` 4. **处理结果**:检查`open_ret`和`esp_nvs_read`的返回值,如果一切正常,`buffer`将包含从NV读取的数据。 5. **关闭NVS**:读取完成后别忘了释放资源,使用`esp_err_t esp_nvs_close(esp_nvs_handle handle)`。 ```c esp_err_t close_ret = esp_nvs_close(handle); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值