Zigbee学习之路4(广播,组播实验)

本节广播,组播源码会在最下面贴出地址,小伙伴可以结合看看,源码里面注释的很详细额

链接: https://pan.baidu.com/s/1aCQHUHKY9kEanj6UCQyj2Q 提取码: gdx7 复制这段内容后打开百度网盘手机App,操作更方便哦

广播:

可以理解成,发送模块发出数据,这个网络里的所有节点模块都可以拿到这个数据。

广播的发送过程:
终端发送模块,定义了端点10,发送出去的方式是广播的方式 即SDApp_DstAddr.addrMode = (afAddrMode_t)Addr64Bit         ;,目标是网络里所有节点。
制定接收的模块,接收这个数据的端点房间是10,接收的族是0x0001;

协调器和路由器接收方
定义了端点10,并且和应用层任务挂钩,一旦外部给本模块发数据,就会进入应用层任务事件处理函数,在函数里外部来数据这个消息里,判断是SDApp_CLUSTERID,所有我们能够把数字8在数码管上显示。

网络特性: 外部特性 出现的函数为需要的函数库
协调器创建网络之后,就和网络里的路由器节点在通信过程中、功能上没有任何区别,只不过网络地址有点特殊永远是0x0000.
终端入网之后,他和网络里的其他节点数据收和发都要经过他的父节点转发。

路由器在入网时候,虽然网络里也有他的父节点,有父子关系,但是他们发数据时候,不需要父节点转发,入网后,协调器和所有的路由器他们的通信地位是平等。
目标地址为0XFFFF表示,这个数据包的目标模块是网络里的所有节点

无线数据包的解析,网络源地址 网络目标地址,表示这个无线数据包的目的是从源地址 发送到目标地址;而在一个无线数据包里,前面的源地址 和目标地址代码 当前的这个无线数据包,是从哪个一个模块发出来,当前这个无线数据包要去哪一个节点。

广播通信路由器接收代码和广播通信协调器接收代码一样的,广播很简单,这里就不做太多的“累赘”了。 接下来是

组播:

1、组播通信,在Zigbee网络,模块可以分组来标记,发送的模块如果发送的组号和网络里标记模块的组号相对应,那么这些模块就可以拿到这些无线数据包。
2、分组中组编号是2个字节
   组都是和模块里已经定义了的端点相关联,如果我们说一个模块标记为组1,那么这个模块里至少有1个定义了的可用的端点和组0x0001相关联。

  发送的模块按照组的方式发送,需要指定的内容 目标模块的组编号,端点,族,原则上只有当接收模块的这3个参数匹配上了,才能拿到和处理这样一个无线数据包

3.组标记中,同一个模块定义的一个组个可以关联多个可用的端点,同一个端点下也可以关联多个组。

终端发送模块函数:
SDApp_DstAddr 无论是单播 广播 组播都用来描述接收模块一些信息
和广播没有什么区别仅仅是发送的地址模式 和 地址内容2个参数
 if(0==P0_1)//按钮3按下
{
char theMessageData[] = "hello word";
         
         SDApp_DstAddr.addrMode = (afAddrMode_t)AddrGroup;//AddrGroup表示为发送模式是广播方式 AddrBroadcast表示广播方式
            SDApp_DstAddr.addr.shortAddr = 0x0001;//接收模块的组编号  若使用组播 0xFFFF表示目标接模块是网络里的所有地址
            // Take the first endpoint, Can be changed to search through endpoints
            SDApp_DstAddr.endPoint = 10;//接收模块的端点房间号
         
            //发送函数 //SDApp_epDesc 结构体 端点描述符有源端点的信息,也是10
   if( AF_DataRequest( &SDApp_DstAddr, &SDApp_epDesc,
                       0X0001,//SDApp_CLUSTERID 目标端点镞,房间里的接收人数据宏是1,2个字节,所以在射频0x0001
                       (byte)osal_strlen( theMessageData ) + 1,//发送字符串的长度
                       (byte *)&theMessageData, 
                                   &SDApp_TransID,
                                   AF_DISCV_ROUTE, AF_DEFAULT_RADIUS )== afStatus_SUCCESS );
           
       
    P1DIR |=0X01;//此处点亮led 显示的数据为需要的数据位
    P1_0 ^=1; 
    

       }
       if(0==P2_0)
       {//按钮4按下
         char theMessageData[] ="hello huanhuan";
            SDApp_DstAddr.addrMode = (afAddrMode_t)AddrGroup;
            SDApp_DstAddr.addr.shortAddr = 0x0002;
            // Take the first endpoint, Can be changed to search through endpoints
            SDApp_DstAddr.endPoint = 10;
            
           if( AF_DataRequest( &SDApp_DstAddr, &SDApp_epDesc,
                                   0x0001,
                                   (byte)osal_strlen( theMessageData ) + 1,
                                   (byte *)&theMessageData,
                                   &SDApp_TransID,
                                   AF_DISCV_ROUTE, AF_DEFAULT_RADIUS )== afStatus_SUCCESS) ;
       
           P1DIR |=0X01;//此处点亮led 显示的数据为需要的数据位
           P1_0 ^=1; 
       
       }


