版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Zigbee组网过程解读第一个功能:协调器的组网,终端设备和路由设备发现网络以及加入网络/第一步:Z-Stack 由 main()函数开始执行,main()函数共做了 2 件事:一是系统初始化,另外一件是开始执行轮转查询式操作系统int main( void )
2、./ Initialize the operating systemosal_init_system(); /第二步,操作系统初始化.osal_start_system(); /初始化完系统任务事件后,正式开始执行操作系统 . /第二步,进入 osal_init_system()函数,执行操作系统初始化uint8 osal_init_system( void ) /初始化操作系统,其中最重要的是,初始化操作系统的任务/ Initialize the Memory Allocation System
3、160; osal_mem_init();/ Initialize the message queue osal_qHead = NULL;/ Initialize the timers osalTimerInit();/ Initialize the Power Management System osal_pwrmgr_init();/ Initialize the system tasks.osalInitTasks(); /第三步,执行操作系统任务初始化函数/ Setup efficient search for the first fr
4、ee block of heap. osal_mem_kick(); return ( SUCCESS );/第三步,进入osalInitTasks()函数,执行操作系统任务初始化void osalInitTasks( void ) /第三步,初始化操作系统任务 uint8 taskID = 0; tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt); osal_memset( t
5、asksEvents, 0, (sizeof( uint16 ) * tasksCnt);/任务优先级由高向低依次排列,高优先级对应 taskID 的值反而小 macTaskInit( taskID+ ); /不需要用户考虑 nwk_init( taskID+ ); /不需要用户考虑 Hal_Init( taskID+ ); /硬件抽象层初始化,需要我们考虑#if defined( MT_TASK )
6、160; MT_TaskInit( taskID+ );#endif APS_Init( taskID+ ); /不需要用户考虑#if defined ( ZIGBEE_FRAGMENTATION ) APSF_Init( taskID+ );#endifZDApp_Init( taskID+ ); /第四步,ZDApp层,初始化 ,执行ZDApp_init函数后,如果是协调器将建立网络,如果是终端设备将加入网络。#if def
7、ined ( ZIGBEE_FREQ_AGILITY ) | defined ( ZIGBEE_PANID_CONFLICT ) ZDNwkMgr_Init( taskID+ );#endif SerialApp_Init( taskID ); /应用层SerialApp层初始化,需要用户考虑 在此处设置了一个按键触发事件,
8、; /当有按键按下的时候,产生一个系统消息
9、60; /第四步,进入ZDApp_init()函数,执行ZDApp层初始化/The first stepvoid ZDApp_Init( uint8 task_id ) /The first step,ZDApp层初始化。/ Save the task ID ZDAppTaskID = task_id;/ Initialize the ZDO global device short address storage ZDAppNwkAddr.addrMode = Ad
10、dr16Bit; ZDAppNwkAddr.addr.shortAddr = INVALID_NODE_ADDR; (void)NLME_GetExtAddr(); / Load the saveExtAddr pointer./ Check for manual "Hold Auto Start" ZDAppCheckForHoldKey();/ Initialize ZDO items and setup the device - type of device to create. ZDO_Init();/ R
11、egister the endpoint description with the AF / This task doesn't have a Simple description, but we still need / to register the endpoint. afRegister( (endPointDesc_t *)&ZDApp_epDesc );#if defined( ZDO_USERDESC_RESPONSE ) ZDApp_InitUserDesc();#endif / ZDO_USERDESC_RESP
12、ONSE/ Start the device? if ( devState != DEV_HOLD ) /devState 初值为DEV_INIT , 所以在初始化ZDA层时,就执行该条件语句 ZDOInitDevice( 0 ); /The second step, 接着转到ZDOInitDevice()函数,执行The third step; else / Blink LED to indicate
13、 HOLD_START HalLedBlink ( HAL_LED_4, 0, 50, 500 ); ZDApp_RegisterCBs();/The third step,执行ZDOInitDevice()函数,执行设备初始化uint8 ZDOInitDevice( uint16 startDelay ) /The third step, ZDO层初始化设备, ./ Trigger the network startZDApp_NetworkInit( extendedDelay );
14、; /网络初始化,跳到相应的函数里头,执行The fourth step ./The fouth step,执行 ZDApp_NetWorkInit()函数void ZDApp_NetworkInit( uint16 delay ) /The fourth step,网络初始化 if ( delay ) / Wait awhile before starting the device osal_start_timerEx( ZDAppTaskID, ZDO_NETWORK_INIT, d
15、elay ); /发送ZDO_NETWORK_INIT(网络初始化)消息到 ZDApp层,转到 &
16、#160; &
17、#160; /ZDApp层,执行The fifth step , ZDApp_event_loop() 函数
18、; else
19、; osal_set_event( ZDAppTaskID, ZDO_NETWORK_INIT ); /The fifth step,转到ZDApp_event_loop()函数UINT16 ZDApp_event_loop( uint8 task_id, UINT16 events )if ( events & ZDO_NETWORK_INIT ) /The fivth step,网络初始化事件处理 / Initialize apps and start the network devSt
20、ate = DEV_INIT;/设备逻辑类型,启动模式,信标时间,超帧长度,接着转到The sixth step,去启动设备,接着执行The sixth step,转到ZDO_StartDevice()ZDO_StartDevice( (uint8)ZDO_Config_Node_Descriptor.LogicalType, devStartMode,
21、160; DEFAULT_BEACON_ORDER, DEFAULT_SUPERFRAME_ORDER );/ Return unprocessed events return (events ZDO_NETWORK_INIT); /The sixth step,执行ZDO_StartDevice()函数,启动设备void ZDO_StartDevice( byte logicalType, devStartModes_t startMode, byte beaconOrder, byte superframeOrder ) /The sixth
22、 step.if ( ZG_BUILD_COORDINATOR_TYPE && logicalType = NODETYPE_COORDINATOR ) /当设备作为协调器时,执行这个条件语句。 if ( startMode = MODE_HARD ) devState = DEV_COORD_STARTING; /向网络层发送网络形成请求。当网络层执行 NLME_NetworkFormationR
23、equest()建立网络后,将给予 ZDO层反馈信息。 / 接着转到The seventh step,去执行ZDApp层的 ZDO_NetworkFormationConfirmCB()函数 ret = NLME_NetworkFormationRequest( zgConfigPANID, zgApsUseExtendedPANID, zgDefaultChannelList, &
24、#160; zgDefaultStartingScanDuration, beaconOrder,
25、; superframeOrder, false ); if ( ZG_BUILD_JOINING_TYPE && (logicalType = NOD
26、ETYPE_ROUTER | logicalType = NODETYPE_DEVICE) ) /当为终端设备或路由时 if ( (startMode = MODE_JOIN) | (startMode = MODE_REJOIN) ) devState = DEV_NWK_DISC;/ zgDefaultChannelList与协调器形成网络的通道号匹配。 网络发现请求。 / 继而转到Z
27、DO_NetworkDiscoveryConfirmCB()函数 ret = NLME_NetworkDiscoveryRequest( zgDefaultChannelList, zgDefaultStartingScanDuration ); ./The seventh step,分两种情况,1.协调器 2.路由器或终端设备1)协调器void ZDO_NetworkFormationConfirmCB( ZStatus_t Status ) /The sev
28、enth step,给予ZDO层网络形成反馈信息(协调器)osal_set_event( ZDAppTaskID, ZDO_NETWORK_START ); /发送网络启动事件 到 ZDApp层,接着转到ZDApp_event_loop()函数 .UIN
29、T16 ZDApp_event_loop( uint8 task_id, UINT16 events ).if ( events & ZDO_NETWORK_START ) / 网络启动事件 ZDApp_NetworkStartEvt(); /网络启动事件,接着跳转到The ninth step, 执行ZDApp_NetworkStartEvt()函数 . void ZDApp_NetworkStartEvt( void )
30、0; /处理网络启动事件.osal_pwrmgr_device( PWRMGR_ALWAYS_ON ); /电源总是上电osal_set_event( ZDAppTaskID, ZDO_STATE_CHANGE_EVT ); /设置网络状态改变事件,发送到ZDApp层,转到T
31、he tenth step,去.
32、160; / ZDApp
33、_event_loop()函数,找到相对应的网络改变事件。2)路由器或终端设备/The seventh step(终端设备), 当发现有网络存在时,网络层将给予 ZDO 层发现网络反馈信息ZStatus_t ZDO_NetworkDiscoveryConfirmCB( uint8 ResultCount, networkDesc_t *NetworkList ) ./把网络发现这个反馈消息,发送到ZDA层,转到 ZDApp_ProcessOSALMsg(),执行 ZDApp_SendMsg( ZDAppTaskID, ZDO_NWK_
34、DISC_CNF, sizeof(ZDO_NetworkDiscoveryCfm_t), (uint8 *)&msg );void ZDApp_ProcessOSALMsg( osal_event_hdr_t *msgPtr ) . case ZDO_NWK_DISC_CNF: / (终端设备),网络发现响应。 ./当发现有网络存在时,网络层将给予 ZDO 层发现网络反馈信息。然后由网络层发起加入网络请求, &
35、#160; /如加入网络成功,则网络层将给予 ZDO 层加入网络反馈,执行NLME_JoinRequest()函数。然后转到 /The ninth step,执行 ZDO_JoinConfirmCB()函数 if ( NLME_JoinRequest( (ZDO_NetworkDiscoveryCf
36、m_t *)msgPtr)->extendedPANID, BUILD_UINT16( (ZDO_NetworkDiscoveryCfm_t *)msgPtr)->panIdLSB, (ZDO_NetworkDiscoveryCfm_t *)msgPtr)->panIdMSB ),
37、 (ZDO_NetworkDiscoveryCfm_t *)msgPtr)->logicalChannel, ZDO_Config_Node_Descriptor.CapabilityFlags ) != ZSuccess )
38、0; ZDApp_NetworkInit( (uint16)(NWK_START_DELAY + (uint16)(osal_rand()& EXTENDED_JOINING_RANDOM_MA
39、SK) ); . void ZDO_JoinConfirmCB( uint16 PanId, ZStatus_t Status ) /The ninth step(终端设备), 终端设备加入网络响应。./将ZDO_NWK_JOIN_IND事件发送到ZDA层,执行 ZDApp_ProcessOSALMsg()函数。
40、0; ZDApp_SendMsg( ZDAppTaskID, ZDO_NWK_JOIN_IND, sizeof(osal_event_hdr_t), (byte*)NULL );void ZDApp_ProcessOSALMsg( osal_event_hdr_t *msgPtr ).case ZDO_NWK_JOIN_IND: /终端设备,加入网络反馈信息事件。 if ( ZG_BUILD_JOININ
41、G_TYPE && ZG_DEVICE_JOINING_TYPE ) ZDApp_ProcessNetworkJoin(); /转到ZDApp_ProcessNetworkJoin(),执行ZDApp_ProcessNetworkJoin()函数。 break;. 在执行ZDApp_ProcessNetworkJoin()函数的时候,要分两种情况,一种是终端设备,一种是路由器:3)终端设备
42、:void ZDApp_ProcessNetworkJoin( void ) /处理网络加入事件。.if ( nwkStatus = ZSuccess ) /设置 ZDO_STATE_CHANGE_EVT ,发送到ZDA层,执行 ZDApp_event_loop()函数。 osal_set_event( ZDAppTaskID, ZDO_STATE_CHANGE_EVT ); .4)路由器:void ZDApp_ProcessNetwork
43、Join( void ) . if ( ZSTACK_ROUTER_BUILD ) / NOTE: first two parameters are not used, see NLMEDE.h for details if ( ZDO_Config_Node_Descriptor.LogicalType != NODETYPE_DEVICE ) &
44、#160; NLME_StartRouterRequest( 0, 0, false ); /路由启动请求 .void ZDO_StartRouterConfirmCB( ZSt
45、atus_t Status ) nwkStatus = (byte)Status;. osal_set_event( ZDAppTaskID, ZDO_ROUTER_START );UINT16 ZDApp_event_loop( uint8 task_id, UINT16 events ) if ( events & ZDO_ROUTER_START ) if ( nwkStatus = ZSuccess )
46、0; if ( devState = DEV_END_DEVICE ) devState = DEV_ROUTER; &
47、#160; /设备状态变成路由器 osal_pwrmgr_device( PWRMGR_ALWAYS_ON ); else / remain as end device!
48、160; osal_set_event( ZDAppTaskID, ZDO_STATE_CHANGE_EVT ); /设置ZDO状态改变事件 / Return unprocessed events return (events ZDO_ROUTER_START); /The eighth step,执行ZDO状态改变事件UINT16 ZDApp_event_
49、loop( uint8 task_id, UINT16 events ).if ( events & ZDO_STATE_CHANGE_EVT ) /The eighth step, 网络改变事件,这个事件就是在设备加入网络成功后,
50、 /并在网络中的身份确定后产生的一个事件 ZDO_UpdateNwkStatus( devState );
51、/更新网络状态,转到The eleventh step,执行 ZDO_UpdateNwkStatus()函数。. /The ninth step,执行ZDO_UpdateNwkStatus()函数,完成网络状态更新void ZDO_UpdateNwkStatus(devStates_t state) /The ninth step, 更新网络状态.zdoSendStateChangeMsg(state, *(pItem->epDesc->task_id); /发送状态改变消息到zdo层,这是The tenth step,转到
52、;
53、;
54、; /zdoSendStateChangeMsg()函数. ZDAppNwkAddr.addr.shortAddr = NLME_GetShortAddr(); /调用NLME_GetShortAddr()函数,获得16位短地址。 (void)NLME_GetExtAddr(); / Load the saveExtAddr pointer. /获得64位的IEEE地址。/The tenth step,执行zdoSendStateChangeMsg()函数static void zdoSendStateChangeMsg(
55、uint8 state, uint8 taskId) /The tenth step, osal_event_hdr_t *pMsg = (osal_event_hdr_t *)osal_msg_find(taskId, ZDO_STATE_CHANGE); if (NULL = pMsg) if (NULL = (pMsg = (osal_event_hdr_t *)osal_msg_allocate(sizeof(osal_event_hdr_t)
56、0; / Upon failure to notify any EndPoint of the state change, re-set the ZDO event to / try again later when more Heap may be available. osal_set_event(ZDAppTaskID, ZDO_STATE_CHANGE_EVT); /如果ZDO状态没有任何改变,再一次,跳到 &
57、#160; &
58、#160; &
59、#160; /ZDO_STATE_CHANGE_EVT事件处理函数。 else pMsg->event = ZDO_STATE_CHANGE; /如果ZDO状态改变了 了,把ZDO_STATE_CHANGE这个消息保存到pMsg pMsg->status = state;
60、 (void)osal_msg_send(taskId, (uint8 *)pMsg); /转到MT_TASK.C,去执行The eleven step, MT_ProcessIncomingCommand()函数 ./The eleventh step,去执行MT_ProcessIncomingCommand()函数void MT_ProcessIncomingCommand( mtOSALSerialData_t *msg ).case ZDO_STATE
61、_CHANGE: /The thirteenth step, 接着跳到MT_ZdoStateChangeCB()函数。 &
62、#160; /自此,协调器组网形成(终端设备成功加入网络)MT_ZdoStateChangeCB(osal_event_hdr_t *)msg); break;./第五步,/初始化玩系统任务事件后,正是开始执行操作系统,此时操作系统不断的检测有没有任务事件发生,一
63、旦检测到有事件发生,就转 /到相应的处理函数,进行处理。void osal_start_system( void ) /第五步,正式执行操作系统#if !defined ( ZBIT ) && !defined ( UBIT ) for(;) / Forever Loop /死循环#endif uint8 idx = 0; osalTimeUpdate(); Hal_Proc
64、essPoll(); / This replaces MT_SerialPoll() and osal_check_timer(). do if (tasksEventsidx) / Task is highest priority that is ready. break;
65、0; / 得到待处理的最高优先级任务索引号idx while (+idx < tasksCnt); if (idx < tasksCnt) uint16 events; halIntState_t intState;
66、0; HAL_ENTER_CRITICAL_SECTION(intState); /进入临界区 events = tasksEventsidx; /提取需要处理的任务中的事件 tasksEventsidx = 0; / Clear the Events for this task. /
67、清除本次任务的事件 HAL_EXIT_CRITICAL_SECTION(intState); /退出临界区 events = (tasksArridx)( idx, events ); /通过指针调用任务处理函数 , 紧接着跳到相应的函数去处理,此为第五步 HAL_ENTER_CRITICAL_SECTION(intState); /进入临界区 &
68、#160; tasksEventsidx |= events; / Add back unprocessed events to the current task. / 保存未处理的事件 HAL_EXIT_CRITICAL_SECTION(intState); /退出临界区 #if defined( POWER_SAVING ) else
69、0; / Complete pass through all task events with no activity? osal_pwrmgr_powerconserve(); / Put the processor/system into sleep #endif 第二个功能:设备间的绑定
70、160;
71、160;
72、160;
73、160;
74、160; -引用自蓝天白云 UINT16 SerialApp_ProcessEvent( uint8 task_id, UINT16 events ) /当有事件传递到应用层的时候,执行此处if ( events & SYS_EVENT_MSG ) / 有事件传递过来,故通过这个条件语句 .case KEY_CHANGE:
75、60; /键盘触发事件 SerialApp_HandleKeys( (keyChange_t *)MSGpkt)->state, (keyChange_t *)MSGpkt)->keys ); /接着跳到相应的按键处理函数去执行 break;. ZDO终端设备绑定请求:设备能告诉协调器他们想建立绑定表格报告。该协调器将使协调并在这两个设备上创建绑定表格条目。
76、在这里是以SerialApp例子为例。void SerialApp_HandleKeys( uint8 shift, uint8 keys ). if ( keys & HAL_KEY_SW_2 ) / Joystick right HalLedSet ( HAL_LED_4, HAL_LED_MODE_OFF );/终端设备绑定请求
77、/ Initiate an End Device Bind Request for the mandatory endpoint dstAddr.addrMode = Addr16Bit; dstAddr.addr.shortAddr = 0x0000; / Coordinator 地址ZDP_EndDeviceBindReq( &dstAddr, NLME_GetShortAddr(),
78、0; /终端设备绑定请求 SerialApp_epDesc.endPoint,
79、60; SERIALAPP_PROFID,
80、60; SERIALAPP_MAX_CLUSTERS, (cId_t *)SerialApp_ClusterList, &
81、#160; SERIALAPP_MAX_CLUSTERS, (cId_t *)SerialApp_ClusterList
82、, FALSE ); . if ( keys & HAL_KEY_SW_4 ) HalLedSet
83、 ( HAL_LED_4, HAL_LED_MODE_OFF ); / Initiate a Match Description Request (Service Discovery) dstAddr.addrMode = AddrBroadcast; /广播地址 dstAddr.addr.shortAddr = NWK_BROADCAST_SHORTADDR;ZDP_MatchDescReq( &dstAd
84、dr, NWK_BROADCAST_SHORTADDR, /描述符匹配请求 这也是两不同匹配方式,使用的按键不同
85、0; SERIALAPP_PROFID, SERIALAPP_MAX_CLUSTERS,
86、0; (cId_t *)SerialApp_ClusterList, SERIALAPP_MAX_CLUSTERS,
87、160; (cId_t *)SerialApp_ClusterList, FALSE ); 说明:从上面可以看到,SW2是发送终端设备绑定请求方式,SW4是发送描述符
88、匹配请求方式。如果按下SW2的话,使用终端设备绑定请求方式,这里是要通过终端告诉协调器他们想要建立绑定表格,协调器将协调这两个请求的设备,在两个设备上建立绑定表格条目。(1)终端设备向协调器发送终端设备绑定请求 调用ZDP_EndDeviceBindReq()函数发送绑定请求。ZDP_EndDeviceBindReq( &dstAddr, /目的地址设为0x0000;
89、60; NLME_GetShortAddr(), SerialApp_epDesc.endPoint, /EP号
90、0; SERIALAPP_PROFID,/Profile ID SERIALAPP_MAX_CLUSTERS, /输入簇的数目
91、60; (cId_t *)SerialApp_ClusterList, /输入簇列表 SERIALAPP_MAX_CLUSTERS, /输出簇数目
92、; (cId_t *)SerialApp_ClusterList,/输出簇列表 FALSE );该函数实际调用无线发送函数将绑定请求发送给协调器节点:默认clusterID为End_Device_Bind
93、_req,最后通过AF_DataRequest()发送出去.fillAndSend( &ZDP_TransID, dstAddr, End_Device_Bind_req, len );最后通过AF_DataRequest()发送出去,这里的&afAddr,是目的地址; &ZDApp_epDesc ,是端口号; clusterID,是簇号; len+1,是数据的长度;/ZDP_TmpBuf-1,是数据的内容; transSeq,是数据的顺序号; ZDP_TxOptions,是发射的一个选项 ; AF_DEFAULT_RADIUS,是一个默认的半径(跳数)。AF_Data
94、Request( &afAddr, &ZDApp_epDesc, clusterID, (uint16)(len+1), (uint8*)(ZDP_TmpBuf-1), transSeq, ZDP_TxOptions, AF_DEFAULT_RADIUS );(2) 协调
95、器收到终端设备绑定请求End_Device_Bind_req这个信息会传送到ZDO层,在ZDO层的事件处理函数中,调用ZDApp_ProcessOSALMsg( (osal_event_hdr_t *)msg_ptr );UINT16 ZDApp_event_loop( byte task_id, UINT16 events ) uint8 *msg_ptr; if ( events & SYS_EVENT_MSG ) while ( (msg_ptr = osal_msg_receive( ZDAppTaskI
96、D ) ) ZDApp_ProcessOSALMsg( (osal_event_hdr_t *)msg_ptr ); / Release the memory osal_msg_deallocate( msg_ptr ); / Return unprocessed eventsreturn (events SYS_EVENT_MSG); void ZDApp_ProcessOSALMsg( osal_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025新疆青河县社保中心综柜岗位见习生招聘1人备考题库带答案详解
- 安庆2025年安徽安庆市迎江区新任教师招聘18人笔试历年参考题库附带答案详解
- 2026四川省肿瘤医院第二轮博士招聘10人备考题库及参考答案详解1套
- 2025年甘肃定西漳县文化馆人员招聘备考题库及参考答案详解一套
- 台州2025年下半年台州市黄岩区事业单位选聘16人笔试历年参考题库附带答案详解
- 2026四川绵阳虹源科技发展有限责任公司招聘储能工艺工程师等岗位2人备考题库及答案详解一套
- 南京南京市城市地下管线数字化管理中心2025年招聘编外笔试历年参考题库附带答案详解
- 北京北京市红十字血液中心公开招聘工作人员笔试历年参考题库附带答案详解
- 云南2025年云南马关县事业单位紧缺岗位第三轮招聘4人笔试历年参考题库附带答案详解
- 乐山2025年乐山市市级事业单位选调40人笔试历年参考题库附带答案详解
- T-CCUA 006-2024 信息系统审计机构服务能力评价
- PVC结构拉缝板技术交底
- 鲁科版高中化学选择性必修第一册第2章章末复习建构课课件
- DL∕T 5210.6-2019 电力建设施工质量验收规程 第6部分:调整试验
- 2024年安徽省高考地理试卷(真题+答案)
- 装修民事纠纷调解协议书
- 2023年PCB工程师年度总结及来年计划
- 森林防火工作先进个人事迹材料
- MH5006-2015民用机场飞行区水泥混凝土道面面层施工技术规范
- 施工交通疏导方案
- 1例低血糖昏迷的护理查房
评论
0/150
提交评论