Zigbee協議棧是怎樣分別執行協調器、路由器、終端的任務的?


  這個問題雖然簡單,卻困擾了差不多一個星期,歸根結底還是自己對協議棧的不熟悉。

  廢話不多說!

  假如組網后,協調器需要執行的任務是:組播,終端要執行的任務是:單播。那協議棧是怎么做到協調器只執行組播的任務,而不知執行單播的任務,終端又是怎樣只執行單播的任務而不執行組播的任務呢?

  下面是官方給出的代碼

APP文件夾下  ->  SampleApp.c    ->   SampleApp_ProcessEvent();

 1         // Received whenever the device changes state in the network
 2         case ZDO_STATE_CHANGE://網絡狀態發生改變  3           SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);//把含有某部分網絡發生改變的數值賦值給變量  4           if ( (SampleApp_NwkState == DEV_ZB_COORD) //這里就是困擾了我很久的問題所在,不明白為什么要用“或”  5               || (SampleApp_NwkState == DEV_ROUTER) //用“或”的話不是無法區分協調器、路由器、終端各自的  6               || (SampleApp_NwkState == DEV_END_DEVICE) )//任務了嗎?還用了else,就更難理解了(就我而言)。  7  {  8             // Start sending the periodic message in a regular interval.
 9  osal_start_timerEx( SampleApp_TaskID, 10  SAMPLEAPP_SEND_PERIODIC_MSG_EVT, 11  SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT ); 12  } 13           else
14  { 15             // Device is no longer in the network
16  } 17           break;

  自作主張修改的代碼

 1         // Received whenever the device changes state in the network
 2         case ZDO_STATE_CHANGE:  3           SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);  4           
 5           //如果發生改變的是終端,則執行終端任務
 6           if (SampleApp_NwkState == DEV_END_DEVICE)  7  {  8             // Start sending the periodic message in a regular interval.//執行終端任務
 9  osal_start_timerEx( SampleApp_TaskID, 10  SAMPLEAPP_SEND_PERIODIC_MSG_EVT, //定時一段時間后發出消息 11  SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT ); 12  } 13           //如果發生改變的是路由器,則執行路由器任務
14           else if(SampleApp_NwkState == DEV_ROUTER) 15  { 16             //執行路由器任務
17  } 18           //如果發生改變的是協調器,則執行協調器任務
19           else if(SampleApp_NwkState == DEV_ZB_COORD) 20  { 21             //執行協調器任務
22  } 23           else
24  { 25             //error
26           }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM