微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > 射频无线通信设计 > id:罗菜鸟;白名单实现的分析,与提问。

id:罗菜鸟;白名单实现的分析,与提问。

时间:10-02 整理:3721RD 点击:
在Zmac_cb.c文件中,找到函数MAC_CbackEvent,做了一个实验将
pData->dataInd.mac.dstAddr.addr.extAddr

pData->associateInd.deviceAddress
放入mact

mact[0]=pData->dataInd.mac.dstAddr.addr.extAddr [0];
mact[1]=pData->dataInd.mac.dstAddr.addr.extAddr [1];
mact[2]=pData->dataInd.mac.dstAddr.addr.extAddr [2];
mact[3]=pData->dataInd.mac.dstAddr.addr.extAddr [3];
mact[4]=pData->dataInd.mac.dstAddr.addr.extAddr [4];
mact[5]=pData->dataInd.mac.dstAddr.addr.extAddr [5];
mact[6]=pData->dataInd.mac.dstAddr.addr.extAddr [6];
mact[7]=pData->dataInd.mac.dstAddr.addr.extAddr [7];
waca(mact);//uint8 waca(unsigned char wac[8]) 利用函数发送值到系统层
在系统层建立函数
uint8 wacb[8];

uint8 waca(unsigned char mac[8])//处理zmac层MAC_CbackEvent传来的信息
{
wacb[0]=mac[0];
wacb[1]=mac[1];
wacb[2]=mac[2];
wacb[3]=mac[3];
wacb[4]=mac[4];
wacb[5]=mac[5];
wacb[6]=mac[6];
wacb[7]=mac[7];
return 0;
}

uint8 wacbb( uint8 i)//传到应用层
{
return wacb[i];
}

结果不是mac。

关于ZDO_JoinIndicationCB

