id:罗菜鸟;白名单实现的分析,与提问。
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地址过滤的基本原理。
那你这句话说的不对嘛,匹配指示怎么是入网请求呢,入网成功后才会触发匹配的,然后根据一些列匹配参数过滤。因此入网请求是在匹配之前的吧