4261|8

7

帖子

1

TA的资源

一粒金砂(中级)

楼主
 

id:罗菜鸟;白名单实现的分析,与提问。 [复制链接]

在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位。

如何实现过滤求解
此帖出自RF/无线论坛

最新回复

那你这句话说的不对嘛,匹配指示怎么是入网请求呢,入网成功后才会触发匹配的,然后根据一些列匹配参数过滤。因此入网请求是在匹配之前的吧   详情 回复 发表于 2014-4-15 09:19
点赞 关注
 

回复
举报

147

帖子

0

TA的资源

一粒金砂(高级)

沙发
 

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

此帖出自RF/无线论坛

点评

jion成功后才触发的ind,这是匹配成功的指示函数,入网成功需进行匹配,匹配不成功则入网失败  详情 回复 发表于 2014-4-2 09:13
我在// 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  详情 回复 发表于 2014-3-31 19:18
 
 

回复

7

帖子

1

TA的资源

一粒金砂(中级)

板凳
 
我在
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下面写是吗? 我没试过。求教正确写法。
此帖出自RF/无线论坛
 
 
 

回复

7

帖子

1

TA的资源

一粒金砂(中级)

4
 
罗菜鸟 发表于 2014-3-31 15:26
你函数用错了,函数MAC_CbackEvent接收到消息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;
    }



此帖出自RF/无线论坛

点评

入网认证与MAC_MCPS_DATA_IND没有任何关系  详情 回复 发表于 2014-4-1 10:38
 
 
 

回复

147

帖子

0

TA的资源

一粒金砂(高级)

5
 
ppwxkk 发表于 2014-3-31 19:18
我在// Filter out non-zigbee packets
else if(event == MAC_MLME_ASSOCIATE_IND)
判断后写的

入网认证与MAC_MCPS_DATA_IND没有任何关系
此帖出自RF/无线论坛

点评

谢谢  详情 回复 发表于 2014-4-1 12:09
 
 
 

回复

7

帖子

1

TA的资源

一粒金砂(中级)

6
 
罗菜鸟 发表于 2014-4-1 10:38
入网认证与MAC_MCPS_DATA_IND没有任何关系

谢谢
此帖出自RF/无线论坛
 
 
 

回复

57

帖子

1

TA的资源

一粒金砂(中级)

7
 
罗菜鸟 发表于 2014-3-31 15:26
你函数用错了,函数MAC_CbackEvent接收到消息MAC_MLME_ASSOCIATE_IND才是节点入网请求。

jion成功后才触发的ind,这是匹配成功的指示函数,入网成功需进行匹配,匹配不成功则入网失败
此帖出自RF/无线论坛

点评

收到ASSOC IND后,不传递给NWK层,就会导致匹配失败。这也就是MAC地址过滤的基本原理。  详情 回复 发表于 2014-4-3 09:01
 
 
 

回复

147

帖子

0

TA的资源

一粒金砂(高级)

8
 
myl593799546 发表于 2014-4-2 09:13
jion成功后才触发的ind,这是匹配成功的指示函数,入网成功需进行匹配,匹配不成功则入网失败

收到ASSOC IND后,不传递给NWK层,就会导致匹配失败。这也就是MAC地址过滤的基本原理。
此帖出自RF/无线论坛

点评

那你这句话说的不对嘛,匹配指示怎么是入网请求呢,入网成功后才会触发匹配的,然后根据一些列匹配参数过滤。因此入网请求是在匹配之前的吧  详情 回复 发表于 2014-4-15 09:19
 
 
 

回复

57

帖子

1

TA的资源

一粒金砂(中级)

9
 
罗菜鸟 发表于 2014-4-3 09:01
收到ASSOC IND后,不传递给NWK层,就会导致匹配失败。这也就是MAC地址过滤的基本原理。

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

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
快速回复 返回顶部 返回列表