协调器接收模块
#include"aps_groups.h" 用到了组相关的结构体,所有添加组头文件
aps_Group_t SampleApp_Group1;
aps_Group_t SampleApp_Group2;


按下按钮标记组
 if(0==P0_1)//按钮3按下
       {
//          LS164_BYTE(3);
//         P1_1 =0;
          LCD_CLS();
          LCD_P8x16Str(8,4,"zu11111");     //图片显示,表示配置标志为组1
aps_RemoveGroup( 10, 0x0002 );//如果10号端点上关联了0x0002,那么就去掉组2个这个关联,如果根本没有关联,不做处理

          SampleApp_Group1.ID=0X0001;//再次关联组1
aps_AddGroup( 10, &SampleApp_Group1 );//表示把这个组1关联到了这10端点
          
       }
       if(0==P2_0)//按钮4按下
       {
//         P1_0=0;
//          LS164_BYTE(4);
         LCD_CLS();
        LCD_P8x16Str(8,4,"zu2222");  
        aps_RemoveGroup(10,0x0001);//如果10号端点上关联了0x0001,那么就去掉组1个这个关联,如果根本没有关联,不做处理
          
        
          SampleApp_Group2.ID=0X0002;
          aps_AddGroup( 10, &SampleApp_Group2 );   
       }
//       if(0==P0_5)
//       {//按钮5按下
//           LCD_CLS();
        LCD_P8x16Str(8,4,"zu1111 he zu2222"); 
       //aps_RemoveAllGroup(10);//移除10号端点上的所有组编号
//        SampleApp_Group1.ID=0X0001;//再次关联组1
//        aps_AddGroup( 10, &SampleApp_Group1 );//表示把这个组1关联到了这10端点
//        SampleApp_Group2.ID=0X0002;
//        aps_AddGroup( 10, &SampleApp_Group2 );    
       
       //       }
        return (events ^ SDApp_MY_EVT);
  }

数据处理 void SDApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )//数据处理函数
 

if(0x0001==pkt->groupId)//groupId表示无线数据包内容为1,为广播方式 若为0则,表示单播,
  {
    if(10==pkt->endPoint)//表示组端点为10 当我们需要的数据帧
    {
      switch ( pkt->clusterId )//clusterId==镞,即判断那个镞作为端点发送给应用层数据
      {
     case 0x0001://led1
            Draw_BMP(0,0,128,8,BMP);//显示图片
            Uart_Send_String(pkt->cmd.Data,pkt->cmd.DataLength);//将发送模块传输的数据,协调器接收到的数据在串口上打印出来
            
            P1SEL &=0XFE;//1111 1110  LED1
            P1DIR |=0X01;
            P1_0 ^=1;
            break;       
      }
    }
  }
  if(0x0002==pkt->groupId)//groupId表示无线数据包内容为1,为广播方式 若为0则,表示单播,
  {
    if(10==pkt->endPoint)//表示组端点为10 当我们需要的数据帧
    {
      switch ( pkt->clusterId )//clusterId==镞,即判断那个镞作为端点发送给应用层数据
      {
     case 0x0001://led2
              LCD_CLS();
        for(i=0; i<8; i++)
        {
            LCD_P16x16Ch(i*16,0,i);  //点阵显示
            LCD_P16x16Ch(i*16,2,i+8);
            LCD_P16x16Ch(i*16,4,i+16);
            LCD_P16x16Ch(i*16,6,i+24);
        } 
        Uart_Send_String(pkt->cmd.Data,pkt->cmd.DataLength);
            P2SEL &=0XFD;// 1111 1101;
            P2DIR |=0X02;
            P2_1 ^=1;
            break;
          
      }
    }
  }

你可能感兴趣的:(zigbee,zigbee,广播,组播,源码,函数)