加入
uint8 asc_16[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

uint8 temp2[8];



temp=ShortAddress;
temp2=*ExtendedAddress;

HalUARTWrite(0,"Hello World2\n",13);


HalUARTWrite(0,&asc_16[temp2%256/16],1);
HalUARTWrite(0,&asc_16[temp2%16],1);
HalUARTWrite(0,"\n",1);

由于这里的ExtendedAddress,是unit8,并不是数组,结果就2位也就是mac的最后2位。

如何实现过滤求解

你函数用错了,函数MAC_CbackEvent接收到消息MAC_MLME_ASSOCIATE_IND才是节点入网请求。

我在
else if(event == MAC_MLME_ASSOCIATE_IND)
判断后写的
if ( event == MAC_MCPS_DATA_IND )
{
uint8 fcFrameType = (pData->dataInd.msdu.p[0] & 0x03);
uint8 fcProtoVer = ((pData->dataInd.msdu.p[0] >> 2) & 0x0F);
uint8 fcReserve = (pData->dataInd.msdu.p[1] & 0xE0);


if ( (fcFrameType > 0x01) || (fcProtoVer != _NIB.nwkProtocolVersion) || (fcReserve != 0)
|| (pData->dataInd.mac.srcAddr.addrMode != SADDR_MODE_SHORT) )
{
// Drop the message
mac_msg_deallocate( (uint8 **)&pData );
return;
}

else if(event == MAC_MLME_ASSOCIATE_IND )//回调函数
{

mact[0]=pData->associateInd.deviceAddress [0]; //
mact[1]=pData->associateInd.deviceAddress [1];
mact[2]=pData->associateInd.deviceAddress [2];
mact[3]=pData->associateInd.deviceAddress [3];
mact[4]=pData->associateInd.deviceAddress [4];
mact[5]=pData->associateInd.deviceAddress [5];
mact[6]=pData->associateInd.deviceAddress [6];
mact[7]=pData->associateInd.deviceAddress [7];


}

还有这样也写过
if ( event == MAC_MCPS_DATA_IND )
{
uint8 fcFrameType = (pData->dataInd.msdu.p[0] & 0x03);
uint8 fcProtoVer = ((pData->dataInd.msdu.p[0] >> 2) & 0x0F);
uint8 fcReserve = (pData->dataInd.msdu.p[1] & 0xE0);

mact[0]=pData->dataInd.mac.dstAddr.addr.extAddr [0]; //
mact[1]=pData->dataInd.mac.dstAddr.addr.extAddr [1];
mact[2]=pData->dataInd.mac.dstAddr.addr.extAddr [2];
mact[3]=pData->dataInd.mac.dstAddr.addr.extAddr [3];
mact[4]=pData->dataInd.mac.dstAddr.addr.extAddr [4];
mact[5]=pData->dataInd.mac.dstAddr.addr.extAddr [5];
mact[6]=pData->dataInd.mac.dstAddr.addr.extAddr [6];
mact[7]=pData->dataInd.mac.dstAddr.addr.extAddr [7];


if ( (fcFrameType > 0x01) || (fcProtoVer != _NIB.nwkProtocolVersion) || (fcReserve != 0)
|| (pData->dataInd.mac.srcAddr.addrMode != SADDR_MODE_SHORT) )
{
// Drop the message
mac_msg_deallocate( (uint8 **)&pData );
return;
}

各种试了,搜了一下上面还有一个,这个函数,写了传回结果不对,正确写法是在搜一下MAC_MLME_ASSOCIATE_IND下面写是吗? 我没试过。求教正确写法。

我在// Filter out non-zigbee packets
else if(event == MAC_MLME_ASSOCIATE_IND)
判断后写的
// Filter out non-zigbee packets
if ( event == MAC_MCPS_DATA_IND )
{
uint8 fcFrameType = (pData->dataInd.msdu.p[0] & 0x03);
uint8 fcProtoVer = ((pData->dataInd.msdu.p[0] >> 2) & 0x0F);
uint8 fcReserve = (pData->dataInd.msdu.p[1] & 0xE0);


if ( (fcFrameType > 0x01) || (fcProtoVer != _NIB.nwkProtocolVersion) || (fcReserve != 0)
|| (pData->dataInd.mac.srcAddr.addrMode != SADDR_MODE_SHORT) )
{
// Drop the message
mac_msg_deallocate( (uint8 **)&pData );
return;
}

else if(event == MAC_MLME_ASSOCIATE_IND )//回调函数
{

mact[0]=pData->associateInd.deviceAddress [0]; //
mact[1]=pData->associateInd.deviceAddress [1];
mact[2]=pData->associateInd.deviceAddress [2];
mact[3]=pData->associateInd.deviceAddress [3];
mact[4]=pData->associateInd.deviceAddress [4];
mact[5]=pData->associateInd.deviceAddress [5];
mact[6]=pData->associateInd.deviceAddress [6];
mact[7]=pData->associateInd.deviceAddress [7];


}

还有这样也写过
if ( event == MAC_MCPS_DATA_IND )
{
uint8 fcFrameType = (pData->dataInd.msdu.p[0] & 0x03);
uint8 fcProtoVer = ((pData->dataInd.msdu.p[0] >> 2) & 0x0F);
uint8 fcReserve = (pData->dataInd.msdu.p[1] & 0xE0);

mact[0]=pData->dataInd.mac.dstAddr.addr.extAddr [0]; //
mact[1]=pData->dataInd.mac.dstAddr.addr.extAddr [1];
mact[2]=pData->dataInd.mac.dstAddr.addr.extAddr [2];
mact[3]=pData->dataInd.mac.dstAddr.addr.extAddr [3];
mact[4]=pData->dataInd.mac.dstAddr.addr.extAddr [4];
mact[5]=pData->dataInd.mac.dstAddr.addr.extAddr [5];
mact[6]=pData->dataInd.mac.dstAddr.addr.extAddr [6];
mact[7]=pData->dataInd.mac.dstAddr.addr.extAddr [7];


if ( (fcFrameType > 0x01) || (fcProtoVer != _NIB.nwkProtocolVersion) || (fcReserve != 0)
|| (pData->dataInd.mac.srcAddr.addrMode != SADDR_MODE_SHORT) )
{
// Drop the message
mac_msg_deallocate( (uint8 **)&pData );
return;
}

各种试了,搜了一下上面还有一个,这个函数,写了传回结果不对,正确写法是在搜一下MAC_MLME_ASSOCIATE_IND下面写是吗? 我没试过。求教正确写法。



if (tmp == 0)
{
return;
}

waca(mact);//uint8 waca(unsigned char wac[8]) 利用函数发送值到系统层

// MAC_MCPS_DATA_IND is very special - it is the only event where the MAC does not free *pData.
if ( event == MAC_MCPS_DATA_IND ) //另一个MAC_MCPS_DATA_IND事件
{
MAC_MlmeGetReq( MAC_SHORT_ADDRESS, &tmp );
if ((tmp == INVALID_NODE_ADDR) || (tmp == NWK_BROADCAST_SHORTADDR_DEVALL) ||
(pData->dataInd.msdu.len == 0))
{
mac_msg_deallocate( (uint8 **)&pData );
return;
}

入网认证与MAC_MCPS_DATA_IND没有任何关系

谢谢

jion成功后才触发的ind,这是匹配成功的指示函数,入网成功需进行匹配,匹配不成功则入网失败

收到ASSOC IND后,不传递给NWK层,就会导致匹配失败。这也就是MAC地址过滤的基本原理。

那你这句话说的不对嘛,匹配指示怎么是入网请求呢,入网成功后才会触发匹配的,然后根据一些列匹配参数过滤。因此入网请求是在匹配之前的吧

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top