Zigbee学习日记(十一)组播通信
goJhou 发布于2018-01 浏览:4120 回复:1
0
收藏

组播通信,就是在一个网络中,N个模块可以打成一个小组,发送模块如果发送的组号与网络里模块标记的组号一致,那么这些模块就能拿到数据包。

组的编号由2个字节组成。 例如0x0001

组号需要和端点关联。如果一个模块定义了组0x0001,则必须要有一个端点1来与之绑定。

一个组可以关联多个端点

一个端点也可关联多个组

日常情景:
发送端:我要发给0x0001组的9号端点的0x0003簇,数据是xxxx,走起
接收端A:我有这组吗?喔有,这组里有这端点吗?喔有,这端点里有这簇吗?喔有,那是我要的,应用层事件处理一下吧
接收端B: 我有这组吗?没有,没我事。

到目前为止
GenericApp_DstAddr 无论是单播、广播、组播都是用来描述接收模块的一些信息的

基本上不同的通信方式只需要小改一下这个结构体里的参数即可

 

if(0==P1_1)
    {//按钮3
      char theMessageData[] = {3};
      GenericApp_DstAddr.addrMode = (afAddrMode_t)AddrGroup;//注意这里,发送模式是组播
      GenericApp_DstAddr.addr.shortAddr = 0x0001;//注意这里,表示目标接收模块的组编号
      GenericApp_DstAddr.endPoint = 10;//这里表示目标端点
      
      AF_DataRequest(&GenericApp_DstAddr,
                     &GenericApp_epDesc,
                     GENERICAPP_CLUSTERID,//默认目标簇
                     1,//(byte)osal_strlen( theMessageData ) + 1,
                     (byte *)&theMessageData,
                     &GenericApp_TransID,
                     AF_DISCV_ROUTE, AF_DEFAULT_RADIUS );
    }

 

在接收端那边
我们需要引入

#include “aps_groups.h”

这个头文件包含了一些关于组的定义

aps_Group_t 这个结构体只有2个参数,一个是ID,一个是名字。名字可不填。

在全局申明2个变量

aps_Group_t SampleApp_Group1;//创建个组结构体
aps_Group_t SampleApp_Group2;//创建个组结构体

然后在事件处理中,将几个按钮赋予一些逻辑

if(events & JhouXerox_MY_EVT)
  {
    
    if(0 == P1_1)
    {//按钮3 进入组1模式
      LS164_BYTE(1);
      
      aps_RemoveGroup(10,0x0002);//先清除其他的组
      
      SampleApp_Group1.ID=0x0001;//给组上个ID
      aps_AddGroup(10,&SampleApp_Group1);//添加组
    }
    
    if(0 == P2_0)
    {//按钮4 进入组2模式
      LS164_BYTE(2);
      
      aps_RemoveGroup(10,0x0001);//先清除其他的组
      SampleApp_Group2.ID=0x0002;//给组上个ID
      aps_AddGroup(10,&SampleApp_Group2);//添加组
    }
    
    if(0 == P0_5)
    {//按钮5  进入组1&组2模式
      LS164_BYTE(3);
      
      aps_RemoveAllGroup(10);//移除10号端点下的所有组
      
      
      SampleApp_Group1.ID=0x0001;//给组上个ID
      aps_AddGroup(10,&SampleApp_Group1);//添加组
      
      SampleApp_Group2.ID=0x0002;//给组上个ID
      aps_AddGroup(10,&SampleApp_Group2);//添加组
    }
  }

 

然后在消息接收处理中处理一下组的信息筛选,基本上组播的要点就clear了

 

void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
  if(0x0001 == pkt->groupId) //如果是0表示非组播通信 组筛选
  {
    if(10 == pkt->endPoint) //端点筛选
    {
      switch(pkt->clusterId) //簇筛选
      {
      case 0x0001: //校验通过 LED1取反
        P1SEL &= 0xFE; //普通IO口
        P1DIR |= 0x01; //输出
        P1_0 ^=1; //取反
        break;
      }      
    }
  }
  
  
  if(0x0002 == pkt->groupId) //如果是0表示非组播通信 组筛选
  {
    if(10 == pkt->endPoint) //端点筛选
    {
      switch(pkt->clusterId) //簇筛选
      {
      case 0x0001://校验通过 LED2取反
        P0SEL &= 0xFD; //1111 1101 普通IO口
        P0DIR |= 0x02; //输出
        P0_1 ^=1; //取反
        break;
      }      
    }
  }
}

 

收藏
点赞
0
个赞
共1条回复 最后由用户已被禁言回复于2022-04
#2__________左手回复于2018-10

厉害了

0
TOP
切换版块