Zigbee网络设备启动流程—终端(自启动模式)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ZDApp_RegisterCBs(); } ************************************** 终端没有编译 HOLD_AUTO_START,也没有手工设置 SW_1,初始化 devState = DEV_INIT(参见基本问题说明 3). 因此直接在 ZDApp_Init()中进入 ZDOInitDevice()开启网络设备. ************************************** uint8 ZDOInitDevice( uint16 startDelay ) { //初始化设备网络状态为 ZDO_INITDEV_NEW_NETWORK_STATE:新的网络状态. //可能意味着 ZCD_NV_STARTUP_OPTION 不能恢复,或没有任何网络状态恢复 uint8 networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE; uint16 extendedDelay = 0;
// Register the endpoint description with the AF // This task doesn't have a Simple description, but we still need // to register the endpoint. afRegister( (endPointDesc_t *)&ZDApp_epDesc );
devState = DEV_INIT; // Remove the Hold state
// Initialize leave control logic //函数读取 NV 项目 ZCD_NV_LEAVE_CTRL 的值,ZDApp_LeaveCtrl 指向这个值 ZDApp_LeaveCtrlInit();
// Check for manual"Hold Auto Start" //检测到有手工设置 SW_1 则会设置 devState = DEV_HOLD,从而避开网络初始化 ZDAppCheckForHoldKey();
// Initialize ZDO items and setup the device - type of device to create. ZDO_Init(); //通过判断预编译来开启一些函数功能
//如果设备的网络状态为新的网络状态 if ( networkStateNV == ZDO_INITDEV_NEW_NETWORK_STATE ) { //根据预编译来设置设备新的网络状态参数 ZDAppDetermineDeviceType(); /*!!!!*/
// Only delay if joining network - not restoring network state extendedDelay = (uint16)((NWK_START_DELHale Waihona Puke BaiduY + startDelay)
return ( networkStateNV ); }
************************************** 分两种情况: (1)如果终端预编译了 NV_RESTORE,且函数 ZDApp_ReadNetworkRestoreState()返回值为 ZDO_INITDEV_RESTORED_NETWORK_STATE,则进入 ZDApp_RestoreNetworkState(),因为这是终端,因此只是设 置 devStartMode = MODE_RESUME. **************** uint8 ZDApp_RestoreNetworkState( void ) { ………… // Are we a coordinator //设备的网络状态为恢复的网络状态.则进入这个函数进行恢复 //先判断如果短地址为 0 则设置设备逻辑类型为协调器且 devStartMode = MODE_RESUME //否则设置 devStartMode = MODE_RESUME ZDAppNwkAddr.addr.shortAddr = NLME_GetShortAddr(); if ( ZDAppNwkAddr.addr.shortAddr == 0 ) //如果短地址是 0,即协调器 { ZDO_Config_Node_Descriptor.LogicalType = NODETYPE_COORDINATOR; //!!!!! } devStartMode = MODE_RESUME; //MODE_RESUME!!!!!!!! ………… } **************** (2)如果终端没有预编译 NV_RESTORE,networkStateNV ==ZDO_INITDEV_NEW_NETWORK_STATE,但由于终端没 有编译 SOFT_START,因此 ZDAppDetermineDeviceType()不起作用.因此 ZDO_Config_Node_Descriptor.LogicalType 和 devStartMode 这两个关键参数保持初始化时的值: ZDO_Config_Node_Descriptor.LogicalType = NODETYPE_DEVICE(见基本问题说明 6) devStartMode = MODE_JOIN(见基本问题说明 4)
// Save the task ID ZDAppTaskID = task_id;
// Initialize the ZDO global device short address storage ZDAppNwkAddr.addrMode = Addr16Bit; ZDAppNwkAddr.addr.shortAddr = INVALID_NODE_ADDR; //0xFFFE (void)NLME_GetExtAddr(); // Load the saveExtAddr pointer.
//如果设备的网络状态为恢复的网络状态 if ( networkStateNV == ZDO_INITDEV_RESTORED_NETWORK_STATE ) { //恢复先前网络状态并把 devStartMode = MODE_RESUME!!!! networkStateNV = ZDApp_RestoreNetworkState(); } else //如果设备的网络状态为新的网络状态,在下面进行处理 { // Wipe out(清除) the network state in NV NLME_InitNV(); NLME_SetDefaultNV(); //设置默认 NV 条目 } #endif
使用的协议栈版本信息: ZigBee2006\ZStack-1.4.3-1.2.1
Zigbee 网络设备启动流程—终端(自启动模式)—以 SampleApp 的终端为例.
1、终端预编译信息 通过 project->options->c/c++compiler->extraOptions 可以看到终端所带的配置文件为: -f $PROJ_DIR$\..\..\..\Tools\CC2430DB\f8wEndev.cfg -f $PROJ_DIR$\..\..\..\Tools\CC2430DB\f8wConfig.cfg RFD 设备,没有编译 ZDO_COORDINATOR 和 RTR_NWK.
// Check leave control reset settings ZDApp_LeaveCtrlStartup( &devState, &startDelay );
// Leave may make the hold state come back //以上两个函数设置了对设备离开时的控制,如果有延时则延时,没有则 //把设备状态设为 DEV_HOLD if ( devState == DEV_HOLD ) //ZDO_INITDEV_LEAVE_NOT_STARTED:该设备没有在网络中,下次调用才启用. return ( ZDO_INITDEV_LEAVE_NOT_STARTED ); // Don't join - (one time).
通过 project->options->c/c++compiler->Preprocessor->Defined symbols 可以看到终端预编译包含了: CC2430EB;NWK_AUTO_POLL;ZTOOL_P1;MT_TASK;LCD_SUPPORTED=DEBUG 没有编译 HOLD_AUTO_START 和 SOFT_START.
// Start the device? if ( devState != DEV_HOLD ) { ZDOInitDevice( 0 ); } /*如果 devState=DEV_HOLD,则不会调用 ZDOInitDevice()来初始化网络 即不组网也不进网.LED4 闪烁等待应用程序来开启设备并初始化网络 */ else { // Blink LED to indicate HOLD_START HalLedBlink ( HAL_LED_4, 0, 50, 500 ); }
#if defined( ZDO_USERDESC_RESPONSE ) ZDApp_InitUserDesc(); #endif // ZDO_USERDESC_RESPONSE
// set broadcast address mask to support broadcast filtering NLME_GetRequest(nwkCapabilityInfo, 0, &capabilities); NLME_SetBroadcastFilter( capabilities );
+ (osal_rand() & EXTENDED_JOINING_RANDOM_MASK)); }
// Initialize device security ZDApp_SecInit( networkStateNV );
// Trigger the network start ZDApp_NetworkInit( extendedDelay );
2、具体流程 main()->osal_init_system()->osalInitTasks()->ZDApp_Init() 进入 ZDApp_Init()函数: ************************************** ************************************** void ZDApp_Init( byte task_id ) { uint8 capabilities;
else { // Determine if NV should be restored //函数返回的设备网络状态要么是新的网络状态;要么是恢复的网络状态;以此 //来确定要不要读取 NV 里相应条目来恢复网络先前状态 networkStateNV = ZDApp_ReadNetworkRestoreState(); }
#if defined ( NV_RESTORE ) // Get Keypad directly to see if a reset nv is needed. // Hold down the SW_BYPASS_NV key (defined in OnBoard.h) // while booting(引导) to skip past NV Restore. if ( HalKeyRead() == SW_BYPASS_NV ) //SW_BYPASS_NV 按键处于按下状态时,则避开网络层的 NV 存储 networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE; //设备网络状态为新的网络状态
对于终端,这两种情况最终都是确定两个关键设备网络状态参数的值.对本例的 SampleApp 的终端,没有编 译 NV_RESTORE,因此属于情况(2). 然后调用 ZDApp_NetworkInit()启动网络: **************** void ZDApp_NetworkInit( uint16 delay )
// Register the endpoint description with the AF // This task doesn't have a Simple description, but we still need // to register the endpoint. afRegister( (endPointDesc_t *)&ZDApp_epDesc );
devState = DEV_INIT; // Remove the Hold state
// Initialize leave control logic //函数读取 NV 项目 ZCD_NV_LEAVE_CTRL 的值,ZDApp_LeaveCtrl 指向这个值 ZDApp_LeaveCtrlInit();
// Check for manual"Hold Auto Start" //检测到有手工设置 SW_1 则会设置 devState = DEV_HOLD,从而避开网络初始化 ZDAppCheckForHoldKey();
// Initialize ZDO items and setup the device - type of device to create. ZDO_Init(); //通过判断预编译来开启一些函数功能
//如果设备的网络状态为新的网络状态 if ( networkStateNV == ZDO_INITDEV_NEW_NETWORK_STATE ) { //根据预编译来设置设备新的网络状态参数 ZDAppDetermineDeviceType(); /*!!!!*/
// Only delay if joining network - not restoring network state extendedDelay = (uint16)((NWK_START_DELHale Waihona Puke BaiduY + startDelay)
return ( networkStateNV ); }
************************************** 分两种情况: (1)如果终端预编译了 NV_RESTORE,且函数 ZDApp_ReadNetworkRestoreState()返回值为 ZDO_INITDEV_RESTORED_NETWORK_STATE,则进入 ZDApp_RestoreNetworkState(),因为这是终端,因此只是设 置 devStartMode = MODE_RESUME. **************** uint8 ZDApp_RestoreNetworkState( void ) { ………… // Are we a coordinator //设备的网络状态为恢复的网络状态.则进入这个函数进行恢复 //先判断如果短地址为 0 则设置设备逻辑类型为协调器且 devStartMode = MODE_RESUME //否则设置 devStartMode = MODE_RESUME ZDAppNwkAddr.addr.shortAddr = NLME_GetShortAddr(); if ( ZDAppNwkAddr.addr.shortAddr == 0 ) //如果短地址是 0,即协调器 { ZDO_Config_Node_Descriptor.LogicalType = NODETYPE_COORDINATOR; //!!!!! } devStartMode = MODE_RESUME; //MODE_RESUME!!!!!!!! ………… } **************** (2)如果终端没有预编译 NV_RESTORE,networkStateNV ==ZDO_INITDEV_NEW_NETWORK_STATE,但由于终端没 有编译 SOFT_START,因此 ZDAppDetermineDeviceType()不起作用.因此 ZDO_Config_Node_Descriptor.LogicalType 和 devStartMode 这两个关键参数保持初始化时的值: ZDO_Config_Node_Descriptor.LogicalType = NODETYPE_DEVICE(见基本问题说明 6) devStartMode = MODE_JOIN(见基本问题说明 4)
// Save the task ID ZDAppTaskID = task_id;
// Initialize the ZDO global device short address storage ZDAppNwkAddr.addrMode = Addr16Bit; ZDAppNwkAddr.addr.shortAddr = INVALID_NODE_ADDR; //0xFFFE (void)NLME_GetExtAddr(); // Load the saveExtAddr pointer.
//如果设备的网络状态为恢复的网络状态 if ( networkStateNV == ZDO_INITDEV_RESTORED_NETWORK_STATE ) { //恢复先前网络状态并把 devStartMode = MODE_RESUME!!!! networkStateNV = ZDApp_RestoreNetworkState(); } else //如果设备的网络状态为新的网络状态,在下面进行处理 { // Wipe out(清除) the network state in NV NLME_InitNV(); NLME_SetDefaultNV(); //设置默认 NV 条目 } #endif
使用的协议栈版本信息: ZigBee2006\ZStack-1.4.3-1.2.1
Zigbee 网络设备启动流程—终端(自启动模式)—以 SampleApp 的终端为例.
1、终端预编译信息 通过 project->options->c/c++compiler->extraOptions 可以看到终端所带的配置文件为: -f $PROJ_DIR$\..\..\..\Tools\CC2430DB\f8wEndev.cfg -f $PROJ_DIR$\..\..\..\Tools\CC2430DB\f8wConfig.cfg RFD 设备,没有编译 ZDO_COORDINATOR 和 RTR_NWK.
// Check leave control reset settings ZDApp_LeaveCtrlStartup( &devState, &startDelay );
// Leave may make the hold state come back //以上两个函数设置了对设备离开时的控制,如果有延时则延时,没有则 //把设备状态设为 DEV_HOLD if ( devState == DEV_HOLD ) //ZDO_INITDEV_LEAVE_NOT_STARTED:该设备没有在网络中,下次调用才启用. return ( ZDO_INITDEV_LEAVE_NOT_STARTED ); // Don't join - (one time).
通过 project->options->c/c++compiler->Preprocessor->Defined symbols 可以看到终端预编译包含了: CC2430EB;NWK_AUTO_POLL;ZTOOL_P1;MT_TASK;LCD_SUPPORTED=DEBUG 没有编译 HOLD_AUTO_START 和 SOFT_START.
// Start the device? if ( devState != DEV_HOLD ) { ZDOInitDevice( 0 ); } /*如果 devState=DEV_HOLD,则不会调用 ZDOInitDevice()来初始化网络 即不组网也不进网.LED4 闪烁等待应用程序来开启设备并初始化网络 */ else { // Blink LED to indicate HOLD_START HalLedBlink ( HAL_LED_4, 0, 50, 500 ); }
#if defined( ZDO_USERDESC_RESPONSE ) ZDApp_InitUserDesc(); #endif // ZDO_USERDESC_RESPONSE
// set broadcast address mask to support broadcast filtering NLME_GetRequest(nwkCapabilityInfo, 0, &capabilities); NLME_SetBroadcastFilter( capabilities );
+ (osal_rand() & EXTENDED_JOINING_RANDOM_MASK)); }
// Initialize device security ZDApp_SecInit( networkStateNV );
// Trigger the network start ZDApp_NetworkInit( extendedDelay );
2、具体流程 main()->osal_init_system()->osalInitTasks()->ZDApp_Init() 进入 ZDApp_Init()函数: ************************************** ************************************** void ZDApp_Init( byte task_id ) { uint8 capabilities;
else { // Determine if NV should be restored //函数返回的设备网络状态要么是新的网络状态;要么是恢复的网络状态;以此 //来确定要不要读取 NV 里相应条目来恢复网络先前状态 networkStateNV = ZDApp_ReadNetworkRestoreState(); }
#if defined ( NV_RESTORE ) // Get Keypad directly to see if a reset nv is needed. // Hold down the SW_BYPASS_NV key (defined in OnBoard.h) // while booting(引导) to skip past NV Restore. if ( HalKeyRead() == SW_BYPASS_NV ) //SW_BYPASS_NV 按键处于按下状态时,则避开网络层的 NV 存储 networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE; //设备网络状态为新的网络状态
对于终端,这两种情况最终都是确定两个关键设备网络状态参数的值.对本例的 SampleApp 的终端,没有编 译 NV_RESTORE,因此属于情况(2). 然后调用 ZDApp_NetworkInit()启动网络: **************** void ZDApp_NetworkInit( uint16 delay )