ZIGBEE协调器启动Word文件下载.docx
《ZIGBEE协调器启动Word文件下载.docx》由会员分享,可在线阅读,更多相关《ZIGBEE协调器启动Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。
![ZIGBEE协调器启动Word文件下载.docx](https://file1.bdocx.com/fileroot1/2022-10/13/1162d617-7e02-4fe1-8d0f-50253ff644ae/1162d617-7e02-4fe1-8d0f-50253ff644ae1.gif)
“飞比”Zigbee论坛使用的协议栈版本信息:
ZigBee2006\ZStack-1.4.3-1.2.1Zigbee网络设备启动流程—协调器(自启动模式)—以SampleApp的协调器为例.1、协调器预编译信禽控占刘柱季哦搀葬粟眼戒退尿疑砰牧酉杨糕朽参梧月斧限战厅贿蚁献毖烙铣街报谩挟乞枝女淑鼠训洒繁帚远捎炒愉避测儿弥廊穗蛰曰乙讨破掘撮
“飞比”Zigbee论坛ZIGBEE协调器启动【转自小峰博客】协调器的启动【自动模式】发布:
1、协调器预编译信息
通过project->
options->
c/c++compiler->
extraOptions可以看到协调器所带的配置文件为:
-f$PROJ_DIR$\..\..\..\Tools\CC2430DB\f8wCoord.cfg
-f$PROJ_DIR$\..\..\..\Tools\CC2430DB\f8wConfig.cfg
即编译了ZDO_COORDINATOR和RTR_NWK.
Preprocessor->
Definedsymbols可以看到协调器预编译包含了:
CC2430EB;
ZTOOL_P1;
MT_TASK;
LCD_SUPPORTED=DEBUG;
MANAGED_SCAN
没有编译HOLD_AUTO_START和SOFT_START.
2、具体流程
main()->
osal_init_system()->
osalInitTasks()->
ZDApp_Init()
进入ZDApp_Init()函数:
**************************************
voidZDApp_Init(bytetask_id)
{
uint8capabilities;
//SavethetaskID
ZDAppTaskID=task_id;
//InitializetheZDOglobaldeviceshortaddressstorage
ZDAppNwkAddr.addrMode=Addr16Bit;
ZDAppNwkAddr.addr.shortAddr=INVALID_NODE_ADDR;
//0xFFFE
(void)NLME_GetExtAddr();
//LoadthesaveExtAddrpointer.
//Checkformanual"
HoldAutoStart"
//检测到有手工设置SW_1则会设置devState=DEV_HOLD,从而避开网络初始化
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
//setbroadcastaddressmasktosupportbroadcastfiltering
NLME_GetRequest(nwkCapabilityInfo,0,&
capabilities);
NLME_SetBroadcastFilter(capabilities);
//Startthedevice?
if(devState!
=DEV_HOLD)
ZDOInitDevice(0);
}
/*如果devState=DEV_HOLD,则不会调用ZDOInitDevice()来初始化网络
即不组网也不进网.LED4闪烁等待应用程序来开启设备并初始化网络
*/
else
//BlinkLEDtoindicateHOLD_START
HalLedBlink(HAL_LED_4,0,50,500);
ZDApp_RegisterCBs();
协调器没有编译HOLD_AUTO_START,也没有手工设置SW_1,初始化devState=DEV_INIT(参见基本问题说明3).因此直接在ZDApp_Init()中进入ZDOInitDevice(0)开启设备.
uint8ZDOInitDevice(uint16startDelay)
//初始化设备网络状态为ZDO_INITDEV_NEW_NETWORK_STATE:
新的网络状态.
//可能意味着ZCD_NV_STARTUP_OPTION不能恢复,或没有任何网络状态恢复
uint8networkStateNV=ZDO_INITDEV_NEW_NETWORK_STATE;
uint16extendedDelay=0;
devState=DEV_INIT;
//RemovetheHoldstate
//Initializeleavecontrollogic
//函数读取NV项目ZCD_NV_LEAVE_CTRL的值,ZDApp_LeaveCtrl指向这个值
ZDApp_LeaveCtrlInit();
//Checkleavecontrolresetsettings
ZDApp_LeaveCtrlStartup(&
devState,&
startDelay);
//Leavemaymaketheholdstatecomeback
//以上两个函数设置了对设备离开时的控制,如果有延时则延时,没有则
//把设备状态设为DEV_HOLD
if(devState==DEV_HOLD)
//ZDO_INITDEV_LEAVE_NOT_STARTED:
该设备没有在网络中,下次调用才启用.
return(ZDO_INITDEV_LEAVE_NOT_STARTED);
//Don'
tjoin-(onetime).
#ifdefined(NV_RESTORE)
//GetKeypaddirectlytoseeifaresetnvisneeded.
//HolddowntheSW_BYPASS_NVkey(definedinOnBoard.h)
//whilebooting(引导)toskippastNVRestore.
if(HalKeyRead()==SW_BYPASS_NV)
//SW_BYPASS_NV按键处于按下状态时,则避开网络层的NV存储
networkStateNV=ZDO_INITDEV_NEW_NETWORK_STATE;
//设备网络状态为新的网络状态
//DetermineifNVshouldberestored
//函数返回的设备网络状态要么是新的网络状态;
要么是恢复的网络状态;
以此
//来确定要不要读取NV里相应条目来恢复网络先前状态
networkStateNV=ZDApp_ReadNetworkRestor