ZIGBee组网流程.docx
《ZIGBee组网流程.docx》由会员分享,可在线阅读,更多相关《ZIGBee组网流程.docx(42页珍藏版)》请在冰豆网上搜索。
ZIGBee组网流程
ZIGBee组网流程
第一个功能:
协调器的组网,终端设备和路由设备发现网络以及加入网络
//第一步:
Z-Stack 由main()函数开始执行,main()函数共做了2件事:
一是系统初始化,另外一件是开始执行轮转查询式操作系统
intmain(void)
{
.......
//Initializetheoperatingsystem
osal_init_system(); //第二步,操作系统初始化
......
osal_start_system();//初始化完系统任务事件后,正式开始执行操作系统
......
}
//第二步,进入osal_init_system()函数,执行操作系统初始化
uint8osal_init_system(void) //初始化操作系统,其中最重要的是,初始化操作系统的任务
{
//InitializetheMemoryAllocationSystem
osal_mem_init();
//Initializethemessagequeue
osal_qHead=NULL;
//Initializethetimers
osalTimerInit();
//InitializethePowerManagementSystem
osal_pwrmgr_init();
//Initializethesystemtasks.
osalInitTasks(); //第三步,执行操作系统任务初始化函数
//Setupefficientsearchforthefirstfreeblockofheap.
osal_mem_kick();
return(SUCCESS);
}
//第三步,进入osalInitTasks()函数,执行操作系统任务初始化
voidosalInitTasks(void) //第三步,初始化操作系统任务
{
uint8taskID=0;
tasksEvents=(uint16*)osal_mem_alloc(sizeof(uint16)*tasksCnt);
osal_memset(tasksEvents,0,(sizeof(uint16)*tasksCnt));
//任务优先级由高向低依次排列,高优先级对应taskID的值反而小
macTaskInit(taskID++);//不需要用户考虑
nwk_init(taskID++); //不需要用户考虑
Hal_Init(taskID++); //硬件抽象层初始化,需要我们考虑
#ifdefined(MT_TASK)
MT_TaskInit(taskID++);
#endif
APS_Init(taskID++); //不需要用户考虑
#ifdefined(ZIGBEE_FRAGMENTATION)
APSF_Init(taskID++);
#endif
ZDApp_Init(taskID++); //第四步,ZDApp层,初始化,执行ZDApp_init函数后,如果是协调器将建立网络,如果是终端设备将加入网络。
#ifdefined(ZIGBEE_FREQ_AGILITY)||defined(ZIGBEE_PANID_CONFLICT)
ZDNwkMgr_Init(taskID++);
#endif
SerialApp_Init(taskID); //应用层SerialApp层初始化,需要用户考虑 在此处设置了一个按键触发事件,
//当有按键按下的时候,产生一个系统消息
}
//第四步,进入ZDApp_init()函数,执行ZDApp层初始化
//Thefirststep
voidZDApp_Init(uint8task_id) //Thefirststep,ZDApp层初始化。
{
//SavethetaskID
ZDAppTaskID=task_id;
//InitializetheZDOglobaldeviceshortaddressstorage
ZDAppNwkAddr.addrMode=Addr16Bit;
ZDAppNwkAddr.addr.shortAddr=INVALID_NODE_ADDR;
(void)NLME_GetExtAddr(); //LoadthesaveExtAddrpointer.
//Checkformanual"HoldAutoStart"
ZDAppCheckForHoldKey();
//InitializeZDOitemsandsetupthedevice-typeofdevicetocreate.
ZDO_Init();
//RegistertheendpointdescriptionwiththeAF
//Thistaskdoesn'thaveaSimpledescription,butwestillneed
//toregistertheendpoint.
afRegister((endPointDesc_t*)&ZDApp_epDesc);
#ifdefined(ZDO_USERDESC_RESPONSE)
ZDApp_InitUserDesc();
#endif//ZDO_USERDESC_RESPONSE
//Startthedevice?
if(devState!
=DEV_HOLD) //devState初值为DEV_INIT,所以在初始化ZDA层时,就执行该条件语句
{
ZDOInitDevice(0); //Thesecondstep,接着转到ZDOInitDevice()函数,执行Thethirdstep;
}
else
{
//BlinkLEDtoindicateHOLD_START
HalLedBlink(HAL_LED_4,0,50,500);
}
ZDApp_RegisterCBs();
}
//Thethirdstep,执行ZDOInitDevice()函数,执行设备初始化
uint8ZDOInitDevice(uint16startDelay) //Thethirdstep,ZDO层初始化设备,
{
.......
//Triggerthenetworkstart
ZDApp_NetworkInit(extendedDelay); //网络初始化,跳到相应的函数里头,执行Thefourthstep
.......
}
//Thefouthstep,执行ZDApp_NetWorkInit()函数
voidZDApp_NetworkInit(uint16delay) //Thefourthstep,网络初始化
{
if(delay)
{
//Waitawhilebeforestartingthedevice
osal_start_timerEx(ZDAppTaskID,ZDO_NETWORK_INIT,delay); //发送ZDO_NETWORK_INIT(网络初始化)消息到ZDApp层,转到 //ZDApp层,执行Thefifthstep ,ZDApp_event_loop()函数
}
else
{
osal_set_event(ZDAppTaskID,ZDO_NETWORK_INIT);
}
}
//Thefifthstep,转到ZDApp_event_loop()函数
UINT16ZDApp_event_loop(uint8task_id,UINT16events)
{
if(events&ZDO_NETWORK_INIT) //Thefivthstep,网络初始化事件处理
{
//Initializeappsandstartthenetwork
devState=DEV_INIT;
//设备逻辑类型,启动模式,信标时间,超帧长度,接着转到Thesixthstep,去启动设备,接着执行Thesixthstep,转到ZDO_StartDevice()
ZDO_StartDevice((uint8)ZDO_Config_Node_Descriptor.LogicalType,devStartMode,
DEFAULT_BEACON_ORDER,DEFAULT_SUPERFRAME_ORDER);
//Returnunprocessedevents
return(events^ZDO_NETWORK_INIT);
}
}
//Thesixthstep,执行ZDO_StartDevice()函数,启动设备
voidZDO_StartDevice(bytelogicalType,devStartModes_tstartMode,bytebeaconOrder,bytesuperframeOrder)//Thesixthstep
{
......
if(ZG_BUILD_COORDINATOR_TYPE&&logicalType==NODETYPE_COORDINATOR) //当设备作为协调器时,执行这个条件语句。
{
if(startMode==MODE_HARD)
{
devState=DEV_COORD_STARTING;
//向网络层发送网络形成请求。
当网络层执行NLME_NetworkFormationRequest()建立网络后,将给予ZDO层反馈信息。
//接着转到Theseventhstep,去执行ZDApp层的 ZDO_NetworkFormationConfirmCB()函数
ret=NLME_NetworkFormationRequest(zgConfigPANID,zgApsUseExtendedPANID,zgDefaultChannelList,
zgDefaultStartingScanDuration,beaconOrder,
superframeOrder,false);
}
if(ZG_BUILD_JOINING_TYPE&&(logicalType==NODETYPE_ROUTER||logicalType==NODETYPE_DEVICE))//当为终端设备或路由时
{
if((startMode==MODE_JOIN)||(startMode==MODE_REJOIN))
{
devState=DEV_NWK_DISC;
//zgDefaultChannelList与协调器形成网络的通道号匹配。
网络发现请求。
//继而转到ZDO_NetworkDiscoveryConfirmCB()函数
ret=NLME_NetworkDiscoveryRequest(zgDefaultChannelList,zgDefaultStartingScanDuration);
}
}
......
}
//Theseventhstep,分两种情况,1.协调器 2.路由器或终端设备
1)协调器
voidZDO_NetworkFormationConfirmCB(ZStatus_tStatus)//Theseventhstep,给予ZDO层网络形成反馈信息(协调器)
{
osal_set_event(ZDAppTaskID,ZDO_NETWORK_START);//发送网络启动事件到ZDApp层,接着转到ZDApp_event_loop()函数
......
}
UINT16ZDApp_event_loop(uint8task_id,UINT16events)
{
......
if(events&ZDO_NETWORK_START) //网络启动事件
{
ZDApp_NetworkStartEvt(); //网络启动事件,接着跳转到Theninthstep,执行ZDApp_NetworkStartEvt()函数
......
}
}
voidZDApp_NetworkStartEvt(void) //处理网络启动事件
{
......
osal_pwrmgr_device(PWRMGR_ALWAYS_ON); //电源总是上电
osal_set_event(ZDAppTaskID,ZDO_STATE_CHANGE_EVT);//设置网络状态改变事件,发送到ZDApp层,转到Thetenthstep,去
...... //ZDApp_event_loop()函数,找到相对应的网络改变事件。
}
2)路由器或终端设备
//Theseventhstep(终端设备),当发现有网络存在时,网络层将给予ZDO层发现网络反馈信息
ZStatus_tZDO_NetworkDiscoveryConfirmCB(uint8ResultCount,networkDesc_t*NetworkList)
{
.......
//把网络发现这个反馈消息,发送到ZDA层,转到ZDApp_ProcessOSALMsg(),执行
ZDApp_SendMsg(ZDAppTaskID,ZDO_NWK_DISC_CNF,sizeof(ZDO_NetworkDiscoveryCfm_t),(uint8*)&msg);
}
voidZDApp_ProcessOSALMsg(osal_event_hdr_t*msgPtr)
{
......
caseZDO_NWK_DISC_CNF:
//(终端设备),网络发现响应。
......
//当发现有网络存在时,网络层将给予ZDO层发现网络反馈信息。
然后由网络层发起加入网络请求,
//如加入网络成功,则网络层将给予ZDO层加入网络反馈,执行NLME_JoinRequest()函数。
然后转到
//Theninthstep,执行ZDO_JoinConfirmCB()函数
if(NLME_JoinRequest(((ZDO_NetworkDiscoveryCfm_t*)msgPtr)->extendedPANID,
BUILD_UINT16(((ZDO_NetworkDiscoveryCfm_t*)msgPtr)->panIdLSB,((ZDO_NetworkDiscoveryCfm_t*)msgPtr)->panIdMSB),
((ZDO_NetworkDiscoveryCfm_t*)msgPtr)->logicalChannel,
ZDO_Config_Node_Descriptor.CapabilityFlags)!
=ZSuccess)
{
ZDApp_NetworkInit((uint16)(NWK_START_DELAY
+((uint16)(osal_rand()&EXTENDED_JOINING_RANDOM_MASK))));
}
......
}
voidZDO_JoinConfirmCB(uint16PanId,ZStatus_tStatus) //Theninthstep(终端设备),终端设备加入网络响应。
{
......
//将ZDO_NWK_JOIN_IND事件发送到ZDA层,执行ZDApp_ProcessOSALMsg()函数。
ZDApp_SendMsg(ZDAppTaskID,ZDO_NWK_JOIN_IND,sizeof(osal_event_hdr_t),(byte*)NULL);
}
voidZDApp_ProcessOSALMsg(osal_event_hdr_t*msgPtr)
{
......
caseZDO_NWK_JOIN_IND:
//终端设备,加入网络反馈信息事件。
if(ZG_BUILD_JOINING_TYPE&&ZG_DEVICE_JOINING_TYPE)
{
ZDApp_ProcessNetworkJoin();//转到ZDApp_ProcessNetworkJoin(),执行ZDApp_ProcessNetworkJoin()函数。
}
break;
......
}
在执行ZDApp_ProcessNetworkJoin()函数的时候,要分两种情况,一种是终端设备,一种是路由器:
3)终端设备:
voidZDApp_ProcessNetworkJoin(void) //处理网络加入事件。
{
......
if(nwkStatus==ZSuccess)
{
//设置ZDO_STATE_CHANGE_EVT,发送到ZDA层,执行ZDApp_event_loop()函数。
osal_set_event(ZDAppTaskID,ZDO_STATE_CHANGE_EVT);
}
......
}
4)路由器:
voidZDApp_ProcessNetworkJoin(void)
{
......
if(ZSTACK_ROUTER_BUILD)
{
//NOTE:
firsttwoparametersarenotused,seeNLMEDE.hfordetails
if(ZDO_Config_Node_Descriptor.LogicalType!
=NODETYPE_DEVICE)
{
NLME_StartRouterRequest(0,0,false); //路由启动请求
}
}
......
}
voidZDO_StartRouterConfirmCB(ZStatus_tStatus)
{
nwkStatus=(byte)Status;
......
osal_set_event(ZDAppTaskID,ZDO_ROUTER_START);
}
UINT16ZDApp_event_loop(uint8task_id,UINT16events)
{
if(events&ZDO_ROUTER_START)
{
if(nwkStatus==ZSuccess)
{
if(devState==DEV_END_DEVICE)
devState=DEV_ROUTER; //设备状态变成路由器
osal_pwrmgr_device(PWRMGR_ALWAYS_ON);
}
else
{
//remainasenddevice!
!
}
osal_set_event(ZDAppTaskID,ZDO_STATE_CHANGE_EVT); //设置ZDO状态改变事件
//Returnunprocessedevents
return(events^ZDO_ROUTER_START);
}
}
//Theeighthstep,执行ZDO状态改变事件
UINT16ZDApp_event_loop(uint8task_id,UINT16events)
{
.......
if(events&ZDO_STATE_CHANGE_EVT) //Theeighthstep,网络改变事件,这个事件就是在设备加入网络成功后,
//并在网络中的身份确定后产生的一个事件
{
ZDO_UpdateNwkStatus(devState); //更新网络状态,转到Theeleventhstep,执行ZDO_UpdateNwkStatus()函数。
..