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地址白名单设计分享完毕。
这也有个相关的。谢谢楼主的经验分享
http://www.deyisupport.com/question_answer/wireless_connectivity/zigbee/f/104/t/80933.aspx
谢谢分享!