zigbee组网程序解读_第1页
zigbee组网程序解读_第2页
zigbee组网程序解读_第3页
zigbee组网程序解读_第4页
zigbee组网程序解读_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论