Zigbee网络设备启动流程—协调器(自启动模式)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

使用的协议栈版本信息: ZigBee2006\ZStack-1.4.3-1.2.1

Zigbee网络设备启动流程—协调器(自启动模式)—以SampleApp的协调器为例.

1、协调器预编译信息

通过project->options->c/c++compiler->extraOptions可以看到协调器所带的配置文件为:

-f $PROJ_DIR$\..\..\..\Tools\CC2430DB\f8wCoord.cfg

-f $PROJ_DIR$\..\..\..\Tools\CC2430DB\f8wConfig.cfg

即编译了ZDO_COORDINATOR和RTR_NWK.

通过project->options->c/c++compiler->reprocessor->Defined symbols可以看到协调器预编译包含了:

CC2430EB; ZTOOL_P1; MT_TASK; LCD_SUPPORTED=DEBUG; MANAGED_SCAN

没有编译HOLD_AUTO_START和SOFT_START.

2、具体流程

main()->osal_init_system()->osalInitTasks()->ZDApp_Init()

进入ZDApp_Init()函数:

**************************************

void ZDApp_Init( byte task_id )

{

uint8 capabilities;

// 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.

// 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(); //通过判断预编译来开启一些函数功能

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

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

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

}

ZDApp_RegisterCBs();

}

**************************************

协调器没有编译HOLD_AUTO_START,也没有手工设置SW_1,初始化devState = DEV_INIT(参见基本问题说明3).因此直接在ZDApp_Init()中进入ZDOInitDevice( 0 )开启设备.

**************************************

uint8 ZDOInitDevice( uint16 startDelay )

{

//初始化设备网络状态为ZDO_INITDEV_NEW_NETWORK_STATE:新的网络状态.

//可能意味着ZCD_NV_STARTUP_OPTION不能恢复,或没有任何网络状态恢复

uint8 networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE;

uint16 extendedDelay = 0;

devState = DEV_INIT; // Remove the Hold state

// Initialize leave control logic

//函数读取NV项目ZCD_NV_LEAVE_CTRL的值,ZDApp_LeaveCtrl指向这个值

ZDApp_LeaveCtrlInit();

// 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).

#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; //设备网络状态为新的网络状态

else

{

// Determine if NV should be restored

//函数返回的设备网络状态要么是新的网络状态;要么是恢复的网络状态;以此

//来确定要不要读取NV里相应条目来恢复网络先前状态

相关文档
最新文档