zigbee组网程序解读Word格式文档下载.docx
《zigbee组网程序解读Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《zigbee组网程序解读Word格式文档下载.docx(44页珍藏版)》请在冰点文库上搜索。
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++);
ZDApp_Init(taskID++);
//第四步,ZDApp层,初始化,执行ZDApp_init函数后,如果是协调器将建立网络,如果是终端设备将加入网络。
#ifdefined(ZIGBEE_FREQ_AGILITY)||defined(ZIGBEE_PANID_CONFLICT)
ZDNwkMgr_Init(taskID++);
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()函数
}
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()函数
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);
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)路由器:
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);
if(events&
ZDO_ROUTER_START)
if(nwkStatus==ZSuccess)
if(devState==DEV_END_DEVICE)
devState=DEV_ROUTER;
//设备状态变成路由器
osal_pwrmgr_device(PWRMGR_ALWAYS_ON);
//remainasenddevice!
!
//设置ZDO状态改变事件
//Returnunprocessedevents
return(events^ZDO_ROUTER_START);
//Theeighthstep,执行ZDO状态改变事件
.......
ZDO_STATE_CHANGE_EVT)
//Theeighthstep,网络改变事件,这个事件就是在设备加入网络成功后,
//并在网络中的身份确定后产生的一个事件
ZDO_UpdateNwkStatus(devState);
//更新网络状态,转到Theeleventhstep,执行ZDO_UpdateNwkStatus()函数。