立即注册 登录
返回首页

uid:481420的个人空间

日志

ZigBee_CC2530_Zstack3.0.2 收发数据

已有 2584 次阅读2019-10-8 11:15 |个人分类:CC2530+Zstack

方法一:很多初学者从Zstack 2.5.1开始学习,转到在stack 3.0.2后,会很不适应。方法一就是在zstack 3.0.2中用在stack 2.5.1a协议栈的方式实现无线接收。

在zstack 3.0.2中无线数据接收处理在如下函数中:
uint16 zcl_event_loop( uint8 task_id, uint16 events )
{
      ……
      if ( *msgPtr == AF_INCOMING_MSG_CMD )
      {
        zcl_ProcessMessageMSG( (afIncomingMSGPacket_t *)msgPtr );   //此处就是对空中数据的处理
      }
     ……
}
做变形如下:
uint16 zcl_event_loop( uint8 task_id, uint16 events )
{
      ……
  if ( *msgPtr == AF_INCOMING_MSG_CMD )
      {

        if((((afIncomingMSGPacket_t *)msgPtr)->clusterId >=MYAPP_SENDADDR_CLUSTERID)&&
           (((afIncomingMSGPacket_t *)msgPtr)->clusterId <=(MYAPP_SENDADDR_CLUSTERID+100)))
        {
          Zcl_SendAF_To_GenericApp((afIncomingMSGPacket_t *)msgPtr); //此处是用来处理用户自定义的CLUSTER  ID 
        }
        else
        {
          zcl_ProcessMessageMSG( (afIncomingMSGPacket_t *)msgPtr ); //此处用来处理zstack 3.0中系统簇ID
        }
      }
     ……
}
其中MYAPP_SENDADDR_CLUSTERID就是自己定义的第一个簇ID,MYAPP_SENDADDR_CLUSTERID+100表示用户最多可以定义100个簇ID。
自己的簇ID定义如下图所示:

接下来讲解自定义的Zcl_SendAF_To_GenericApp(); 函数,此函数的目的是将无线数据从zcl层发送到zclGenericApp_TaskID层。
static void Zcl_SendAF_To_GenericApp(afIncomingMSGPacket_t  *pkt)
{

  zcl_SendAF_To_Generic *pMsg1;
  
  pMsg1 = (zcl_SendAF_To_Generic *)osal_msg_allocate( sizeof( zcl_SendAF_To_Generic ));
      
  pMsg1->hdr.event = MYAPP_ZCLTOGENERIC;
  pMsg1->msg = pkt; // 把数据定位到结构体数据部分
  
  //HalUARTWrite(0,"22222",5);HalUARTWrite(0,pMsg1->msg->cmd.Data,pMsg1->msg->cmd.DataLength);HalUARTWrite(0,"22222",5);
  //HalUARTWrite(0,"Zcl_SendAF_To_GenericApp\r\n",strlen("Zcl_SendAF_To_GenericApp\r\n"));
  
  osal_msg_send( zclGenericApp_TaskID, (byte *)pMsg1 ); //登记任务,发往上层
  osal_msg_deallocate ( (byte *)pMsg1 ); //释放内存
}
其中:zcl_SendAF_To_Generic为自定义的结构体类型,在zcl.h中;MYAPP_ZCLTOGENERIC为自定义的zclGenericApp_TaskID层的系统事件,在ZComDef.h中。
如下图所示:

在zclGenericApp_event_loop函数中添加系统事件的处理函数
uint16 zclGenericApp_event_loop( uint8 task_id, uint16 events )
{
  ……
  if ( events & SYS_EVENT_MSG )
  {
    while ( (MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( zclGenericApp_TaskID )) )
    {
      switch ( MSGpkt->hdr.event )
      {
         ……
        case KEY_CHANGE:
         ……
          break;
        case ZDO_STATE_CHANGE:
          ……
          break;
        case MYAPP_ZCLTOGENERIC:
          MyApp_MessageMSGCB( (zcl_SendAF_To_Generic*)MSGpkt ); //这个函数就是对自定义簇ID的处理函数
          break;
        default:
          break;
      }

      // Release the memory
      osal_msg_deallocate( (uint8 *)MSGpkt );
      
    }
    // return unprocessed events
    return (events ^ SYS_EVENT_MSG);
  }
……
}
继续:
void MyApp_MessageMSGCB( zcl_SendAF_To_Generic *pkt )
{
  uint8 *databuf;    //用来接收AF数据的数组   
  
  databuf = osal_msg_allocate( sizeof( zcl_SendAF_To_Generic ));
  
  osal_memcpy(databuf,pkt->msg->cmd.Data,pkt->msg->cmd.DataLength); //将接受大的数据,copy到databuf中;
  switch ( pkt->msg->clusterId)
  {
   case MYAPP_SENDADDR_CLUSTERID:   //自定义簇ID
        HalUARTWrite(0,"MyApp_MessageMSGCB\r\n",strlen("MyApp_MessageMSGCB\r\n")); //此处添加簇ID对应的处理函数即可
    break;
    
  default:
    break;
  }
  osal_msg_deallocate ( (byte *)databuf ); //释放内存
}

上面是接收,顺便提一下发送:直接使用函数发送即可,但是有些参数需要自己填加。
比如:
static afAddrType_t MyApp_DstAddr;  
endPointDesc_t *MyApp_epDesc;
byte MyApp_TransID;

void zclGenericApp_Init( byte task_id )
{
    ……
    MyApp_epDesc = afFindEndPointDesc( GENERICAPP_ENDPOINT );
}
然后发送时按照就协议栈进行发送即可。
AF_DataRequest(&MyApp_DstAddr,           //目的地址,发送之前需要自己赋值
                    MyApp_epDesc,                        //设备描述符
                    MYAPP_SENDADDR_CLUSTERID, //簇ID
                    14,                       //长度
                    buf,                      //要发送的数组
                    &MyApp_TransID,           //传输序列号
                    AF_TX_OPTIONS_NONE,       //发送选项
                    AF_DEFAULT_RADIUS)==afStatus_SUCCESS)
  {
    //成功;
  }
  else
  {
    //如果不成功,就再发送一次
  }

方法二:直接在zstack3.0.2 的基础上进行无线数据的收发
待更新……


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

返回顶部