zigbee組網(wǎng)程序解讀_第1頁
zigbee組網(wǎng)程序解讀_第2頁
zigbee組網(wǎng)程序解讀_第3頁
zigbee組網(wǎng)程序解讀_第4頁
zigbee組網(wǎng)程序解讀_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、Zigbee組網(wǎng)過程解讀第一個功能:協(xié)調(diào)器的組網(wǎng),終端設(shè)備和路由設(shè)備發(fā)現(xiàn)網(wǎng)絡(luò)以及加入網(wǎng)絡(luò)/第一步:Z-Stack  由 main()函數(shù)開始執(zhí)行,main()函數(shù)共做了 2 件事:一是系統(tǒng)初始化,另外一件是開始執(zhí)行輪轉(zhuǎn)查詢式操作系統(tǒng)int main( void )                           

2、./ Initialize the operating systemosal_init_system();  /第二步,操作系統(tǒng)初始化.osal_start_system(); /初始化完系統(tǒng)任務(wù)事件后,正式開始執(zhí)行操作系統(tǒng)  . /第二步,進(jìn)入 osal_init_system()函數(shù),執(zhí)行操作系統(tǒng)初始化uint8 osal_init_system( void )      /初始化操作系統(tǒng),其中最重要的是,初始化操作系統(tǒng)的任務(wù)/ 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();  /第三步,執(zhí)行操作系統(tǒng)任務(wù)初始化函數(shù)/ Setup efficient search for the first fr

4、ee block of heap.  osal_mem_kick();  return ( SUCCESS );/第三步,進(jìn)入osalInitTasks()函數(shù),執(zhí)行操作系統(tǒng)任務(wù)初始化void osalInitTasks( void )       /第三步,初始化操作系統(tǒng)任務(wù)  uint8 taskID = 0;  tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);  osal_memset( t

5、asksEvents, 0, (sizeof( uint16 ) * tasksCnt);/任務(wù)優(yōu)先級由高向低依次排列,高優(yōu)先級對應(yīng) 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層,初始化 ,執(zhí)行ZDApp_init函數(shù)后,如果是協(xié)調(diào)器將建立網(wǎng)絡(luò),如果是終端設(shè)備將加入網(wǎng)絡(luò)。#if def

7、ined ( ZIGBEE_FREQ_AGILITY ) | defined ( ZIGBEE_PANID_CONFLICT )   ZDNwkMgr_Init( taskID+ );#endif  SerialApp_Init( taskID );  /應(yīng)用層SerialApp層初始化,需要用戶考慮     在此處設(shè)置了一個按鍵觸發(fā)事件,               

8、;                          /當(dāng)有按鍵按下的時候,產(chǎn)生一個系統(tǒng)消息                     

9、60;     /第四步,進(jìn)入ZDApp_init()函數(shù),執(zhí)行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層時,就執(zhí)行該條件語句  ZDOInitDevice( 0 );     /The second step, 接著轉(zhuǎn)到ZDOInitDevice()函數(shù),執(zhí)行The third step;    else  / Blink LED to indicate

13、 HOLD_START    HalLedBlink ( HAL_LED_4, 0, 50, 500 );    ZDApp_RegisterCBs();/The third step,執(zhí)行ZDOInitDevice()函數(shù),執(zhí)行設(shè)備初始化uint8 ZDOInitDevice( uint16 startDelay )  /The third step, ZDO層初始化設(shè)備,   ./ Trigger the network startZDApp_NetworkInit( extendedDelay ); 

14、;  /網(wǎng)絡(luò)初始化,跳到相應(yīng)的函數(shù)里頭,執(zhí)行The fourth step   ./The fouth step,執(zhí)行 ZDApp_NetWorkInit()函數(shù)void ZDApp_NetworkInit( uint16 delay )  /The fourth step,網(wǎng)絡(luò)初始化  if ( delay )  / Wait awhile before starting the device    osal_start_timerEx( ZDAppTaskID, ZDO_NETWORK_INIT, d

15、elay );    /發(fā)送ZDO_NETWORK_INIT(網(wǎng)絡(luò)初始化)消息到 ZDApp層,轉(zhuǎn)到                                       &

16、#160;                                                 &

17、#160;                        /ZDApp層,執(zhí)行The fifth step  , ZDApp_event_loop() 函數(shù)                  

18、;                                               else    

19、;  osal_set_event( ZDAppTaskID, ZDO_NETWORK_INIT );  /The fifth step,轉(zhuǎn)到ZDApp_event_loop()函數(shù)UINT16 ZDApp_event_loop( uint8 task_id, UINT16 events )if ( events & ZDO_NETWORK_INIT )   /The fivth step,網(wǎng)絡(luò)初始化事件處理  / Initialize apps and start the network    devSt

20、ate = DEV_INIT;/設(shè)備邏輯類型,啟動模式,信標(biāo)時間,超幀長度,接著轉(zhuǎn)到The sixth step,去啟動設(shè)備,接著執(zhí)行The sixth step,轉(zhuǎn)到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,執(zhí)行ZDO_StartDevice()函數(shù),啟動設(shè)備void ZDO_StartDevice( byte logicalType, devStartModes_t startMode, byte beaconOrder, byte superframeOrder ) /The sixth

22、 step.if ( ZG_BUILD_COORDINATOR_TYPE && logicalType = NODETYPE_COORDINATOR )   /當(dāng)設(shè)備作為協(xié)調(diào)器時,執(zhí)行這個條件語句。      if ( startMode = MODE_HARD )          devState = DEV_COORD_STARTING; /向網(wǎng)絡(luò)層發(fā)送網(wǎng)絡(luò)形成請求。當(dāng)網(wǎng)絡(luò)層執(zhí)行 NLME_NetworkFormationR

23、equest()建立網(wǎng)絡(luò)后,將給予 ZDO層反饋信息。       / 接著轉(zhuǎn)到The seventh step,去執(zhí)行ZDApp層的  ZDO_NetworkFormationConfirmCB()函數(shù)      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) ) /當(dāng)為終端設(shè)備或路由時      if ( (startMode = MODE_JOIN) | (startMode = MODE_REJOIN) )          devState = DEV_NWK_DISC;/ zgDefaultChannelList與協(xié)調(diào)器形成網(wǎng)絡(luò)的通道號匹配。 網(wǎng)絡(luò)發(fā)現(xiàn)請求。      / 繼而轉(zhuǎn)到Z

