《ZigBee学习》点播

任务描述

终端和路由往协调器发送数据,协调器的短地址为0x0000,端点为20。

终端和路由操作过程

1、用户任务事件初始化

串口初始化

MT_UartInit();
MT_UartRegisterTaskID(task_id);

点播:端点参数配置

SampleApp_P2P_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;//传输模式:点播传输
  SampleApp_P2P_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;//端点
  SampleApp_P2P_DstAddr.addr.shortAddr = 0x0000;    //协调器地址,发送给协调器

其他描述符不变,向AF层登记描述符,登记所有按键事件,把组添加到APS层中,初始化完成。

2、首先启动周期定时器任务,周期执行SampleApp_P2P_Message(); //点播发送函数
由于协调器只是接受,故不需要周期性任务事件。

	SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);
          //if ( (SampleApp_NwkState == DEV_ZB_COORD)//实验中协调器只接收数据所以取消发送事件
          if ( (SampleApp_NwkState == DEV_ROUTER) || (SampleApp_NwkState == DEV_END_DEVICE) )
          {
            // Start sending the periodic message in a regular interval.
            osal_start_timerEx(SampleApp_TaskID,
                               SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
                               SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT);
            
          }

周期性任务事件处理,点播发送函数。

if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT )
  {
   // SampleApp_SendPeriodicMessage();
   //SampleApp_SendFlashMessage(0); 
   SampleApp_P2P_Message();  //点播
    
   // 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);
  }

void SampleApp_P2P_Message(void)
{
#if 1
  byte dat[8]=" Router";
#else
  byte dat[8]="edPoint";
#endif
  HalLedSet(HAL_LED_1,HAL_LED_MODE_OFF);
  HalLedSet(HAL_LED_1,HAL_LED_MODE_BLINK);
  
  if(AF_DataRequest(&SampleApp_P2P_DstAddr,   //发送目的地址+端点地址(端点号)+传送模式:目的端
                    &SampleApp_epDesc,        //终端描述,源EP                          :源端
                    SAMPLEAPP_P2P_CLUSTERID,  //被Profile指定的有效集群号
                    7,                       //发送的数据长度
                    dat,                      //发送的数据缓冲区
                    &SampleApp_TransID,       //任务ID
                    AF_DISCV_ROUTE,           //有效位掩码的发送选项
                    AF_DEFAULT_RADIUS)==afStatus_SUCCESS)//传送跳数,通常设置AF_DEFAULT_RADIUS
  {
  }
  else
  {
    //Error occurred in request to send
  }
}

这样就完成了终端和路由周期性向协调器节点发送数据。

协调器接收数据过程

1、系统消息事件SYS_EVENT_MSG的接收数据事件AF_INCOMING_MSG_CMD,执行SampleApp_MessageMSGCB()函数。

2、该函数的点对点集群ID是SAMPLEAPP_P2P_CLUSTERID,执行接收代码,并上传到PC串口助手上。
:由于此段代码未加限制,如果终端和路由接收到发送到该集群ID的消息,那么终端和路由也会上传数据到PC串口助手上。

case SAMPLEAPP_P2P_CLUSTERID: //收到点对点数据
      osal_memset(buf, 0 , 32);
      osal_memcpy(buf, pkt->cmd.Data, 7);
      HalUARTWrite(0,buf,7);
      HalLedSet(HAL_LED_1,HAL_LED_MODE_OFF);
      HalLedSet(HAL_LED_1,HAL_LED_MODE_BLINK);
      pbuf[0] = '\r';
      pbuf[1] = '\n';
      HalUARTWrite(0,pbuf,2);
      HalLedSet(HAL_LED_1,HAL_LED_MODE_OFF);
      HalLedSet(HAL_LED_1,HAL_LED_MODE_BLINK);
      
      break;

总结

实验结果可知,该点播实验只有协调器接收到数据并上传了数据,其他终端、路由并未有接收到数据。由此可知,点播发送数据时,只与目的地址和点播传输方式有关,且使用的是短地址。同一网络下其他短地址接收不到发送节点发送的消息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值