Zigbee协议栈组播通信

旧巷老猫 提交于 2020-02-03 17:58:01
  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 );//取消所有关联的端点和组
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!