27、DO_NetworkDiscoveryConfirmCB()函數(shù)      ret = NLME_NetworkDiscoveryRequest( zgDefaultChannelList, zgDefaultStartingScanDuration );      ./The seventh step,分兩種情況,1.協(xié)調(diào)器   2.路由器或終端設(shè)備1)協(xié)調(diào)器void ZDO_NetworkFormationConfirmCB( ZStatus_t Status ) /The sev

28、enth step,給予ZDO層網(wǎng)絡(luò)形成反饋信息(協(xié)調(diào)器)osal_set_event( ZDAppTaskID, ZDO_NETWORK_START ); /發(fā)送網(wǎng)絡(luò)啟動事件 到 ZDApp層,接著轉(zhuǎn)到ZDApp_event_loop()函數(shù)                             .UIN

29、T16 ZDApp_event_loop( uint8 task_id, UINT16 events ).if ( events & ZDO_NETWORK_START )  / 網(wǎng)絡(luò)啟動事件    ZDApp_NetworkStartEvt();    /網(wǎng)絡(luò)啟動事件,接著跳轉(zhuǎn)到The ninth step, 執(zhí)行ZDApp_NetworkStartEvt()函數(shù)  .    void ZDApp_NetworkStartEvt( void )  

30、0;  /處理網(wǎng)絡(luò)啟動事件.osal_pwrmgr_device( PWRMGR_ALWAYS_ON );                           /電源總是上電osal_set_event( ZDAppTaskID, ZDO_STATE_CHANGE_EVT ); /設(shè)置網(wǎng)絡(luò)狀態(tài)改變事件,發(fā)送到ZDApp層,轉(zhuǎn)到T

