zigbee协议栈初使用(三)无线数据传输

zigbee协议栈初使用(三)无线数据传输
本次使用协议栈例程广播通信完成,本文记录网蜂《Zigbee实战演练》学习总结

一、发送部分

  打开SampleApp.c找到
uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )
此函数用于处理事件,发送部分注释后主要代码如下:

// Received whenever the device changes state in the network
        case ZDO_STATE_CHANGE://当网络发生改变时,如组网成功
          SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);
          if (  (SampleApp_NwkState == DEV_ZB_COORD) ||//协调器
                 (SampleApp_NwkState == DEV_ROUTER)//路由器
              || (SampleApp_NwkState == DEV_END_DEVICE) )//终端
          {
           //相当于初始化 // Start sending the periodic message in a regular interval.
            osal_start_timerEx( SampleApp_TaskID,                 //任务ID
                              SAMPLEAPP_SEND_PERIODIC_MSG_EVT,   //事件号
                              SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );//事件重复时间头文件中修改
          }
          else
          {
            // Device is no longer in the network
          }
          break;

SAMPLEAPP_SEND_PERIODIC_MSG_EVT在头函数定义为(0x0001)一个任务(task_ID)下可以有多个事件,此处用来区分事件。本端函数配置和登记了事件。本端代码可以看作配置发送。

  在同一函数下查找,发现如下代码:

 //发消息,由定时器完成
  // Send a message out - This event is generated by a timer
  //  (setup in SampleApp_Init()).
  if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT )
  {
    // Send the periodic message  发送周期消息
    SampleApp_SendPeriodicMessage();

    // Setup to send message again in normal period (+ a little jitter)
    osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
        (SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + (osal_rand() & 0x00FF)) );

    // return unprocessed events
    return (events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT);
  }

可以发现上文所说事件标志SAMPLEAPP_SEND_PERIODIC_MSG_EVT,当有此事件时进入,其中主要是 SampleApp_SendPeriodicMessage();此函数是发送数据的主要函数,如下:

void SampleApp_SendPeriodicMessage( void ) //发送消息内容
{
  uint8 data[10]="0123456789";
  if ( AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc,
                       SAMPLEAPP_PERIODIC_CLUSTERID, //和接收方建立联系 1表示广播
                       10,
                       data,
                       &SampleApp_TransID,
                       AF_DISCV_ROUTE,
                       AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
  {
  }
  else
  {
    // Error occurred in request to send.
  }
}

此处注意SAMPLEAPP_PERIODIC_CLUSTERID,后面有说明。
由此终端设备周期广播发送数据0~9;

二、接收部分

 接收有两个任务:1、读取接收到的数据 2、串口发送数据到PC
 同样在uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )中,找到代码如下:


        // Received when a messages is received (OTA) for this endpoint
        case AF_INCOMING_MSG_CMD:
          SampleApp_MessageMSGCB( MSGpkt ); //将接收到的数据包进行处理函数
          break;

SampleApp_MessageMSGCB( MSGpkt );是接收处理函数,代码如下:

void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt ) //接收数据
{
  uint16 flashTime;

  switch ( pkt->clusterId )
  {
    case SAMPLEAPP_PERIODIC_CLUSTERID: //数据包ID
      HalUARTWrite(0, "I got Message!", sizeof("I got Message!"));        //提示信息
      HalUARTWrite(0, pkt->cmd.Data, pkt->cmd.DataLength); //输出接收到的数据
      HalUARTWrite(0, "\n", 1);         //回车换行
      break;

    case SAMPLEAPP_FLASH_CLUSTERID:     //此实验没有使用,到后面实验详解
      flashTime = BUILD_UINT16(pkt->cmd.Data[1], pkt->cmd.Data[2] );
      HalLedBlink( HAL_LED_4, 4, 50, (flashTime / 4) );
      break;
  }
}

SAMPLEAPP_PERIODIC_CLUSTERID数据包ID,在发送函数中有对应。
现在出现三个ID主要区分:任务号(task_ID)、发送事件号(SAMPLEAPP_SEND_PERIODIC_MSG_EVT)、数据包号(SAMPLEAPP_PERIODIC_CLUSTERID)。关系应该是包含,一个任务可以多个发送事件,一个发送事件可以有多个数据包。

终端和协调器分别编译下载后现象如下
这里写图片描述

文内有较多引用及自己理解,有误会及时更正。

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值