ZStatk协调器 路由器 终端的确定Simple例程二.docx
- 文档编号:8340092
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:12
- 大小:19.17KB
ZStatk协调器 路由器 终端的确定Simple例程二.docx
《ZStatk协调器 路由器 终端的确定Simple例程二.docx》由会员分享,可在线阅读,更多相关《ZStatk协调器 路由器 终端的确定Simple例程二.docx(12页珍藏版)》请在冰豆网上搜索。
ZStatk协调器路由器终端的确定Simple例程二
Z-Statk协调器路由器终端的确定---Simple例程
(二) 2010-12-2410:
09:
42
分类:
嵌入式
下面看一下终端结点的不同之处,下面这个图是终端结点的的编译选项,这里我们可以看到没有了编译选项SOFT_START。
这里我们重点看一下不同之处。
#ifdefined(ZDO_COORDINATOR)&&!
defined(SOFT_START)
//Setthedefaulttocoodinator
devStartModes_tdevStartMode=MODE_HARD;
#else
devStartModes_tdevStartMode=MODE_JOIN; //Assumejoining
//devStartModes_tdevStartMode=MODE_RESUME;//ifalready"directlyjoined"
//toparent.SettomakethedevicedoanOrphanscan.
#endif
//DeviceLogicalType
uint8zgDeviceLogicalType=DEVICE_LOGICAL_TYPE;
#ifdefined(SOFT_START)
#defineDEVICE_LOGICAL_TYPEZG_DEVICETYPE_SOFT
#elifdefined(ZDO_COORDINATOR)
#defineDEVICE_LOGICAL_TYPEZG_DEVICETYPE_COORDINATOR
#elifdefined(RTR_NWK)
#defineDEVICE_LOGICAL_TYPEZG_DEVICETYPE_ROUTER
#else
#defineDEVICE_LOGICAL_TYPEZG_DEVICETYPE_ENDDEVICE
#endif
最后得出
zgDeviceLogicalType=DEVICE_LOGICAL_TYPE=ZG_DEVICETYPE_ENDDEVICE
这里主要的不同还是在应用程序中的按键部分,下面是按键的程序,这个是在SimpleSwitch.c中
voidzb_HandleKeys(uint8shift,uint8keys)
{
uint8startOptions;
uint8logicalType;
//Shiftisusedtomakeeachbutton/switchdualpurpose.
if(shift)
{
if(keys&HAL_KEY_SW_1)
{
}
if(keys&HAL_KEY_SW_2)
{
}
if(keys&HAL_KEY_SW_3)
{
}
if(keys&HAL_KEY_SW_4)
{
}
}
else
{
if(keys&HAL_KEY_SW_1)
{
if(myAppState==APP_INIT)
{
//Intheinitstate,keysareusedtoindicatethelogicalmode.
//TheSwitchdeviceisalwaysanend-device 在这里当按下S1按键时设置为终端设备
logicalType=ZG_DEVICETYPE_ENDDEVICE;
zb_WriteConfiguration(ZCD_NV_LOGICAL_TYPE,sizeof(uint8),&logicalType);
//Domoreconfigurationifnecessaryandthenrestartdevicewithauto-startbitset
zb_ReadConfiguration(ZCD_NV_STARTUP_OPTION,sizeof(uint8),&startOptions);
startOptions=ZCD_STARTOPT_AUTO_START;
zb_WriteConfiguration(ZCD_NV_STARTUP_OPTION,sizeof(uint8),&startOptions);
zb_SystemReset();
}
else
{
//Initiateabindingwithnulldestination
zb_BindDevice(TRUE,TOGGLE_LIGHT_CMD_ID,NULL);
}
}
if(keys&HAL_KEY_SW_2)
{
if(myAppState==APP_INIT)
{
//Intheinitstate,keysareusedtoindicatethelogicalmode.
//TheSwitchdeviceisalwaysanend-device按键SW2和SW1的作用是一样的,都是设置为终端设备,这里也和协调器和路由器稍微有点不同
logicalType=ZG_DEVICETYPE_ENDDEVICE;
zb_WriteConfiguration(ZCD_NV_LOGICAL_TYPE,sizeof(uint8),&logicalType);
zb_ReadConfiguration(ZCD_NV_STARTUP_OPTION,sizeof(uint8),&startOptions);
startOptions=ZCD_STARTOPT_AUTO_START;
zb_WriteConfiguration(ZCD_NV_STARTUP_OPTION,sizeof(uint8),&startOptions);
zb_SystemReset();
}
else
{
//Sendthecommandtotogglelight
zb_SendDataRequest(0xFFFE,TOGGLE_LIGHT_CMD_ID,0,
(uint8*)NULL,myAppSeqNumber,0,0);
}
}
if(keys&HAL_KEY_SW_3)
{
//Removeallexistingbindings
zb_BindDevice(FALSE,TOGGLE_LIGHT_CMD_ID,NULL);
}
if(keys&HAL_KEY_SW_4)
{
}
}
}
从上面可以看出KEY1KEY2都是作为终端设备的。
而在函数中也并没有改变上面的变量的类型。
下面的这个函数,在函数uint8ZDOInitDevice(uint16startDelay)调用的,上面在分析协调器的时,也有看到,这个函数在这里就直接返回,并没有起到什么作用。
voidZDAppDetermineDeviceType(void)
{
if(zgDeviceLogicalType==ZG_DEVICETYPE_ENDDEVICE)
return;
#ifdefined(SOFT_START)
if(zgDeviceLogicalType==ZG_DEVICETYPE_COORDINATOR)
{
devStartMode=MODE_HARD; //Startasacoordinator
ZDO_Config_Node_Descriptor.LogicalType=NODETYPE_COORDINATOR;
}
else
{
if(zgDeviceLogicalType==ZG_DEVICETYPE_ROUTER)
{
softStartAllowCoord=FALSE; //Don'tallowcoordtostart
continueJoining=TRUE;
}
devStartMode=MODE_JOIN; //Assumejoining
}
#endif//SOFT_START
}
UINT16ZDApp_event_loop(bytetask_id,UINT16events)
{
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);
}
}
在ZDO_StartDevice()函数中可以根据不同的选项来进行操作。
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);
}
在终端的结点时,就会执行蓝色的代码。
至此,在程序中设备类型就确定了。
这样整个工程中的三个设备就可以确定,并按照设定的方式来加入网络,或者形成网络了。
补充:
还有一个问题有点迷糊,现在解决一下,就是zgDeviceLogicalType全局变量是怎么改变的,因为这个全局变量会在函数voidZDAppDetermineDeviceType(void)用到,在工程中搜索zgDeviceLogicalType变量,并没有发现那里给其赋于了新值,只在ZGlobals.c文件中有下面的赋值,可是我们在应用程序中对NV条目也就是ZCD_NV_LOGICAL_TYPE中,写入了新的值。
在按键处理程序中,
uint8zgDeviceLogicalType=DEVICE_LOGICAL_TYPE;
zb_ReadConfiguration(ZCD_NV_LOGICAL_TYPE,sizeof(uint8),&logicalType);
if(logicalType!
=ZG_DEVICETYPE_ENDDEVICE)
{
logicalType=ZG_DEVICETYPE_COORDINATOR;
zb_WriteConfiguration(ZCD_NV_LOGICAL_TYPE,sizeof(uint8),&logicalType);
}
那条目ZCD_NV_LOGICAL_TYP中的值是怎么最后赋给了zgDeviceLogicalType变量呢?
这个按键程序完后会执行系统的重启命令。
可以看到在
typedefstructzgItem
{
uint16id;
uint16len;
void*buf;
}zgItem_t;
staticCONSTzgItem_tzgItemTable[]=
{
#ifdefined(NV_INIT)
{
ZCD_NV_LOGICAL_TYPE,sizeof(zgDeviceLogicalType),&zgDeviceLogicalType//在这里进行了彼此之间的联系
},
{
ZCD_NV_POLL_RATE,sizeof(zgPollRate),&zgPollRate
},
.......
}
在下面的函数初始化的进行判断
uint8zgInit(void)
{
uint8 i=0;
uint8 setDefault=FALSE;
//DowewanttodefaulttheConfigstatevalues 这里可以看到zgReadStartupOptions()读取ZCD_NV_STARTUP_OPTION条目的选项,在前面的应用中我们可以看到,ZCD_NV_STARTUP_OPTION条目中已经写入了ZCD_STARTOPT_AUTO_START值也就是0x04&0x01,if判断不成功。
setDefualt=FALSE
if(zgReadStartupOptions()&ZCD_STARTOPT_DEFAULT_CONFIG_STATE)
{
setDefault=TRUE;
}
...................
while(zgItemTable[i].id!
=0x00)
{
//Initializetheitem
zgItemInit(zgItemTable[i].id,zgItemTable[i].len,zgItemTable[i].buf,setDefault );
//Moveontothenextitem
i++;
}
//CleartheConfigStatedefault
if(setDefault)
{
zgWriteStartupOptions(ZG_STARTUP_CLEAR,ZCD_STARTOPT_DEFAULT_CONFIG_STATE);
}
return(ZSUCCESS);
}
#defineZCD_STARTOPT_DEFAULT_CONFIG_STATE 0x01
#defineZCD_STARTOPT_DEFAULT_NETWORK_STATE0x02
#defineZCD_STARTOPT_AUTO_START 0x04
在zgItemInit()函数中,由于传递过来的值是setDefault为FALSE,也就是NV条目中已经写入了值所以,不会进行默认的初始化,而是读出条目中的值 ,这样就会把ZCD_NV_LOGICAL_TYP条目中的值,赋值给了zgDeviceLogicalType变量。
这里也就是对这个变量的改变过程。
staticuint8zgItemInit(uint16id,uint16len,void*buf,uint8setDefault)
{
uint8status;
//Iftheitemdoesn'texistinNVmemory,createandinitialize
//itwiththevaluepassedin.如果条目已经存在的话,直接返回成功,不存在的的话直接创建和初始化
status=osal_nv_item_init(id,len,buf);
if(status==ZSUCCESS)
{
if(setDefault)
{
//WritethedefaultvaluebacktoNV
status= osal_nv_write(id,0,len,buf);
}
else
{
//TheitemexistsinNVmemory,readitfromNVmemory
条目已经存在则读取
status=osal_nv_read(id,0,len,buf);
}
}
return(status);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ZStatk协调器 路由器 终端的确定Simple例程二 ZStatk 协调 终端 的确 Simple 例程