void Change_PanId( uint16 new_panid )
{
uint16 pan_id = new_panid;
uint8 extenPanId[8];
//获取本板MAC地址
osal_memcpy(extenPanId , NLME_GetExtAddr(),(8*sizeof(uint8)));
_NIB.nwkPanId = pan_id;
//将本版MAC地址作为64位扩展PANID,以防重启后extendedPANID影响连接至Coordinater
osal_cpyExtAddr(_NIB.extendedPANID , extenPanId );
//将64位_NIB.nwkCoordExtAddress置零
osal_memset( _NIB.nwkCoordExtAddress, 0, Z_EXTADDR_LEN );
NLME_UpdateNV(0x01);
zgConfigPANID = pan_id;
osal_cpyExtAddr( zgExtendedPANID,extenPanId );
osal_nv_write(ZCD_NV_PANID, 0, osal_nv_item_len( ZCD_NV_PANID ), &zgConfigPANID);
osal_nv_write(ZCD_NV_EXTENDED_PAN_ID, 0 , Z_EXTADDR_LEN, zgExtendedPANID);
//RESET_TIME事件为SystemReset()
osal_start_timerEx( GenericApp_TaskID , RESET_TIME , 3000);
//zgWriteStartupOptions(ZG_STARTUP_SET, ZCD_STARTOPT_DEFAULT_NETWORK_STATE);
}
该函数需要预编译NV_RESTORE(即在Project->options->C/C++ Compiler->Proprocessor中的Defined symbols中添加代码NV_RESTORE=TRUE)
对于某些重启设置成功,但某些时候不能连接上Coordinater,在init函数中开启定时器,若n s没有变成连接上网络,调用一下函数再重启一次即可。
void Reset_PanId( void )
{
uint16 pan_id ;
uint8 extenPanId[8];
osal_memcpy(extenPanId , NLME_GetExtAddr(),(8*sizeof(uint8)));
osal_memcpy(&pan_id, &_NIB.nwkPanId, sizeof(uint16));
_NIB.nwkPanId = pan_id;
osal_cpyExtAddr(_NIB.extendedPANID , extenPanId );
osal_memset( _NIB.nwkCoordExtAddress, 0, Z_EXTADDR_LEN );
NLME_UpdateNV(0x01);
zgConfigPANID = pan_id;
osal_cpyExtAddr( zgExtendedPANID,exterPanId );
osal_nv_write(ZCD_NV_PANID, 0, osal_nv_item_len( ZCD_NV_PANID ), &zgConfigPANID);
osal_nv_write(ZCD_NV_EXTENDED_PAN_ID, 0 , Z_EXTADDR_LEN, zgExtendedPANID);
osal_start_timerEx( GenericApp_TaskID , RESET_TIME , 3000);
}