31、he tenth step,去.                                               &#

32、160;                                                 / ZDApp

33、_event_loop()函數(shù),找到相對應(yīng)的網(wǎng)絡(luò)改變事件。2)路由器或終端設(shè)備/The seventh step(終端設(shè)備), 當(dāng)發(fā)現(xiàn)有網(wǎng)絡(luò)存在時,網(wǎng)絡(luò)層將給予 ZDO 層發(fā)現(xiàn)網(wǎng)絡(luò)反饋信息ZStatus_t ZDO_NetworkDiscoveryConfirmCB( uint8 ResultCount, networkDesc_t *NetworkList )     ./把網(wǎng)絡(luò)發(fā)現(xiàn)這個反饋消息,發(fā)送到ZDA層,轉(zhuǎn)到 ZDApp_ProcessOSALMsg(),執(zhí)行  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:      / (終端設(shè)備),網(wǎng)絡(luò)發(fā)現(xiàn)響應(yīng)。   ./當(dāng)發(fā)現(xiàn)有網(wǎng)絡(luò)存在時,網(wǎng)絡(luò)層將給予 ZDO 層發(fā)現(xiàn)網(wǎng)絡(luò)反饋信息。然后由網(wǎng)絡(luò)層發(fā)起加入網(wǎng)絡(luò)請求,    &

35、#160;     /如加入網(wǎng)絡(luò)成功,則網(wǎng)絡(luò)層將給予 ZDO 層加入網(wǎng)絡(luò)反饋,執(zhí)行NLME_JoinRequest()函數(shù)。然后轉(zhuǎn)到           /The ninth step,執(zhí)行 ZDO_JoinConfirmCB()函數(shù)            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(終端設(shè)備), 終端設(shè)備加入網(wǎng)絡(luò)響應(yīng)。./將ZDO_NWK_JOIN_IND事件發(fā)送到ZDA層,執(zhí)行 ZDApp_ProcessOSALMsg()函數(shù)。

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:            /終端設(shè)備,加入網(wǎng)絡(luò)反饋信息事件。      if ( ZG_BUILD_JOININ

41、G_TYPE && ZG_DEVICE_JOINING_TYPE )      ZDApp_ProcessNetworkJoin(); /轉(zhuǎn)到ZDApp_ProcessNetworkJoin(),執(zhí)行ZDApp_ProcessNetworkJoin()函數(shù)。            break;. 在執(zhí)行ZDApp_ProcessNetworkJoin()函數(shù)的時候,要分兩種情況,一種是終端設(shè)備,一種是路由器:3)終端設(shè)備

42、:void ZDApp_ProcessNetworkJoin( void )  /處理網(wǎng)絡(luò)加入事件。.if ( nwkStatus = ZSuccess )    /設(shè)置 ZDO_STATE_CHANGE_EVT ,發(fā)送到ZDA層,執(zhí)行 ZDApp_event_loop()函數(shù)。      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; /設(shè)備狀態(tài)變成路由器        osal_pwrmgr_device( PWRMGR_ALWAYS_ON );            else              / remain as end device!       &#

48、160;    osal_set_event( ZDAppTaskID, ZDO_STATE_CHANGE_EVT );     /設(shè)置ZDO狀態(tài)改變事件      / Return unprocessed events      return (events ZDO_ROUTER_START);    /The eighth step,執(zhí)行ZDO狀態(tài)改變事件UINT16 ZDApp_event_

49、loop( uint8 task_id, UINT16 events ).if ( events & ZDO_STATE_CHANGE_EVT )  /The eighth step, 網(wǎng)絡(luò)改變事件,這個事件就是在設(shè)備加入網(wǎng)絡(luò)成功后,                             

50、                                        /并在網(wǎng)絡(luò)中的身份確定后產(chǎn)生的一個事件  ZDO_UpdateNwkStatus( devState ); 

