if ( devState == DEV_HOLD ) {
zgWriteStartupOptions( ZG_STARTUP_SET, ZCD_STARTOPT_DEFAULT_NETWORK_STATE );
osal_set_event( ZDAppTaskID, ZDO_STATE_CHANGE_EVT );
return ( ZDO_INITDEV_LEAVE_NOT_STARTED ); }
#if defined ( NV_RESTORE ) //NV_RESTORE编译不通过,NV_RESTORE主要是设置掉电再重新上电,参数是否保留
if ( HalKeyRead() == SW_BYPASS_NV )
networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE; else {
networkStateNV = ZDApp_ReadNetworkRestoreState(); }
if ( networkStateNV == ZDO_INITDEV_RESTORED_NETWORK_STATE ) {
networkStateNV = ZDApp_RestoreNetworkState(); } else {
NLME_InitNV();
NLME_SetDefaultNV(); } #endif
if ( networkStateNV == ZDO_INITDEV_NEW_NETWORK_STATE ) {
ZDAppDetermineDeviceType(); //确定设备类型
extendedDelay = (uint16)((NWK_START_DELAY + startDelay) + (osal_rand() & EXTENDED_JOINING_RANDOM_MASK)); }
ZDApp_SecInit( networkStateNV );// 初始化设备对象的安全操作 ZDApp_NetworkInit( extendedDelay ); //进行网络的初始化
NLME_SetBroadcastFilter( ZDO_Config_Node_Descriptor.CapabilityFlags ); //网络层函数,代码看不到,看函数名字是设置广播地址掩码来支持广播过滤。不太明白这个。。。
return ( networkStateNV ); }
关于ZStack-CC2530-2.3.0-1.4.0中simpleApp例子的组网(二)
继续进入到网络初始化函数中看一下,代码如下:
void ZDApp_NetworkInit( uint16 delay ) {
if ( delay ) {
// Wait awhile before starting the device
osal_start_timerEx( ZDAppTaskID, ZDO_NETWORK_INIT, delay );//这个函数是设置一个延时时间,延时时间到后,ZDO_NETWORK_INIT事件发生。 } else {
osal_set_event( ZDAppTaskID, ZDO_NETWORK_INIT );//立即发生ZDO_NETWORK_INIT 事件 } }
好,继续去ZDO层 看一下,程序是怎么对ZDO_NETWORK_INIT 网络初始化事件处理的,在UINT16 ZDApp_event_loop( uint8 task_id, UINT16 events )函数中找到:
if ( events & ZDO_NETWORK_INIT ) {
// Initialize apps and start the network
devState = DEV_INIT; //将设备状态修改为初始化状态
ZDO_StartDevice( (uint8)ZDO_Config_Node_Descriptor.LogicalType, devStartMode,
DEFAULT_BEACON_ORDER, DEFAULT_SUPERFRAME_ORDER );//启动设备函数
// Return unprocessed events
return (events ^ ZDO_NETWORK_INIT); }
好,继续进入到 启动设备函数中 看一下源代码:
void ZDO_StartDevice( byte logicalType, devStartModes_t startMode, byte beaconOrder, byte superframeOrder ) {
ZStatus_t ret;
#if defined ( ZIGBEE_FREQ_AGILITY ) static uint8 discRetries = 0; #endif
#if defined ( ZIGBEE_COMMISSIONING ) static uint8 scanCnt = 0; #endif
ret = ZUnsupportedMode;
if ( ZG_BUILD_COORDINATOR_TYPE && logicalType == NODETYPE_COORDINATOR )//是协调器,条件成立。 {
if ( startMode == MODE_HARD )//MODE_HARD意思是硬件启动方式,条件成立。 {
devState = DEV_COORD_STARTING;//将设备状态修改为协调器启动状态 ret = NLME_NetworkFormationRequest( zgConfigPANID, zgApsUseExtendedPANID, zgDefaultChannelList,
zgDefaultStartingScanDuration, beaconOrder,
superframeOrder, false ); }
else if ( startMode == MODE_RESUME ) {
// Just start the coordinator devState = DEV_COORD_STARTING;
ret = NLME_StartRouterRequest( beaconOrder, beaconOrder, false ); } else {
#if defined( LCD_SUPPORTED )
HalLcdWriteScreen( \#endif
} }
if ( ZG_BUILD_JOINING_TYPE && (logicalType == NODETYPE_ROUTER || logicalType == NODETYPE_DEVICE) ) {
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 );
#if defined ( ZIGBEE_FREQ_AGILITY )
if ( !( ZDO_Config_Node_Descriptor.CapabilityFlags & CAPINFO_RCVR_ON_IDLE ) &&
( 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 ) {
// 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;
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( \#endif } }
if ( ret != ZSuccess )
osal_start_timerEx(ZDAppTaskID, ZDO_NETWORK_INIT, NWK_RETRY_DELAY ); }