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