zstack学习笔记3--点对点通信2

来源:互联网 发布:广西网络创业培训补贴 编辑:程序博客网 时间:2024/06/06 00:26

1 实验说明

      在上篇文章中介绍的例程的功能很简单,当终端节点加入协调器创建的网络时,其网络状态将发生改变。当终端节点的网络状态改变时,终端节点发送一个数据(AF无线的方式)给协调器节点。协调器节点收到数据后,进行解析,如收到的数据为“LED”则将其板载的LED2置为闪烁状态。

      接下来,我想对前面的这个程序进行修改,将其功能修改为:终端节点发送“LED”数据的时间点由原来的终端节点的网络状态改变时发送变为由按键控制。比如当1号按键按下时,终端节点执行GenericApp_SendTheMessage()函数,发送“LED”数据包(以AF无线的方式)协调器的功能不变,协调器节点收到数据后,进行解析,如收到的数据为“LED”则将其板载的LED2置为闪烁状态。

2 终端节点代码的修改

uint16 GenericApp_ProcessEvent( uint8 task_id, uint16 events ){  afIncomingMSGPacket_t *MSGpkt;  if ( events & SYS_EVENT_MSG )  {    MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( GenericApp_TaskID );    while ( MSGpkt )    {      switch ( MSGpkt->hdr.event )      {        case ZDO_STATE_CHANGE:          GenericApp_NwkState = (devStates_t)(MSGpkt->hdr.status);          if (GenericApp_NwkState == DEV_END_DEVICE)          {            //GenericApp_SendTheMessage();          }          break;                  case KEY_CHANGE:          HalLedBlink(HAL_LED_3,0,50,1000);          GenericApp_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys );          break;        default:          break;      }      // Release the memory      osal_msg_deallocate( (uint8 *)MSGpkt );      // Next      MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( GenericApp_TaskID );    }    // return unprocessed events    return (events ^ SYS_EVENT_MSG);  }
      事件处理函数中在网络状态发生变化时会进入case ZDO_STATE_CHANGE:,但此时我们注释掉调用发送数据包的函数。而在有按键按下时会进入case KEY_CHANGE:,此时调用按键处理函数GenericApp_HandleKeys()。按键处理函数的代码为:

static void GenericApp_HandleKeys( uint8 shift, uint8 keys ){  // Shift is used to make each button/switch dual purpose.  if ( shift )  {  }  else  {    if ( keys & HAL_KEY_SW_1 )    {      HalLedSet ( HAL_LED_1, HAL_LED_MODE_FLASH);      GenericApp_SendTheMessage();    }  }}

By:霜月孤鸟

2013.1.2

0 0
原创粉丝点击