zstack网络的建立.docx
- 文档编号:29856719
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:16
- 大小:18.68KB
zstack网络的建立.docx
《zstack网络的建立.docx》由会员分享,可在线阅读,更多相关《zstack网络的建立.docx(16页珍藏版)》请在冰豆网上搜索。
zstack网络的建立
1.
voidZDApp_Init(bytetask_id)
{
uint8capabilities;
//SavethetaskID
ZDAppTaskID=task_id;
//设置任务id
//InitializetheZDOglobaldeviceshortaddressstorage
ZDAppNwkAddr.addrMode=Addr16Bit;
ZDAppNwkAddr.addr.shortAddr=INVALID_NODE_ADDR;
(void)NLME_GetExtAddr();//LoadthesaveExtAddrpointer.
//函数的作用是返回指向64bitIEEE地址的指针,但这里有点奇怪,它好像没有接收这个指针
//Checkformanual"HoldAutoStart"
ZDAppCheckForHoldKey();
//该函数的作用是如果HAL_KEY_SW_1键被按下,则notstartedautomatically,如果不是自启动,则在自己的应用程序中要添加函数ZDOInitDevice(0)来启动建网过程,见Sample例子的应用程序
//InitializeZDOitemsandsetupthedevice-typeofdevicetocreate.
ZDO_Init();
//RegistertheendpointdescriptionwiththeAF
//Thistaskdoesn'thaveaSimpledescription,butwestillneed
//toregistertheendpoint.
afRegister((endPointDesc_t*)&ZDApp_epDesc);
//注册端点
#ifdefined(ZDO_USERDESC_RESPONSE)
ZDApp_InitUserDesc();
#endif//ZDO_USERDESC_RESPONSE
//setbroadcastaddressmasktosupportbroadcastfiltering
NLME_GetRequest(nwkCapabilityInfo,0,&capabilities);
//ThisfunctionallowsthenexthigherlayertogetthevalueofaNIB(networkinformationbase)attribute
NLME_SetBroadcastFilter(capabilities);
//Thisfunctionsetsabitmaskbasedonthecapabilitiesofthedevice.Itwillbeusedtoprocessvalidbroadcastaddresses
//Startthedevice?
if(devState!
=DEV_HOLD)
{
ZDOInitDevice(0);
}
else
{
//BlinkLEDtoindicateHOLD_START
HalLedBlink(HAL_LED_4,0,50,500);
}
ZDApp_RegisterCBs();
}/*ZDO_Init()*/
2.
voidZDApp_RegisterCBs(void)
{
#ifdefined(ZDO_IEEEADDR_REQUEST)||defined(REFLECTOR)
ZDO_RegisterForZDOMsg(ZDAppTaskID,IEEE_addr_rsp);
#endif
#ifdefined(ZDO_NWKADDR_REQUEST)||defined(REFLECTOR)
ZDO_RegisterForZDOMsg(ZDAppTaskID,NWK_addr_rsp);
#endif
#ifdefined(ZDO_COORDINATOR)
ZDO_RegisterForZDOMsg(ZDAppTaskID,Bind_rsp);
ZDO_RegisterForZDOMsg(ZDAppTaskID,Unbind_rsp);
ZDO_RegisterForZDOMsg(ZDAppTaskID,End_Device_Bind_req);
#endif
#ifdefined(REFLECTOR)
ZDO_RegisterForZDOMsg(ZDAppTaskID,Bind_req);
ZDO_RegisterForZDOMsg(ZDAppTaskID,Unbind_req);
#endif
}
3.
ZStatus_tZDO_RegisterForZDOMsg(uint8taskID,uint16clusterID)
{
ZDO_MsgCB_t*pList;
ZDO_MsgCB_t*pLast;
ZDO_MsgCB_t*pNew;
//Lookforduplicate
pList=zdoMsgCBs;
while(pList)
{
if(pList->taskID==taskID&&pList->clusterID==clusterID)
return(ZSuccess);
pLast=pList;
pList=(ZDO_MsgCB_t*)pList->next;
}
//Addtothelist
pNew=(ZDO_MsgCB_t*)osal_mem_alloc(sizeof(ZDO_MsgCB_t));
if(pNew)
{
pNew->taskID=taskID;
pNew->clusterID=clusterID;
pNew->next=NULL;
if(zdoMsgCBs)
{
pLast->next=pNew;
}
else
zdoMsgCBs=pNew;
return(ZSuccess);
}
else
return(ZMemError);
}
该函数的作用是把新的ZDOMsg加入到这张表中。
4.
uint8ZDOInitDevice(uint16startDelay)
{
uint8networkStateNV=ZDO_INITDEV_NEW_NETWORK_STATE;
uint16extendedDelay=0;
devState=DEV_INIT;//RemovetheHoldstate
//Initializeleavecontrollogic
ZDApp_LeaveCtrlInit();
//Checkleavecontrolresetsettings
ZDApp_LeaveCtrlStartup(&devState,&startDelay);
//Leavemaymaketheholdstatecomeback
if(devState==DEV_HOLD)
return(ZDO_INITDEV_LEAVE_NOT_STARTED);//Don'tjoin-(onetime).
#ifdefined(NV_RESTORE)
//GetKeypaddirectlytoseeifaresetnvisneeded.
//HolddowntheSW_BYPASS_NVkey(definedinOnBoard.h)
//whilebootingtoskippastNVRestore.
if(HalKeyRead()==SW_BYPASS_NV)
networkStateNV=ZDO_INITDEV_NEW_NETWORK_STATE;
else
{
//DetermineifNVshouldberestored
networkStateNV=ZDApp_ReadNetworkRestoreState();
}
if(networkStateNV==ZDO_INITDEV_RESTORED_NETWORK_STATE)
{
networkStateNV=ZDApp_RestoreNetworkState();
}
else
{
//WipeoutthenetworkstateinNV
NLME_InitNV();
NLME_SetDefaultNV();
}
#endif
if(networkStateNV==ZDO_INITDEV_NEW_NETWORK_STATE)
{
ZDAppDetermineDeviceType();
//Onlydelayifjoiningnetwork-notrestoringnetworkstate
extendedDelay=(uint16)((NWK_START_DELAY+startDelay)
+(osal_rand()&EXTENDED_JOINING_RANDOM_MASK));
}
//Initializedevicesecurity
ZDApp_SecInit(networkStateNV);
//Triggerthenetworkstart
ZDApp_NetworkInit(extendedDelay);
return(networkStateNV);
}
5.
voidZDApp_NetworkInit(uint16delay)
{
if(delay)
{
//Waitawhilebeforestartingthedevice
osal_start_timerEx(ZDAppTaskID,ZDO_NETWORK_INIT,delay);
}
else
{
osal_set_event(ZDAppTaskID,ZDO_NETWORK_INIT);
}
}
6.
UINT16ZDApp_event_loop(bytetask_id,UINT16events)
{
uint8*msg_ptr;
if(events&SYS_EVENT_MSG)
{
while((msg_ptr=osal_msg_receive(ZDAppTaskID)))
{
ZDApp_ProcessOSALMsg((osal_event_hdr_t*)msg_ptr);
//Releasethememory
osal_msg_deallocate(msg_ptr);
}
//Returnunprocessedevents
return(events^SYS_EVENT_MSG);
}
if(events&ZDO_STATE_CHANGE_EVT)
{
ZDO_UpdateNwkStatus(devState);
//Returnunprocessedevents
return(events^ZDO_STATE_CHANGE_EVT);
}
if(events&ZDO_NETWORK_INIT)
{
//Initializeappsandstartthenetwork
devState=DEV_INIT;
ZDO_StartDevice((uint8)ZDO_Config_Node_Descriptor.LogicalType,devStartMode,
DEFAULT_BEACON_ORDER,DEFAULT_SUPERFRAME_ORDER);
//Returnunprocessedevents
return(events^ZDO_NETWORK_INIT);
}
#ifdefined(RTR_NWK)
if(events&ZDO_NETWORK_START)
{
ZDApp_NetworkStartEvt();
//Returnunprocessedevents
return(events^ZDO_NETWORK_START);
}
#endif//RTR_NWK
#ifdefined(RTR_NWK)
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);
//Returnunprocessedevents
return(events^ZDO_ROUTER_START);
}
#endif//RTR
if(events&ZDO_COMMAND_CNF)
{
//Userdefinedlogic
//Returnunprocessedevents
return(events^ZDO_COMMAND_CNF);
}
#ifdefined(ZDSECMGR_SECURE)&&defined(RTR_NWK)
if(events&ZDO_NEW_DEVICE)
{
//processthenewdeviceevent
if(ZDSecMgrNewDeviceEvent()==TRUE)
{
osal_start_timerEx(ZDAppTaskID,ZDO_NEW_DEVICE,1000);
}
//Returnunprocessedevents
return(events^ZDO_NEW_DEVICE);
}
#endif//ZDSECMGR_SECURE&&RTR
#ifdefined(ZDSECMGR_COMMERCIAL)
if(events&ZDO_SECMGR_EVENT)
{
ZDSecMgrEvent();
//Returnunprocessedevents
return(events^ZDO_SECMGR_EVENT);
}
#endif//defined(ZDSECMGR_COMMERCIAL)
#if(SECURE!
=0)
if(events&ZDO_DEVICE_AUTH)
{
ZDApp_DeviceAuthEvt();
//Returnunprocessedevents
return(events^ZDO_DEVICE_AUTH);
}
#endif//SECURE
if(events&ZDO_NWK_UPDATE_NV)
{
ZDApp_SaveNetworkStateEvt();
//Returnunprocessedevents
return(events^ZDO_NWK_UPDATE_NV);
}
#if(SECURE!
=0)
if(events&ZDO_FRAMECOUNTER_CHANGE)
{
if(nwkFrameCounterChanges++>MAX_NWK_FRAMECOUNTER_CHANGES)
ZDApp_SaveNwkKey();
//Returnunprocessedevents
return(events^ZDO_FRAMECOUNTER_CHANGE);
}
#endif
if(events&ZDO_DEVICE_RESET)
{
//ThedevicehasbeenintheUNAUTHstate,soreset
//Note:
therewillbenoreturnfromthiscall
SystemReset();
}
//Discardormakemorehandlers
return0;
}
7.
voidZDO_StartDevice(bytelogicalType,devStartModes_tstartMode,bytebeaconOrder,bytesuperframeOrder)
{
ZStatus_tret;
ret=ZUnsupportedMode;
#ifdefined(ZDO_COORDINATOR)
if(logicalType==NODETYPE_COORDINATOR)
{
if(startMode==MODE_HARD)
{
devState=DEV_COORD_STARTING;
ret=NLME_NetworkFormationRequest(zgConfigPANID,zgDefaultChannelList,
zgDefaultStartingScanDuration,beaconOrder,
superframeOrder,false);
}
elseif(startMode==MODE_RESUME)
{
//Juststartthecoordinator
devState=DEV_COORD_STARTING;
ret=NLME_StartRouterRequest(beaconOrder,beaconOrder,false);
}
else
{
#ifdefined(LCD_SUPPORTED)
HalLcdWriteScreen("StartDeviceERR","MODEunknown");
#endif
}
}
#endif//!
ZDO_COORDINATOR
#if!
defined(ZDO_COORDINATOR)||defined(SOFT_START)
if(logicalType==NODETYPE_ROUTER||logicalType==NODETYPE_DEVICE)
{
if((startMode==MODE_JOIN)||(startMode==MODE_REJOIN))
{
devState=DEV_NWK_DISC;
#ifdefined(MANAGED_SCAN)
ZDOManagedScan_Next();
ret=NLME_NetworkDiscoveryRequest(managedScanChannelMask,BEACON_ORDER_15_MSEC);
#else
ret=NLME_NetworkDiscoveryRequest(zgDefaultChannelList,zgDefaultStartingScanDuration);
#endif
}
elseif(startMode==MODE_RESUME)
{
if(logicalType==NODETYPE_ROUTER)
{
ZMacScanCnf_tscanCnf;
devState=DEV_NWK_ORPHAN;
/*ifrouterandnvramisavailable,fakesuccessfulorphanscan*/
scanCnf.hdr.Status=ZSUCCESS;
scanCnf.ScanType=ZMAC_ORPHAN_SCAN;
scanCnf.UnscannedChannels=0;
scanCnf.ResultListSize=0;
nwk_ScanJoiningOrphan(&scanCnf);
ret=ZSuccess;
}
else
{
devState=DEV_NWK_ORPHAN;
ret=NLME_OrphanJoinRequest(zgDefaultChannelList,
zgDefaultStartingScanDuration);
}
}
else
{
#ifdefined(LCD_SUPPORTED)
HalLcdWriteScreen("StartDeviceERR","MODEunknown");
#endif
}
}
#endif//!
ZDOCOORDINATOR||SOFT_START
if(ret!
=ZSuccess)
osal_start_timerEx(ZDAppTaskID,ZDO_NETWORK_INIT,NWK_RETRY_DELAY);
}
建立网络的过程大致是这样的:
①在ZDApp_Init中调用ZDOInitDevice(0)这个函数;②在ZDOInitDevice中调用ZDApp_NetworkInit(extendedDelay)这个函数;③在ZDApp_NetworkInit(extendedDelay)中调用
osal_start_timerEx(ZDAppTaskID,ZDO_NETWORK_INIT,delay)这个函数来开启一个定时器;④定时时间到后在ZDApp_event_loop中的调用ZDO_StartDevice这个函数;⑤在ZDO_StartDevice这个函数中调用NLME_NetworkFormationRequest这个函数来建立网络;
如果不是自启动(是holdautostart),则在自己
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- zstack 网络 建立