ZigBee之ZStack协议移植(3)广播

功能

通过终端(端点10)以广播的形式向局域网内10号端点发送信息。
终端(发送):端点设置为10,簇为0x0001,发送到网络中所有10号端点模块,簇0x0001
协调器、路由器(接收):端点设置为10,簇为0x0001
注:如果协调器、路由器(接收)的端点不是设置为10或簇不为0x0001,都将接收不到广播数据。

代码

协调器:主要接受

static void LEDApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
  switch ( pkt->clusterId )
  {
    case LEDApp_CLUSTERID:
      // "the" message
#if defined( LCD_SUPPORTED )
      HalLcdWriteScreen( (char*)pkt->cmd.Data, "rcvd" );
#elif defined( WIN32 )
      WPRINTSTR( pkt->cmd.Data );
#endif
//      pkt->cmd.DataLength;//得到接收数据的长度
//      pkt->cmd.Data[0];//首地址
      LED02 =~LED02;
      UartTX_Send_String( pkt->cmd.Data,pkt->cmd.DataLength);
      break;
  } 
}

路由器:

static void LEDApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
  switch ( pkt->clusterId )
  {
    case LEDApp_CLUSTERID:
      // "the" message
#if defined( LCD_SUPPORTED )
      HalLcdWriteScreen( (char*)pkt->cmd.Data, "rcvd" );
#elif defined( WIN32 )
      WPRINTSTR( pkt->cmd.Data );
#endif
//      pkt->cmd.DataLength;//得到接收数据的长度
//      pkt->cmd.Data[0];//首地址
      LED02 =~LED02;
      UartTX_Send_String( pkt->cmd.Data,pkt->cmd.DataLength);
      break;
  } 
}

终端:(发送)

 if ( events & LEDApp_MY_EVT )
  {    
   if(P0_4 == 0)//S5
   {
     char theMessageData[] = "KEY1按下\n";
     LED02  =~LED02;
     LEDApp_DstAddr.addrMode = (afAddrMode_t)AddrBroadcast;//广播
     LEDApp_DstAddr.addr.shortAddr = 0xFFFF;//目标接收模块是网络所有节点
            // Take the first endpoint, Can be changed to search through endpoints
     LEDApp_DstAddr.endPoint = LEDApp_ENDPOINT;//接收模块的端点号
     
    //LEDApp_epDesc结构体 端点描述符有源端点的信息,延时10
//发送 (byte)osal_strlen( theMessageData ) + 1表示发送的字节
     AF_DataRequest( &LEDApp_DstAddr, &LEDApp_epDesc,
                       0x0001,//目标端点簇,房间的连接端点数据宏是1,2个字节,所以在射频是0x0001
                       (byte)osal_strlen( theMessageData ) + 1,//发送字符串的长度
                       (byte *)&theMessageData,//字符串内容数组的首地址
                       &LEDApp_TransID,//记录我们应用层任务发送的数据包个数
                       AF_DISCV_ROUTE, AF_DEFAULT_RADIUS );
   }
   if(P0_5 == 0)//S5
   {
   }    
//  P0_1 =~P0_1;//led2    
    P0IFG = 0;
    P0IF = 0; 
    return (events ^ LEDApp_MY_EVT);
  }
enum
{
  AddrNotPresent = 0,
  AddrGroup = 1,
  Addr16Bit = 2,//单播
  Addr64Bit = 3,
  AddrBroadcast = 15//广播
};
说明
  1. 广播:可以理解为,发送模块发出数据,这个网络里所有节点模块都可以拿到这个数据。
  2. 广播发送过程:终端发送模块,定义了端点10号,发送出去的方式,目标是网络里所有的节点;其中制定接收的模块,接收这个数据的端点号10,接收簇是0x0001。
  3. 协调器和路由器接收模块过程:定义了端点10,与应用层挂钩;一旦外部给本模块发送数据时,就会进入这个应用层任务事件处理函数uint16 LEDApp_ProcessEvent( uint8 task_id, uint16 events )->void LEDApp_MessageMSGCB( afIncomingMSGPacket_t *pkt );外部来数据这个消息里,判断LEDApp_CLUSTERID0x0001;就实现内部代码,通过串口打印接收到是数据。
  4. 网络特性:
      a.协调器创建网络之后,就和网络里的路由器节点在通信过程中、功能上没有任何区别,只不过网络地址有点特殊,永远都是0x0000。
      b.终端入网后,他和网络里其他节点数据收和发都要经过他的父节点(路由器)转发。
      c.路由器在入网的时候:虽然网络里也有他的父节点,有父子关系,但是他们发数据的时候,不需要父节点转发,入网后协调器和所有的路由器,他们的通信地位是平等的。
  5. 无线数据包解析:网络源地址 网络目标地址,表示这个无线数据包的目的 是从源地址 发送 到目标地址,而在这个无线数据包里,前面的源地址和目标地址代码,当前的这个无线数据包,是从哪一个模块发出来的,当前这个无线数据包要去哪一个节点。
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值