ZIGBee组网流程.docx

上传人:b****7 文档编号:11329740 上传时间:2023-02-27 格式:DOCX 页数:42 大小:28.87KB
下载 相关 举报
ZIGBee组网流程.docx_第1页
第1页 / 共42页
ZIGBee组网流程.docx_第2页
第2页 / 共42页
ZIGBee组网流程.docx_第3页
第3页 / 共42页
ZIGBee组网流程.docx_第4页
第4页 / 共42页
ZIGBee组网流程.docx_第5页
第5页 / 共42页
点击查看更多>>
下载资源
资源描述

ZIGBee组网流程.docx

《ZIGBee组网流程.docx》由会员分享,可在线阅读,更多相关《ZIGBee组网流程.docx(42页珍藏版)》请在冰豆网上搜索。

ZIGBee组网流程.docx

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()函数。

..

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 生产经营管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1