This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

ZigBee MAC地址白名单设计经验分享

很多同志对ZigBee的MAC地址白名单设计一直很困惑,其实不难,下面介绍一下本人针对TI的ZStack协议栈如何添加节点白名单的设计方法:

首先,在SampleApp.h中声明两个外部全局变量:

extern uint8 extAddrsList[10][16];  //定义一个二维数组用于存储16字节的MAC地址,最多加入白名单的节点有10个
extern uint8 extAddrsListCnt;  //加入节点计数

在Coordinate.c注册串口回调函数,添加如下代码:

uint8 extAddrsList[10][16];  //全局变量定义

uint8 extAddrsListCnt=0; 

void uartRxCB( uint8 port, uint8 event )//串口回调函数 
{
  uint8 num,uartbuf[16]; 
  num=HalUARTRead(0,uartbuf,16);
  
  if(num==16)
  {
   osal_memcpy(extAddrsList[extAddrsListCnt++],uartbuf,16); //将串口读取的合法MAC地址添加到白名单列表中
   //HalUARTWrite(0,uartbuf,16);
   HalLedSet ( HAL_LED_1, HAL_LED_MODE_TOGGLE );
  }
  afAddrType_t SampleApp_DstAddr;   //定义目的发送地址类型
  SampleApp_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;    //设置地址模式为单播发送数据
  SampleApp_DstAddr.endPoint =  SAMPLEAPP_ENDPOINT;       //目的端口号
  SampleApp_DstAddr.addr.shortAddr = 0xFFFF;              //设置网络地址为全网广播模式
}

协调器组建网络后,上位机通过串口给协调器发送所要加入白名单节点的MAC地址,并将其添加到白名单记录中;

子节点请求入网时会发起一个AssoReq指令,该指令包含了该节点的MAC地址信息;协调器收到后,在ZDO层验证该地址是否在白名单记录中,若不在则返回一包拒绝信息,否则允许其加入网络,并修改子节点表的信息。具体设计思路是在Zstack协议栈ZDO层的ZDApp.c中修改ZStatus_t ZDO_JoinIndicationCB(uint16 ShortAddress, uint8 *ExtendedAddress,uint8 CapabilityFlags, uint8 type)函数,该函数可以直接接驳NWK层处理子节点请求入网的事件,在此加入白名单验证,不合法的地址直接返回ZFailure。修改后ZDO_JoinIndicationCB()函数核心代码如下:

ZStatus_t ZDO_JoinIndicationCB(uint16 ShortAddress, uint8 *ExtendedAddress,uint8 CapabilityFlags, uint8 type)

{

  uint8 flag=0;  //MAC地址白名单比对结果标志

  uint8 buf[16];   //存储入网节点的MAC地址

  To_string(buf,ExtendedAddress,8);   //调用To_string函数使MAC地址以16进制形式存储在buf数组中

  for(uint8 i=0;i<extAddrsListCnt;i++)  //遍历MAC地址白名单列表

  {

    if(osal_memcmp(buf,extAddrsList[i],16)==true)  //比对成功则跳出执行下面的事件

    {

      flag=1; //比对成功flag置1

      break;

    }

  }

  if(!flag)   //若比对的结果不存在,则return ZFailure

return ZFailure;

……………..

…………

}

到此,ZigBee的MAC地址白名单设计分享完毕。