This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

加密后不能通讯

协调器和单一终端通讯

配置如下:

zgPreConfigKeys = TRUE

加密:SECURE=1 ,ZG_SECURE_DYNAMIC=1;

不能入网了终端,ZG_SECURE_DYNAMIC=0也试过还是不能通讯,终端入网过后立即就退网了,不晓得怎么回事

在这个osal_memcpy( zgPreConfigKey, defaultKey, SEC_KEY_LEN );加入断点,主机的defaultKey和终端的defaultKey,都是一样的

  • 协调器和终端那边的设置都一样吗? 

    另外你把协调器和终端的程序用flash programmer擦除掉,然后重新烧写程序来测试下。

    最后请把你的测试的抓包的log上传出来

  • 加密设置只有

    zgPreConfigKeys = TRUE

    加密:SECURE=1 ,ZG_SECURE_DYNAMIC=1;

    这三个参数么?

    抓包的数据如何看?

  • 还有就是怎样才算加密成功呢?

  • 我的抓包器被人借了,晚点传上来。你们有没有关于SmartRF Packet Sniffer的使用手册

  • 一般ZG_SECURE_DYNAMIC设置为0

    如果设备两端的设置都一样的,在入网的时候会有秘钥分配,并且成功解密的,说明加密功能是正常的。

  • 抓包已经上传,请帮忙看看是怎么回事

  • 会不会是秘钥发生了变化,刚刚看到你们有个资料说的秘钥是可以升级的,不过由于是全英文,看不太懂

  • 上传截图等于没有上传一样,

    要另存为psd文件,这样我才可以打开解析啊!

  • 这样可以么

  • 从你的抓包数据来看,是父设备没有发出来tranport key。

    这样吧,你重新安装一个新的协议栈,没有任何改动的

    你使用的协议栈版本

    然后把SECURE=1,zgPreConfigKeys = TRUE加上去,做下测试。

    我这边也可以做同样的验证。

  • 好的,我试一下,

    我断点调试的时候走到status = osal_nv_item_init( ZCD_NV_PRECFGKEY, SEC_KEY_LEN, zgPreConfigKey );

    osal_nv_item_init()返回是NV_ITEM_UNINIT而不是ZSUCCESS所以没有进入

    if ( status == ZSUCCESS )
      {
        if ( setDefault )
        {
          // Write the default value back to NV
          status =  osal_nv_write( ZCD_NV_PRECFGKEY, 0, SEC_KEY_LEN, zgPreConfigKey );
        }
      }

  • 不会是你的工作电压有问题吧!

  • 我实际测量供电电压,协调器是3.3V。终端是3V因为终端是电池供电。而且在不加密的情况下,协调器和终端都能正常工作。

  • VV 大神我找到一点原因,就是我在NV操作的时候使用了

    void ClearNCnetmessage(void)
    {
        uint8 pg;
         for ( pg = OSAL_NV_PAGE_BEG; pg <= OSAL_NV_PAGE_END; pg++ )
          {
                        HalFlashErase(pg);
          }
    }

    函数,于是运行 status = osal_nv_item_init( ZCD_NV_PRECFGKEY, SEC_KEY_LEN, zgPreConfigKey );返回status的值总是不对

    但是第一就是void ClearNCnetmessage(void)的目的是想清空网络保留的数据,他把密码部分也操作了。

    还有就是就算不用 void ClearNCnetmessage(void)函数也仅仅是status == ZSUCCESS成立,setDefault的值还是零,而且我重新安装了协议栈到这一步的时候setDefault也为零。

    if ( status == ZSUCCESS )
      {
        

        if ( setDefault )
        {
          // Write the default value back to NV
          status =  osal_nv_write( ZCD_NV_PRECFGKEY, 0, SEC_KEY_LEN, zgPreConfigKey );
        }
        
      }

     

  •  

    YY大神我直接把程序改成这样了也不能通讯

    status = osal_nv_item_init( ZCD_NV_PRECFGKEY, SEC_KEY_LEN, zgPreConfigKey );
      status =  osal_nv_write( ZCD_NV_PRECFGKEY, 0, SEC_KEY_LEN, zgPreConfigKey );
      if ( status == ZSUCCESS )
      {
        

        if ( setDefault )
        {
          // Write the default value back to NV
          status =  osal_nv_write( ZCD_NV_PRECFGKEY, 0, SEC_KEY_LEN, zgPreConfigKey );
        }
        
      }

      // clear local copy of default key
      osal_memset(zgPreConfigKey, 0x00, SEC_KEY_LEN);

      return (status);
    }

  • VV大神,我重新安装了协议栈,可以加密并正常通讯。我把我的程序回复到最开始还是不能通讯。我使用对比软件比较发现两者程序都一样。后来我发现我的程序多定义了

    NV_RESTORE
    NV_INIT
    POWER_SAVING

    去掉这三个定义,加密也可以通讯。但是这三项在设计中必须的要得呀。如何处理?

  • vv大神我的加密还没有解决,我认为现象是秘钥出了问题,有没有在调试的过程中看到当前网络秘钥的办法

  • 清空网络保留的数据,不是用这个来做的,直接修改startoption,然后重启就可以了。

    // Set the NV startup option to force a "new" join.
    zgWriteStartupOptions( ZG_STARTUP_SET, ZCD_STARTOPT_DEFAULT_NETWORK_STATE );

    // The device has been in the UNAUTH state, so reset
    // Note: there will be no return from this call
    SystemResetSoft();