51、/更新網(wǎng)絡(luò)狀態(tài),轉(zhuǎn)到The eleventh step,執(zhí)行 ZDO_UpdateNwkStatus()函數(shù)。.  /The ninth step,執(zhí)行ZDO_UpdateNwkStatus()函數(shù),完成網(wǎng)絡(luò)狀態(tài)更新void ZDO_UpdateNwkStatus(devStates_t state)  /The ninth step, 更新網(wǎng)絡(luò)狀態(tài).zdoSendStateChangeMsg(state, *(pItem->epDesc->task_id);  /發(fā)送狀態(tài)改變消息到zdo層,這是The tenth step,轉(zhuǎn)到  

52、;                                                  

53、;                                                  

54、;  /zdoSendStateChangeMsg()函數(shù).  ZDAppNwkAddr.addr.shortAddr = NLME_GetShortAddr();  /調(diào)用NLME_GetShortAddr()函數(shù),獲得16位短地址。  (void)NLME_GetExtAddr();  / Load the saveExtAddr pointer.  /獲得64位的IEEE地址。/The tenth step,執(zhí)行zdoSendStateChangeMsg()函數(shù)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狀態(tài)沒有任何改變,再一次,跳到  &

57、#160;                                                 &

58、#160;                                                 &

59、#160; /ZDO_STATE_CHANGE_EVT事件處理函數(shù)。        else          pMsg->event = ZDO_STATE_CHANGE;      /如果ZDO狀態(tài)改變了 了,把ZDO_STATE_CHANGE這個消息保存到pMsg      pMsg->status = state;  

60、    (void)osal_msg_send(taskId, (uint8 *)pMsg);    /轉(zhuǎn)到MT_TASK.C,去執(zhí)行The eleven step, MT_ProcessIncomingCommand()函數(shù)        ./The eleventh step,去執(zhí)行MT_ProcessIncomingCommand()函數(shù)void MT_ProcessIncomingCommand( mtOSALSerialData_t *msg ).case ZDO_STATE

61、_CHANGE:        /The thirteenth step, 接著跳到MT_ZdoStateChangeCB()函數(shù)。                                 &

62、#160;                     /自此,協(xié)調(diào)器組網(wǎng)形成(終端設(shè)備成功加入網(wǎng)絡(luò))MT_ZdoStateChangeCB(osal_event_hdr_t *)msg);         break;./第五步,/初始化玩系統(tǒng)任務(wù)事件后,正是開始執(zhí)行操作系統(tǒng),此時操作系統(tǒng)不斷的檢測有沒有任務(wù)事件發(fā)生,一

63、旦檢測到有事件發(fā)生,就轉(zhuǎn) /到相應(yīng)的處理函數(shù),進(jìn)行處理。void osal_start_system( void )  /第五步,正式執(zhí)行操作系統(tǒng)#if !defined ( ZBIT ) && !defined ( UBIT )  for(;)  / Forever Loop     /死循環(huán)#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;   / 得到待處理的最高優(yōu)先級任務(wù)索引號idx          while (+idx < tasksCnt);    if (idx < tasksCnt)          uint16 events;      halIntState_t intState;    

66、0; HAL_ENTER_CRITICAL_SECTION(intState);  /進(jìn)入臨界區(qū)      events = tasksEventsidx;             /提取需要處理的任務(wù)中的事件      tasksEventsidx = 0;  / Clear the Events for this task.   /

67、清除本次任務(wù)的事件      HAL_EXIT_CRITICAL_SECTION(intState);   /退出臨界區(qū)      events = (tasksArridx)( idx, events ); /通過指針調(diào)用任務(wù)處理函數(shù)  , 緊接著跳到相應(yīng)的函數(shù)去處理,此為第五步      HAL_ENTER_CRITICAL_SECTION(intState);  /進(jìn)入臨界區(qū)  &

68、#160;   tasksEventsidx |= events;  / Add back unprocessed events to the current task.  / 保存未處理的事件      HAL_EXIT_CRITICAL_SECTION(intState);   /退出臨界區(qū)    #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  第二個功能:設(shè)備間的綁定            &#

70、160;                                                 &#

71、160;                                                 &#

72、160;                                                 &#

73、160;                                                 &#

74、160;       -引用自藍(lán)天白云         UINT16 SerialApp_ProcessEvent( uint8 task_id, UINT16 events )  /當(dāng)有事件傳遞到應(yīng)用層的時候,執(zhí)行此處if ( events & SYS_EVENT_MSG )   / 有事件傳遞過來,故通過這個條件語句  .case KEY_CHANGE:   

75、60;     /鍵盤觸發(fā)事件        SerialApp_HandleKeys( (keyChange_t *)MSGpkt)->state, (keyChange_t *)MSGpkt)->keys ); /接著跳到相應(yīng)的按鍵處理函數(shù)去執(zhí)行        break;.  ZDO終端設(shè)備綁定請求:設(shè)備能告訴協(xié)調(diào)器他們想建立綁定表格報告。該協(xié)調(diào)器將使協(xié)調(diào)并在這兩個設(shè)備上創(chuàng)建綁定表格條目。

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 );/終端設(shè)備綁定請求     

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;             /終端設(shè)備綁定請求                            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是發(fā)送終端設(shè)備綁定請求方式,SW4是發(fā)送描述符

