Zstack中如何实现自己的任务(4)

2019-06-17 10:39

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 ); }


Zstack中如何实现自己的任务(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:全国计算机等级考试二级VFP重点

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: