ZigBee源碼程序及解釋
《ZigBee源碼程序及解釋》由會(huì)員分享,可在線閱讀,更多相關(guān)《ZigBee源碼程序及解釋(37頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、文檔供參考,可復(fù)制、編制,期待您的好評(píng)與關(guān)注! 協(xié)議棧無線透?jìng)骶幊淘恚? 第一個(gè)功能:協(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 )? ?? ?? ?? ?? ?? ?? ?? ???{ ??....... ??// Initialize the operating system ??osal_init_system(); ? ?? ?? ?? ? //第二步,操作系統(tǒng)初始化 ......
2、 ??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 ??osal_mem_init(); ??// Initialize the message queue ??osal_qHead = N
3、ULL; // 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 free block of heap. ??osal_mem_kick(); ??return
4、 ( 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( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt)); //任務(wù)優(yōu)先級(jí)由高向低依次排列,高優(yōu)先級(jí)對(duì)應(yīng) taskI
5、D 的值反而小 ??macTaskInit( taskID++ ); //不需要用戶考慮 ??nwk_init( taskID++ );? ?? ?//不需要用戶考慮 ??Hal_Init( taskID++ );? ?? ?//硬件抽象層初始化,需要我們考慮?? #if defined( MT_TASK )? ?? ? ??MT_TaskInit( taskID++ ); #endif ??APS_Init( taskID++ );? ?? ? //不需要用戶考慮 #if defined ( ZIGBEE_FRAGMENTATION )?? ??APSF_Init( ta
6、skID++ ); #endif ZDApp_Init( taskID++ );? ?//第四步,ZDApp層,初始化??,執(zhí)行ZDApp_init函數(shù)后,如果是協(xié)調(diào)器將建立網(wǎng)絡(luò),如果是終端設(shè)備將加入網(wǎng)絡(luò)。 #if defined ( ZIGBEE_FREQ_AGILITY ) || defined ( ZIGBEE_PANID_CONFLICT )?? ??ZDNwkMgr_Init( taskID++ ); #endif ??SerialApp_Init( taskID );??//應(yīng)用層SerialApp層初始化,需要用戶考慮? ???在此處設(shè)置了一個(gè)按鍵觸發(fā)事件, ? ?
7、? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???//當(dāng)有按鍵按下的時(shí)候,產(chǎn)生一個(gè)系統(tǒng)消息 }? ?? ?? ?? ?? ?? ?? ?? ?? ? //第四步,進(jìn)入ZDApp_init()函數(shù),執(zhí)行ZDApp層初始化 //The first step void ZDApp_Init( uint8 task_id )? ???//The first step,ZDApp層初始化。 { ??// Save the task ID ??ZDAppTaskID = task_id; ??// Initialize the ZDO global devi
8、ce short address storage ??ZDAppNwkAddr.addrMode = Addr16Bit; ??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 - typ
9、e of device to create. ??ZDO_Init(); // Register 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
10、(); #endif // ZDO_USERDESC_RESPONSE ??// Start the device? ??if ( devState != DEV_HOLD )? ?? ???//devState 初值為DEV_INIT , 所以在初始化ZDA層時(shí),就執(zhí)行該條件語句 ??{ ? ? ZDOInitDevice( 0 );? ???//The second step, 接著轉(zhuǎn)到ZDOInitDevice()函數(shù),執(zhí)行The third step; ??} ??else ??{ ? ? // Blink LED to indicate HOLD_START ?
11、? HalLedBlink ( HAL_LED_4, 0, 50, 500 ); ??} ??ZDApp_RegisterCBs(); } /* ZDApp_Init() */ //The third step,執(zhí)行ZDOInitDevice()函數(shù),執(zhí)行設(shè)備初始化 uint8 ZDOInitDevice( uint16 startDelay )??//The third step, ZDO層初始化設(shè)備, { ? ?....... // Trigger the network start ??ZDApp_NetworkInit( extendedDelay );? ?//
12、網(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, delay );? ? //發(fā)
13、送ZDO_NETWORK_INIT(網(wǎng)絡(luò)初始化)消息到 ZDApp層,轉(zhuǎn)到? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?//ZDApp層,執(zhí)行The fifth step??, ZDApp_event_loop() 函數(shù) ??}? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??? ??else ??{ ? ? osal_set_even
14、t( 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 ? ? devState = DEV_INIT; ? ? //設(shè)備邏輯類型
15、,啟動(dòng)模式,信標(biāo)時(shí)間,超幀長(zhǎng)度,接著轉(zhuǎn)到The sixth step,去啟動(dòng)設(shè)備,接著執(zhí)行The sixth step,轉(zhuǎn)到ZDO_StartDevice() ? ? ZDO_StartDevice( (uint8)ZDO_Config_Node_Descriptor.LogicalType, devStartMode,?? ? ?? ?? ?? ?? ?? ?? ?DEFAULT_BEACON_ORDER, DEFAULT_SUPERFRAME_ORDER ); ? ? // Return unprocessed events ? ? return (events ^ ZDO_NET
16、WORK_INIT); ??} } //The sixth step,執(zhí)行ZDO_StartDevice()函數(shù),啟動(dòng)設(shè)備 void ZDO_StartDevice( byte logicalType, devStartModes_t startMode, byte beaconOrder, byte superframeOrder ) //The sixth step { ...... if ( ZG_BUILD_COORDINATOR_TYPE && logicalType == NODETYPE_COORDINATOR )? ?//當(dāng)設(shè)備作為協(xié)調(diào)器時(shí),執(zhí)行這個(gè)條件語句。
17、 ??{ ? ? if ( startMode == MODE_HARD ) ? ? { ? ?? ?devState = DEV_COORD_STARTING;?? ? ?? ? //向網(wǎng)絡(luò)層發(fā)送網(wǎng)絡(luò)形成請(qǐng)求。當(dāng)網(wǎng)絡(luò)層執(zhí)行 NLME_NetworkFormationRequest()建立網(wǎng)絡(luò)后,將給予 ZDO層反饋信息。 ? ?? ? // 接著轉(zhuǎn)到The seventh step,去執(zhí)行ZDApp層的??ZDO_NetworkFormationConfirmCB()函數(shù) ? ?? ?ret = NLME_NetworkFormationRequest( zgConfigPAN
18、ID, zgApsUseExtendedPANID, zgDefaultChannelList, ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?zgDefaultStartingScanDuration, beaconOrder, ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?superframeOrder, false ); ? ? } if ( ZG_BUILD_JOINING_TYPE && (logicalType == NODETYPE_ROUTER || logicalType == NODETYP
19、E_DEVICE) ) //當(dāng)為終端設(shè)備或路由時(shí) ??{ ? ? if ( (startMode == MODE_JOIN) || (startMode == MODE_REJOIN) ) ? ? { ? ?? ?devState = DEV_NWK_DISC; ? ?? ?// zgDefaultChannelList與協(xié)調(diào)器形成網(wǎng)絡(luò)的通道號(hào)匹配。 網(wǎng)絡(luò)發(fā)現(xiàn)請(qǐng)求。 ? ?? ?// 繼而轉(zhuǎn)到ZDO_NetworkDiscoveryConfirmCB()函數(shù) ? ?? ?ret = NLME_NetworkDiscoveryRequest( zgDefaultChannelLis
20、t, zgDefaultStartingScanDuration ); ? ? } ??} ...... } //The seventh step,分兩種情況,1.協(xié)調(diào)器? ?2.路由器或終端設(shè)備 1)協(xié)調(diào)器 void ZDO_NetworkFormationConfirmCB( ZStatus_t Status ) //The seventh step,給予ZDO層網(wǎng)絡(luò)形成反饋信息(協(xié)調(diào)器) { osal_set_event( ZDAppTaskID, ZDO_NETWORK_START ); //發(fā)送網(wǎng)絡(luò)啟動(dòng)事件 到 ZDApp層,接著轉(zhuǎn)到ZDApp_event_lo
21、op()函數(shù)? ?? ?? ?? ?? ?? ?? ?? ?? ???? ? ...... } UINT16 ZDApp_event_loop( uint8 task_id, UINT16 events ) { ...... if ( events & ZDO_NETWORK_START )??// 網(wǎng)絡(luò)啟動(dòng)事件 ? ? { ? ?? ?ZDApp_NetworkStartEvt();? ? //網(wǎng)絡(luò)啟動(dòng)事件,接著跳轉(zhuǎn)到The ninth step, 執(zhí)行ZDApp_NetworkStartEvt()函數(shù) ??...... ? ? } } void ZDApp
22、_NetworkStartEvt( void )? ???//處理網(wǎng)絡(luò)啟動(dòng)事件 { ...... osal_pwrmgr_device( PWRMGR_ALWAYS_ON );? ?? ?? ?? ?? ?? ?? ?? ?? ?//電源總是上電 osal_set_event( ZDAppTaskID, ZDO_STATE_CHANGE_EVT ); //設(shè)置網(wǎng)絡(luò)狀態(tài)改變事件,發(fā)送到ZDApp層,轉(zhuǎn)到The tenth step,去 ......? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
23、 ?? ?? ?? ?? ?? ?? ?? ?? ? // ZDApp_event_loop()函數(shù),找到相對(duì)應(yīng)的網(wǎng)絡(luò)改變事件。 } 2)路由器或終端設(shè)備 //The seventh step(終端設(shè)備), 當(dāng)發(fā)現(xiàn)有網(wǎng)絡(luò)存在時(shí),網(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)這個(gè)反饋消息,發(fā)送到ZDA層,轉(zhuǎn)到 ZDApp_ProcessOSALMsg(),執(zhí)行
24、??ZDApp_SendMsg( ZDAppTaskID, ZDO_NWK_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ò)存在時(shí),網(wǎng)絡(luò)層將給予 ZDO 層發(fā)現(xiàn)網(wǎng)絡(luò)反饋信息。然后由網(wǎng)絡(luò)層發(fā)起加入網(wǎng)絡(luò)請(qǐng)求, ? ?? ?
25、? ? //如加入網(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_NetworkDiscoveryCfm_t *)msgPtr)->extendedPANID, ? ?? ?? ?? ?? ???BUILD_UINT16( ((ZDO_NetworkDiscoveryCfm_t *)msgPtr)->panIdLSB, ((ZDO_Network
26、DiscoveryCfm_t *)msgPtr)->panIdMSB ), ? ?? ?? ?? ?? ???((ZDO_NetworkDiscoveryCfm_t *)msgPtr)->logicalChannel, ? ?? ?? ?? ?? ???ZDO_Config_Node_Descriptor.CapabilityFlags ) != ZSuccess ) ? ?? ?? ?? ?{ ? ?? ?? ?? ???ZDApp_NetworkInit( (uint16)(NWK_START_DELAY ? ?? ?? ?? ?? ?? ?+ ((uint16)(osal_ra
27、nd()& EXTENDED_JOINING_RANDOM_MASK))) ); ? ?? ?? ?? ?} ? ?? ?? ? ...... ? ?} 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ù)。 ??ZDApp_SendMsg( ZDAppTaskID, ZDO_NWK_JOIN_IND, size
28、of(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_JOINING_TYPE && ZG_DEVICE_JOINING_TYPE ) ? ?? ?{ ? ?? ???ZDApp_ProcessNetworkJoin(); //轉(zhuǎn)到ZDApp_ProcessNetworkJoin()
29、,執(zhí)行ZDApp_ProcessNetworkJoin()函數(shù)。 ? ?? ?} ? ?? ?break; ...... } 在執(zhí)行ZDApp_ProcessNetworkJoin()函數(shù)的時(shí)候,要分兩種情況,一種是終端設(shè)備,一種是路由器: 3)終端設(shè)備: void ZDApp_ProcessNetworkJoin( void )??//處理網(wǎng)絡(luò)加入事件。 { ...... if ( nwkStatus == ZSuccess ) ? ? { ? ?? ?//設(shè)置 ZDO_STATE_CHANGE_EVT ,發(fā)送到ZDA層,執(zhí)行 ZDApp_event_loop(
30、)函數(shù)。 ? ?? ?osal_set_event( ZDAppTaskID, ZDO_STATE_CHANGE_EVT ); ? ? } ...... } 4)路由器: void ZDApp_ProcessNetworkJoin( void )?? { ...... ??if ( ZSTACK_ROUTER_BUILD ) ? ?? ???{ ? ?? ?? ? // NOTE: first two parameters are not used, see NLMEDE.h for details ? ?? ?? ? if ( ZDO_Config_Node_D
31、escriptor.LogicalType != NODETYPE_DEVICE ) ? ?? ?? ? { ? ?? ?? ?? ?NLME_StartRouterRequest( 0, 0, false );? ?? ?? ?? ?? ?//路由啟動(dòng)請(qǐng)求 ? ?? ?? ? } ? ?? ???} ...... } void ZDO_StartRouterConfirmCB( ZStatus_t Status ) { ??nwkStatus = (byte)Status; ...... ??osal_set_event( ZDAppTaskID, ZDO_ROUT
32、ER_START ); } UINT16 ZDApp_event_loop( uint8 task_id, UINT16 events ) { ??if ( events & ZDO_ROUTER_START ) ? ? { ? ?? ?if ( nwkStatus == ZSuccess ) ? ?? ?{ ? ?? ???if ( devState == DEV_END_DEVICE ) ? ?? ?? ? devState = DEV_ROUTER;? ?? ?? ?? ?? ?? ?? ?? ? //設(shè)備狀態(tài)變成路由器 ? ?? ???osal_pwr
33、mgr_device( PWRMGR_ALWAYS_ON ); ? ?? ?} ? ?? ?else ? ?? ?{ ? ?? ???// remain as end device!! ? ?? ?} ? ?? ?osal_set_event( ZDAppTaskID, ZDO_STATE_CHANGE_EVT );? ???//設(shè)置ZDO狀態(tài)改變事件 ? ?? ?// Return unprocessed events ? ?? ?return (events ^ ZDO_ROUTER_START); ? ? } } //The eighth step,執(zhí)行ZD
34、O狀態(tài)改變事件 UINT16 ZDApp_event_loop( uint8 task_id, UINT16 events ) { ....... if ( events & ZDO_STATE_CHANGE_EVT )??//The eighth step, 網(wǎng)絡(luò)改變事件,這個(gè)事件就是在設(shè)備加入網(wǎng)絡(luò)成功后, ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?//并在網(wǎng)絡(luò)中的身份確定后產(chǎn)生的一個(gè)事件 ??{ ? ? ZDO_UpdateNwkStatus( devState );??//更新網(wǎng)
35、絡(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
36、step,轉(zhuǎn)到 ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???//zdoSendStateChangeMsg()函數(shù) ....... ??ZDAppNwkAddr.addr.shortAddr = NLME_GetShortAddr(); //調(diào)用NLME_GetShortAddr()函數(shù),獲得16位短地址。 ??(void)NLME_GetExtAddr();??// Load the saveExtAddr pointer
37、.??//獲得64位的IEEE地址。 } //The tenth step,執(zhí)行zdoSendStateChangeMsg()函數(shù) static void zdoSendStateChangeMsg(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
38、_event_hdr_t *)osal_msg_allocate(sizeof(osal_event_hdr_t)))) ? ? { ? ?? ?// 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)沒有任何改變,再一次,跳到
39、 ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???//ZDO_STATE_CHANGE_EVT事件處理函數(shù)。 ? ? } ? ? else ? ? { ? ?? ?pMsg->event = ZDO_STATE_CHANGE;? ??? //如果ZDO狀態(tài)改變了 了,把ZDO_STATE_CHANGE這個(gè)消息保存到pMsg ? ?? ?pMsg->status = state; ? ?? ?(void)osal_msg_
40、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_CHANGE:? ?? ? //The thirteenth step,
41、接著跳到MT_ZdoStateChangeCB()函數(shù)。 ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?//自此,協(xié)調(diào)器組網(wǎng)形成(終端設(shè)備成功加入網(wǎng)絡(luò)) ? ?? ?? ?MT_ZdoStateChangeCB((osal_event_hdr_t *)msg); ? ?? ?? ?break; ...... } //第五步,//初始化玩系統(tǒng)任務(wù)事件后,正是開始執(zhí)行操作系統(tǒng),此時(shí)操作系統(tǒng)不斷的檢測(cè)有沒有任務(wù)事件發(fā)生,一旦檢測(cè)到有事件發(fā)生,就轉(zhuǎn) //到相應(yīng)的處理函數(shù),進(jìn)行處理。 void osal_start_sys
42、tem( void )??//第五步,正式執(zhí)行操作系統(tǒng) { #if !defined ( ZBIT ) && !defined ( UBIT ) ??for(;;)??// Forever Loop? ???//死循環(huán) #endif ??{ ? ? uint8 idx = 0; ? ? osalTimeUpdate(); ? ? Hal_ProcessPoll();??// This replaces MT_SerialPoll() and osal_check_timer(). ? ? do { ? ?? ?if (tasksEvents)??// Task is hig
43、hest priority that is ready. ? ?? ?{ ? ?? ???break;? ?? ???// 得到待處理的最高優(yōu)先級(jí)任務(wù)索引號(hào)idx ? ?? ?} ? ? } while (++idx < tasksCnt); ? ? if (idx < tasksCnt) ? ? { ? ?? ?uint16 events; ? ?? ?halIntState_t intState; ? ?? ?HAL_ENTER_CRITICAL_SECTION(intState);??//進(jìn)入臨界區(qū) ? ?? ?events = tasksEvents;? ??
44、?? ?? ? //提取需要處理的任務(wù)中的事件 ? ?? ?tasksEvents = 0;??// Clear the Events for this task.? ?// 清除本次任務(wù)的事件 ? ?? ?HAL_EXIT_CRITICAL_SECTION(intState);? ?//退出臨界區(qū) ? ?? ?events = (tasksArr)( idx, events ); //通過指針調(diào)用任務(wù)處理函數(shù)??, 緊接著跳到相應(yīng)的函數(shù)去處理,此為第五步 ? ?? ?HAL_ENTER_CRITICAL_SECTION(intState);??//進(jìn)入臨界區(qū) ? ?? ?t
45、asksEvents |= events;??// Add back unprocessed events to the current task.??// 保存未處理的事件 ? ?? ?HAL_EXIT_CRITICAL_SECTION(intState);? ?//退出臨界區(qū) ? ? } #if defined( POWER_SAVING )? ??? ? ? else // Complete pass through all task events with no activity? ? ? { ? ?? ?osal_pwrmgr_powerconserve();??// P
46、ut the processor/system into sleep ? ? } #endif ??} } 第二個(gè)功能:設(shè)備間的綁定 ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? /*當(dāng)我們按下sw2,即JoyStick控桿的右鍵時(shí),節(jié)點(diǎn)發(fā)出終端設(shè)備綁定請(qǐng)求,因?yàn)槲覀冊(cè)赟erialApp層,注冊(cè)過了鍵盤響應(yīng)事件,所以,當(dāng)我們按??下右鍵時(shí),我們會(huì)在SerialApp_ProcessEvent()函數(shù)里找到對(duì)應(yīng)的鍵盤相
47、應(yīng)事件*/ UINT16 SerialApp_ProcessEvent( uint8 task_id, UINT16 events )??//當(dāng)有事件傳遞到應(yīng)用層的時(shí)候,執(zhí)行此處 { if ( events & SYS_EVENT_MSG )? ?// 有事件傳遞過來,故通過這個(gè)條件語句??{ ...... case KEY_CHANGE:? ?? ?? ?//鍵盤觸發(fā)事件 ? ?? ???SerialApp_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys ); //接著跳到相應(yīng)的按
48、鍵處理函數(shù)去執(zhí)行 ? ?? ???break; ....... ??} } ZDO終端設(shè)備綁定請(qǐng)求:設(shè)備能告訴協(xié)調(diào)器他們想建立綁定表格報(bào)告。該協(xié)調(diào)器將使協(xié)調(diào)并在這兩個(gè)設(shè)備上創(chuàng)建綁定表格條目。在這里是以SerialApp例子為例。 void SerialApp_HandleKeys( uint8 shift, uint8 keys ) { ....... ? ? if ( keys & HAL_KEY_SW_2 )? ?? ? // Joystick right ? ? { ? ???HalLedSet ( HAL_LED_4, HAL_LED_MODE_OFF );?
49、 ?? ?//終端設(shè)備綁定請(qǐng)求 ? ?? ?// Initiate an End Device Bind Request for the mandatory endpoint? ?? ?dstAddr.addrMode = Addr16Bit; ? ?? ?dstAddr.addr.shortAddr = 0x0000;? ???// Coordinator 地址? ?? ?ZDP_EndDeviceBindReq( &dstAddr, NLME_GetShortAddr(),? ?? ?? ?? ?? ? //終端設(shè)備綁定請(qǐng)求? ?? ?? ?? ?? ?? ?? ?? ?? ? Ser
50、ialApp_epDesc.endPoint,? ?? ?? ?? ?? ?? ?? ?? ?? ? SERIALAPP_PROFID, ? ?? ?? ?? ?? ?? ?? ?? ?? ? SERIALAPP_MAX_CLUSTERS, ? ?? ?? ?? ?? ?? ?? ?? ?? ?(cId_t *)SerialApp_ClusterList, ? ?? ?? ?? ?? ?? ?? ?? ?? ? SERIALAPP_MAX_CLUSTERS, ? ?? ?? ?? ?? ?? ?? ?? ?? ?(cId_t *)SerialApp_ClusterList, ?
51、?? ?? ?? ?? ?? ?? ?? ?? ? FALSE ); ? ? } ...... ? ? if ( keys & HAL_KEY_SW_4 ) ? ? { ? ?? ?HalLedSet ( HAL_LED_4, HAL_LED_MODE_OFF );? ?? ?// Initiate a Match Description Request (Service Discovery)? ?? ?dstAddr.addrMode = AddrBroadcast; //廣播地址 ? ?? ?dstAddr.addr.shortAddr = NWK_BROADCAST_SHOR
52、TADDR;? ?? ?ZDP_MatchDescReq( &dstAddr, NWK_BROADCAST_SHORTADDR,? ?? ?? ?? ?? ?? ?? ? //描述符匹配請(qǐng)求 這也是兩不同匹配方式,使用的按鍵不同? ?? ?? ?? ?? ?? ?? ?? ?SERIALAPP_PROFID, ? ?? ?? ?? ?? ?? ?? ?? ?SERIALAPP_MAX_CLUSTERS, ? ?? ?? ?? ?? ?? ?? ???(cId_t *)SerialApp_ClusterList, ? ?? ?? ?? ?? ?? ?? ?? ?SERIALAPP_M
53、AX_CLUSTERS, ? ?? ?? ?? ?? ?? ?? ???(cId_t *)SerialApp_ClusterList, ? ?? ?? ?? ?? ?? ?? ?? ?FALSE ); ? ? } ??} } ? ? 說明:從上面可以看到,SW2是發(fā)送終端設(shè)備綁定請(qǐng)求方式,SW4是發(fā)送描述符匹配請(qǐng)求方式。如果按下SW2的話,使用終端設(shè)備綁定請(qǐng)求方式,這里是要通過終端告訴協(xié)調(diào)器他們想要建立綁定表格,協(xié)調(diào)器將協(xié)調(diào)這兩個(gè)請(qǐng)求的設(shè)備,在兩個(gè)設(shè)備上建立綁定表格條目。 (1)終端設(shè)備向協(xié)調(diào)器發(fā)送終端設(shè)備綁定請(qǐng)求 ??調(diào)用ZDP_EndDeviceBindReq()函數(shù)
54、發(fā)送綁定請(qǐng)求。 ? ?ZDP_EndDeviceBindReq( &dstAddr,? ? //目的地址設(shè)為0x0000;? ?? ?? ?? ?? ?? ?? ?? ?NLME_GetShortAddr(), ? ?? ?? ?? ?? ?? ?? ?? ?SerialApp_epDesc.endPoint, //EP號(hào) ? ?? ?? ?? ?? ?? ?? ?? ?SERIALAPP_PROFID,//Profile ID? ?? ?? ?? ?? ?? ?? ?SERIALAPP_MAX_CLUSTERS,??//輸入簇的數(shù)目 ? ?? ?? ?? ?? ? (cId_t *)
55、SerialApp_ClusterList, //輸入簇列表? ?? ?? ?? ?? ?? ???SERIALAPP_MAX_CLUSTERS, //輸出簇?cái)?shù)目 ? ?? ?? ?? ?? ???(cId_t *)SerialApp_ClusterList,//輸出簇列表? ?? ?? ?? ?? ?? ?? ?? ?? ? FALSE ); 該函數(shù)實(shí)際調(diào)用無線發(fā)送函數(shù)將綁定請(qǐng)求發(fā)送給協(xié)調(diào)器節(jié)點(diǎn):默認(rèn)clusterID為End_Device_Bind_req,最后通過AF_DataRequest()發(fā)送出去. fillAndSend( &ZDP_TransID, dstAddr, En
56、d_Device_Bind_req, len );最后通過AF_DataRequest()發(fā)送出去,這里的&afAddr,是目的地址; &ZDApp_epDesc ,是端口號(hào); clusterID,是簇號(hào); len+1,是數(shù)據(jù)的長(zhǎng)度; //ZDP_TmpBuf-1,是數(shù)據(jù)的內(nèi)容; transSeq,是數(shù)據(jù)的順序號(hào); ZDP_TxOptions,是發(fā)射的一個(gè)選項(xiàng) ; AF_DEFAULT_RADIUS,是一個(gè)默認(rèn)的半徑(跳數(shù))。 AF_DataRequest( &afAddr, &ZDApp_epDesc, clusterID, ? ?? ?? ?? ?? ?(uint16)(len+1)
57、, (uint8*)(ZDP_TmpBuf-1),? ?? ?? ?? ?transSeq, ZDP_TxOptions,??AF_DEFAULT_RADIUS );(2) 協(xié)調(diào)器收到終端設(shè)備綁定請(qǐng)求End_Device_Bind_req 這個(gè)信息會(huì)傳送到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_EVEN
58、T_MSG )??{ ? ? while ( (msg_ptr = osal_msg_receive( ZDAppTaskID )) )? ? { ? ?? ?ZDApp_ProcessOSALMsg( (osal_event_hdr_t *)msg_ptr );? ?? ?// Release the memory? ?? ?osal_msg_deallocate( msg_ptr );? ? } ? ? // Return unprocessed eventsreturn (events ^ SYS_EVENT_MSG); ..................... ??} v
59、oid ZDApp_ProcessOSALMsg( osal_event_hdr_t *msgPtr ){ ??// Data Confirmation message fields??byte sentEP;? ?? ? // This should always be 0??byte sentStatus;??afDataConfirm_t *afDataConfirm;??switch ( msgPtr->event )??{ ? ? // Incoming ZDO Message ? ? case AF_INCOMING_MSG_CMD:? ??? ZDP_IncomingDat
60、a( (afIncomingMSGPacket_t *)msgPtr );? ?? ?break; ................................ } ? ?在ZDP_IncomingData( (afIncomingMSGPacket_t *)msgPtr );函數(shù)中void ZDP_IncomingData( afIncomingMSGPacket_t *pData ){ ??uint8 x = 0; ??uint8 handled;??zdoIncomingMsg_t inMsg; //解析clusterID這個(gè)消息??inMsg.srcAddr.add
61、rMode = Addr16Bit;??inMsg.srcAddr.addr.shortAddr = pData->srcAddr.addr.shortAddr;??inMsg.wasBroadcast = pData->wasBroadcast;??inMsg.clusterID = pData->clusterId;? ?? ?? ?? ?? ?? ?? ???//這個(gè)clusterID,在這里指的是,終端設(shè)備發(fā)送過來的End_Device_Bind_req這個(gè)消息??inMsg.SecurityUse = pData->SecurityUse; ??inMsg.asduLen = p
62、Data->cmd.DataLength-1;??inMsg.asdu = pData->cmd.Data+1;??inMsg.TransSeq = pData->cmd.Data;??handled = ZDO_SendMsgCBs( &inMsg ); #if defined( MT_ZDO_FUNC ) ??MT_ZdoRsp( &inMsg );#endif ??while ( zdpMsgProcs.clusterID != 0xFFFF )??{ ? ? if ( zdpMsgProcs.clusterID == inMsg.clusterID )? ?//在zdpM
63、sgProcs[]中,查找,看看有沒有跟End_Device_Bind_req相匹配的描述符。? ? { ? ?? ?zdpMsgProcs.pFn( &inMsg );? ?? ?return; ? ? } ? ? x++; ??} ??// Handle unhandled messages??if ( !handled )? ? ZDApp_InMsgCB( &inMsg );} ? ? 因?yàn)閆DO信息處理表zdpMsgProcs[ ]沒有對(duì)應(yīng)的End_Device_Bind_req簇,因此沒有調(diào)用ZDO信息處理表中的處理函數(shù),但是前面的ZDO_SendMsgCBs()會(huì)
64、把這個(gè)終端設(shè)備綁定請(qǐng)求發(fā)送到登記過這個(gè)ZDO信息的任務(wù)中去。那這個(gè)登記注冊(cè)的程序在哪里呢? ? ?對(duì)于協(xié)調(diào)器來說,由于在void ZDApp_Init( byte task_id )函數(shù)中調(diào)用了ZDApp_RegisterCBs();面的函數(shù)。進(jìn)行注冊(cè)了終端綁定請(qǐng)求信息。void ZDApp_RegisterCBs( void ) { #if defined ( ZDO_IEEEADDR_REQUEST ) || defined ( REFLECTOR )??ZDO_RegisterForZDOMsg( ZDAppTaskID, IEEE_addr_rsp );#endif #if d
65、efined ( ZDO_NWKADDR_REQUEST ) || defined ( REFLECTOR )??ZDO_RegisterForZDOMsg( ZDAppTaskID, NWK_addr_rsp );#endif #if defined ( ZDO_COORDINATOR ) ??ZDO_RegisterForZDOMsg( ZDAppTaskID, Bind_rsp );??ZDO_RegisterForZDOMsg( ZDAppTaskID, Unbind_rsp );??ZDO_RegisterForZDOMsg( ZDAppTaskID, End_Device_B
66、ind_req );#endif #if defined ( REFLECTOR ) ??ZDO_RegisterForZDOMsg( ZDAppTaskID, Bind_req );??ZDO_RegisterForZDOMsg( ZDAppTaskID, Unbind_req );#endif } ? ? 因此,協(xié)調(diào)器節(jié)點(diǎn)的 ZDApp 接收到外界輸入的數(shù)據(jù)后,由于注冊(cè)了 ZDO 反饋消息,即ZDO_CB_MSG,ZDApp 層任務(wù)事件處理函數(shù)將進(jìn)行處理:也就是調(diào)用下面的程序。 UINT16 ZDApp_event_loop( byte task_id, UINT16 events ){ ??uint8 *msg_ptr;??if ( events & SYS_EVENT_MSG )??{ ? ? while ( (msg_ptr = osal_msg_receive( ZDAppTaskID )) )? ? { ? ?? ?ZDApp_ProcessOSALMsg( (osal_event_hdr_t *)msg_ptr );? ?? ?// Release t
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 市教育局冬季運(yùn)動(dòng)會(huì)安全工作預(yù)案
- 2024年秋季《思想道德與法治》大作業(yè)及答案3套試卷
- 2024年教師年度考核表個(gè)人工作總結(jié)(可編輯)
- 2024年xx村兩委涉案資金退還保證書
- 2024年憲法宣傳周活動(dòng)總結(jié)+在機(jī)關(guān)“弘揚(yáng)憲法精神推動(dòng)發(fā)改工作高質(zhì)量發(fā)展”專題宣講報(bào)告會(huì)上的講話
- 2024年XX村合作社年報(bào)總結(jié)
- 2024-2025年秋季第一學(xué)期初中歷史上冊(cè)教研組工作總結(jié)
- 2024年小學(xué)高級(jí)教師年終工作總結(jié)匯報(bào)
- 2024-2025年秋季第一學(xué)期初中物理上冊(cè)教研組工作總結(jié)
- 2024年xx鎮(zhèn)交通年度總結(jié)
- 2024-2025年秋季第一學(xué)期小學(xué)語文教師工作總結(jié)
- 2024年XX村陳規(guī)陋習(xí)整治報(bào)告
- 2025年學(xué)校元旦迎新盛典活動(dòng)策劃方案
- 2024年學(xué)校周邊安全隱患自查報(bào)告
- 2024年XX鎮(zhèn)農(nóng)村規(guī)劃管控述職報(bào)告