88、匹配請求方式。如果按下SW2的話,使用終端設(shè)備綁定請求方式,這里是要通過終端告訴協(xié)調(diào)器他們想要建立綁定表格,協(xié)調(diào)器將協(xié)調(diào)這兩個請求的設(shè)備,在兩個設(shè)備上建立綁定表格條目。(1)終端設(shè)備向協(xié)調(diào)器發(fā)送終端設(shè)備綁定請求  調(diào)用ZDP_EndDeviceBindReq()函數(shù)發(fā)送綁定請求。ZDP_EndDeviceBindReq( &dstAddr,    /目的地址設(shè)為0x0000;              

89、60;         NLME_GetShortAddr(),                        SerialApp_epDesc.endPoint, /EP號         

90、0;              SERIALAPP_PROFID,/Profile ID                     SERIALAPP_MAX_CLUSTERS,  /輸入簇的數(shù)目     

91、60;          (cId_t *)SerialApp_ClusterList, /輸入簇列表                    SERIALAPP_MAX_CLUSTERS, /輸出簇數(shù)目          

92、;       (cId_t *)SerialApp_ClusterList,/輸出簇列表                            FALSE );該函數(shù)實(shí)際調(diào)用無線發(fā)送函數(shù)將綁定請求發(fā)送給協(xié)調(diào)器節(jié)點(diǎn):默認(rèn)clusterID為End_Device_Bind

93、_req,最后通過AF_DataRequest()發(fā)送出去.fillAndSend( &ZDP_TransID, dstAddr, End_Device_Bind_req, len );最后通過AF_DataRequest()發(fā)送出去,這里的&afAddr,是目的地址; &ZDApp_epDesc ,是端口號; clusterID,是簇號; len+1,是數(shù)據(jù)的長度;/ZDP_TmpBuf-1,是數(shù)據(jù)的內(nèi)容; transSeq,是數(shù)據(jù)的順序號; ZDP_TxOptions,是發(fā)射的一個選項 ; AF_DEFAULT_RADIUS,是一個默認(rèn)的半徑(跳數(shù))。AF_Data

94、Request( &afAddr, &ZDApp_epDesc, clusterID,               (uint16)(len+1), (uint8*)(ZDP_TmpBuf-1),            transSeq, ZDP_TxOptions,  AF_DEFAULT_RADIUS );(2) 協(xié)調(diào)

95、器收到終端設(shè)備綁定請求End_Device_Bind_req這個信息會傳送到ZDO層,在ZDO層的事件處理函數(shù)中,調(diào)用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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論