欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Zigbee协议栈组播通信

程序员文章站 2022-07-13 17:21:31
...
  1. 在Zigbee网络中组播通信,模块可以分组来标记,发送模块的组号和接受模块的组号相对应,那么这些模块就可以拿到无线数据包。
  2. 分组中组编号是2个字节,如0x0001、0x0002。
  3. 发送的模块按照组的方式发送,需要目标模块的组编号,端点,簇。
  4. 一个组可以关联多个端点,同一个端点也可以关联多个组。

终端节点(发送):

ZZApp.c中

  if ( events & ZZApp_MY_EVT )
  {
    if(P0_1 == 0)
    {
       char theMessageData[] = "HELLO WORLD!";
       ZZApp_DstAddr.addrMode = (afAddrMode_t)AddrGroup;//组播形式
       ZZApp_DstAddr.addr.shortAddr = 0x0001;//接受端的组
       // Take the first endpoint, Can be changed to search through endpoints
       ZZApp_DstAddr.endPoint = 10;//接受端的端口
             
       AF_DataRequest( &ZZApp_DstAddr, &ZZApp_epDesc,
                       0x0001,//接受端的簇
                       (byte)osal_strlen( theMessageData ) + 1,
                       (byte *)&theMessageData,
                       &ZZApp_TransID,
                       AF_DISCV_ROUTE, AF_DEFAULT_RADIUS );
       P1_0 = ~P1_0;
    }
    if(P2_0 == 0)
    {
      char theMessageData[] = "hello world!";
       ZZApp_DstAddr.addrMode = (afAddrMode_t)AddrGroup;//组播形式
       ZZApp_DstAddr.addr.shortAddr = 0x0002;//接受端的组
       // Take the first endpoint, Can be changed to search through endpoints
       ZZApp_DstAddr.endPoint = 10;//接受端的端口
             
       AF_DataRequest( &ZZApp_DstAddr, &ZZApp_epDesc,
                       0x0001,//接受端的簇
                       (byte)osal_strlen( theMessageData ) + 1,
                       (byte *)&theMessageData,
                       &ZZApp_TransID,
                       AF_DISCV_ROUTE, AF_DEFAULT_RADIUS );
       P1_1 = ~P1_1;
    }
    return (events ^ ZZApp_MY_EVT);
  }

协调器(接受):

ZZApp.c定义#include "aps_groups.h"头文件
定义两个组

aps_Group_t ZZApp_Group1;
aps_Group_t ZZApp_Group2;

编写事件

  if ( events & ZZApp_MY_EVT )
  {
    if(P0_1 == 0)
    {
      LCD_P8x16Str(4, 4, "groupId 0x0001");
      aps_RemoveGroup(10,0x0002);//取消关联 10端口和组0x0002
      
      ZZApp_Group1.ID = 0x0001; //定义组0x0001
      aps_AddGroup(10, &ZZApp_Group1 ); //关联 10端口和组0x0001
    }
    if(P2_0 == 0)
    {
      LCD_P8x16Str(4, 4, "groupId 0x0002");
      aps_RemoveGroup(10,0x0001);//取消关联 10端口和组0x0001
      
      ZZApp_Group2.ID = 0x0002;//定义组0x0002
      aps_AddGroup(10, &ZZApp_Group2 );//关联 10端口和组0x0002
    }
    return (events ^ ZZApp_MY_EVT);
  }

接受数据

void ZZApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
  if(pkt->groupId==0x0001)//组
  {
    if(pkt->endPoint==10)//端点
    {
      switch(pkt->clusterId)//簇
      {
        case 0x0001:LCD_P8x16Str(8, 2, pkt->cmd.Data);
                    //D1  P1_0
                    P1SEL &= ~0x01;
                    P1DIR |= 0x01;
                    P1_0 = ~P1_0;
                    break;
      }
    }
  }
  if(pkt->groupId==0x0002)//组
  {
    if(pkt->endPoint==10)//端点
    {
      switch(pkt->clusterId)//簇
      {
        case 0x0001:LCD_P8x16Str(8, 2, pkt->cmd.Data);
                    //D2 P1_1
                    P1SEL &= ~0x02;
                    P1DIR |= 0x02;
                    P1_1 = ~P1_1;
                    break;
      }
    }
  }
}

相关函数:

#include "aps_groups.h"//头文件

aps_Group_t SampleApp_Group; //定义组

extern ZStatus_t aps_AddGroup( uint8 endpoint, aps_Group_t *group ); //关联端点和组
extern uint8 aps_RemoveGroup( uint8 endpoint, uint16 groupID );//取消关联的端点和组
extern void aps_RemoveAllGroup( uint8 endpoint );//取消所有关联的端点和组