问题1:End Device是低功耗设备, 有电池供电, 节点在断网以后,如何能够禁止节点持续搜索网络,或者把发送Beacon Request间隔增大
1)启动搜索网络 uint8 ZDApp_StartJoiningCycle( void )------------这两个函数是否可以在终端设备哪里,设置一下
停止搜索网络 uint8 ZDApp_StopJoiningCycle( void )
2) 更改发送Beacon Request的周期
修改变量zgDefaultStartingScanDuration
在NWK--NLMEDE.h文件里面
// Beacon Order Values
#define BEACON_ORDER_NO_BEACONS 15
#define BEACON_ORDER_4_MINUTES 14 // 245760 milliseconds
#define BEACON_ORDER_2_MINUTES 13 // 122880 milliseconds
#define BEACON_ORDER_1_MINUTE 12 // 61440 milliseconds
#define BEACON_ORDER_31_SECONDS 11 // 30720 milliseconds
#define BEACON_ORDER_15_SECONDS 10 // 15360 MSecs
#define BEACON_ORDER_7_5_SECONDS 9 // 7680 MSecs
#define BEACON_ORDER_4_SECONDS 8 // 3840 MSecs
#define BEACON_ORDER_2_SECONDS 7 // 1920 MSecs
#define BEACON_ORDER_1_SECOND 6 // 960 MSecs
#define BEACON_ORDER_480_MSEC 5
#define BEACON_ORDER_240_MSEC 4
#define BEACON_ORDER_120_MSEC 3
#define BEACON_ORDER_60_MSEC 2
#define BEACON_ORDER_30_MSEC 1
#define BEACON_ORDER_15_MSEC 0
这个值是通过// Default starting scan duration给zgDefaultStartingScanDuration赋值的。
uint8 zgDefaultStartingScanDuration = STARTING_SCAN_DURATION;
uint8 zgDefaultStartingScanDuration = STARTING_SCAN_DURATION;
3)在ZDO_StartDevice函数里面有 协调器建立网络,终端和路由器加入网络的过程。我们只看终端加入网络的过程。其他过程可以对比相看。
if ( ZG_BUILD_JOINING_TYPE && (logicalType == NODETYPE_ROUTER || logicalType == NODETYPE_DEVICE) ) 首先我们来看是否是路由器或者终端进入这里面
{NLME_NetworkDiscoveryRequest
if ( (startMode == MODE_JOIN) || (startMode == MODE_REJOIN) )
{
devState = DEV_NWK_DISC;
#if defined( MANAGED_SCAN )//没有定义
ZDOManagedScan_Next();
ret = NLME_NetworkDiscoveryRequest( managedScanChannelMask, BEACON_ORDER_15_MSEC );//
#else
ret = NLME_NetworkDiscoveryRequest( zgDefaultChannelList, zgDefaultStartingScanDuration );//执行了这个函数。这个函数就是发beacon request 函数,同时选择了信道和扫描周期 。扫描周期间上面。
#if defined ( ZIGBEE_FREQ_AGILITY )//定义了
if ( !( ZDO_Config_Node_Descriptor.CapabilityFlags & CAPINFO_RCVR_ON_IDLE ) && //如果发了四次beacon request 都没有加入网络,那么就进想全频段扫描
( ret == ZSuccess ) && ( ++discRetries == 4 ) )
{
// For devices with RxOnWhenIdle equals to FALSE, any network channel
// change will not be recieved. On these devices or routers that have
// lost the network, an active scan shall be conducted on the Default
// Channel list using the extended PANID to find the network. If the
// extended PANID isn't found using the Default Channel list, an scan
// should be completed using all channels.
zgDefaultChannelList = MAX_CHANNELS_24GHZ; //嗯建立网络了四次,如果没有建立成功就开始全部扫描了
}
#endif // ZIGBEE_FREQ_AGILITY
#if defined ( ZIGBEE_COMMISSIONING )
if (startMode == MODE_REJOIN && scanCnt++ >= 5 )//如果重加了5次,那么就会出现重新加入将信道的给发生变化
{
// When ApsUseExtendedPanID is commissioned to a non zero value via
// application specific means, the device shall conduct an active scan
// on the Default Channel list and join the PAN with the same
// ExtendedPanID. If the PAN is not found, an scan should be completed
// on all channels.
// When devices rejoin the network and the PAN is not found from
zgDefaultChannelList = MAX_CHANNELS_24GHZ;
}
#endif // ZIGBEE_COMMISSIONING
#endif
}
else if ( startMode == MODE_RESUME )
{
if ( logicalType == NODETYPE_ROUTER )
{
ZMacScanCnf_t scanCnf;
devState = DEV_NWK_ORPHAN;//失去了双亲的信息
/* if router and nvram is available, fake successful orphan scan */
scanCnf.hdr.Status = ZSUCCESS;
scanCnf.ScanType = ZMAC_ORPHAN_SCAN;
scanCnf.UnscannedChannels = 0;
scanCnf.ResultListSize = 0;
nwk_ScanJoiningOrphan(&scanCnf);
ret = ZSuccess;
}
else //终端,直接进行孤立扫描
{
devState = DEV_NWK_ORPHAN;
ret = NLME_OrphanJoinRequest( zgDefaultChannelList, //终端是发出孤立申明。
zgDefaultStartingScanDuration );
}
}
else
{
#if defined( LCD_SUPPORTED )
HalLcdWriteScreen( "StartDevice ERR", "MODE unknown" );
#endif
}
}
if ( ret != ZSuccess )//1s后再进行ZD0_NETWORK_INIT
{
osal_start_timerEx(ZDAppTaskID, ZDO_NETWORK_INIT, NWK_RETRY_DELAY );
}
}
{NLME_NetworkDiscoveryRequest
if ( (startMode == MODE_JOIN) || (startMode == MODE_REJOIN) )
{
devState = DEV_NWK_DISC;
#if defined( MANAGED_SCAN )//没有定义
ZDOManagedScan_Next();
ret = NLME_NetworkDiscoveryRequest( managedScanChannelMask, BEACON_ORDER_15_MSEC );//
#else
ret = NLME_NetworkDiscoveryRequest( zgDefaultChannelList, zgDefaultStartingScanDuration );//执行了这个函数。这个函数就是发beacon request 函数,同时选择了信道和扫描周期 。扫描周期间上面。
#if defined ( ZIGBEE_FREQ_AGILITY )//定义了
if ( !( ZDO_Config_Node_Descriptor.CapabilityFlags & CAPINFO_RCVR_ON_IDLE ) && //如果发了四次beacon request 都没有加入网络,那么就进想全频段扫描
( ret == ZSuccess ) && ( ++discRetries == 4 ) )
{
// For devices with RxOnWhenIdle equals to FALSE, any network channel
// change will not be recieved. On these devices or routers that have
// lost the network, an active scan shall be conducted on the Default
// Channel list using the extended PANID to find the network. If the
// extended PANID isn't found using the Default Channel list, an scan
// should be completed using all channels.
zgDefaultChannelList = MAX_CHANNELS_24GHZ; //嗯建立网络了四次,如果没有建立成功就开始全部扫描了
}
#endif // ZIGBEE_FREQ_AGILITY
#if defined ( ZIGBEE_COMMISSIONING )
if (startMode == MODE_REJOIN && scanCnt++ >= 5 )//如果重加了5次,那么就会出现重新加入将信道的给发生变化
{
// When ApsUseExtendedPanID is commissioned to a non zero value via
// application specific means, the device shall conduct an active scan
// on the Default Channel list and join the PAN with the same
// ExtendedPanID. If the PAN is not found, an scan should be completed
// on all channels.
// When devices rejoin the network and the PAN is not found from
zgDefaultChannelList = MAX_CHANNELS_24GHZ;
}
#endif // ZIGBEE_COMMISSIONING
#endif
}
else if ( startMode == MODE_RESUME )
{
if ( logicalType == NODETYPE_ROUTER )
{
ZMacScanCnf_t scanCnf;
devState = DEV_NWK_ORPHAN;//失去了双亲的信息
/* if router and nvram is available, fake successful orphan scan */
scanCnf.hdr.Status = ZSUCCESS;
scanCnf.ScanType = ZMAC_ORPHAN_SCAN;
scanCnf.UnscannedChannels = 0;
scanCnf.ResultListSize = 0;
nwk_ScanJoiningOrphan(&scanCnf);
ret = ZSuccess;
}
else //终端,直接进行孤立扫描
{
devState = DEV_NWK_ORPHAN;
ret = NLME_OrphanJoinRequest( zgDefaultChannelList, //终端是发出孤立申明。
zgDefaultStartingScanDuration );
}
}
else
{
#if defined( LCD_SUPPORTED )
HalLcdWriteScreen( "StartDevice ERR", "MODE unknown" );
#endif
}
}
if ( ret != ZSuccess )//1s后再进行ZD0_NETWORK_INIT
{
osal_start_timerEx(ZDAppTaskID, ZDO_NETWORK_INIT, NWK_RETRY_DELAY );
}
}