组播通信,就是在一个网络中,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
个赞
请登录后评论
TOP
切换版块
厉害了