Zigbee学习日记(十二)MAC地址通信
goJhou 发布于2018-01-12 浏览:3573 回复:4
0
收藏

每块芯片在出场的时候都固化有一个8字节长的地址,可称为IEEE地址或MAC地址,这是全世界唯一的地址。

这个地址其实也能用来利用

当模块成功变成协调器、路由器、终端时,我们可通过NLMEDE.h头文件内的方法获取到自己的MAC地址和自己的网络地址。

在应用层.c文件中新增#include “NLMEDE.h”

为了存储网络地址和MAC地址,在全局申明2个变量

uint16 NwkAddr=0xFFFF;
uint8 MacAddr[8]={0};

随后在事件处理函数中找到确定模块身份的代码块

if(GenericApp_NwkState == DEV_ZB_COORD)
          {//如果本模块成为了协调器,会进入到这来来
               LS164_BYTE(11);
               NwkAddr = NLME_GetShortAddr();
               
               memcpy(MacAddr,NLME_GetExtAddr(),8);//需要#include为了将第2个参数返回的8个字节拷贝到MacAddr中。是c库的函数
               
               //NLME_GetCoordShortAddr() 获得父节点网络短地址
               //NLME_GetCoordExtAddr() 获得父节点MAC地址
               
               
          }

 

我们想改变这类通信模式,按先前的经验来说肯定是去看GenericApp_DstAddr这个目标地址描述结构体。

在他的addrMode参数中,我们可以看到它所在的枚举类型

enum
{
AddrNotPresent = 0,
AddrGroup = 1,
Addr16Bit = 2,
Addr64Bit = 3,
AddrBroadcast = 15
};

 

我们已经用过很多个了。单播时我们用的是Addr16Bit(双字节地址)、广播时我们用的是AddrBroadcast、组播时我们用的是AddrGroup、这次MAC通信,我们将用到Addr64Bit。MAC地址是由8个字节组成的地址,8*8=64,所以MAC地址又可以表示位64比特地址。

 

GenericApp_DstAddr.addrMode = (afAddrMode_t)Addr64Bit;
uint8 DestMac[8]={0x0F,0x55,0x16,0x07,0x00,0x4B,0x12,0x00};//假设已知对方mac地址为0x00124B000716550F.将mac地址存到数组内
memcpy(GenericApp_DstAddr.addr.extAddr,DestMac,8);//将mac地址拷贝到目标地址参数中去

这样子设置就可以进行MAC地址通信了。当然这根单播雷同,只是单播要基于已知的网络地址。

有时两模块间距离很远,通过mac地址通信可能会失败。为了防止这种现象,通常以mac地址查询他的网络地址。

ZDP_NwkAddrReq(DestMac,ZDP_ADDR_REQTYPE_SINGLE,0,0);//让mac地址对应的模块把自己的网络短地址回复给发送端。收到后会将MAC地址存到地址管理器中
osal_start_timerEx(GenericApp_TaskID,GENERICAPP_SEND_MSG_EVT,30);//之后再通过消息发送执行发送消息命令

 

 

收藏
点赞
0
个赞
共4条回复 最后由O国殇O回复于2021-07-06
#7O国殇O回复于2021-07-06

学习了

0
#6O国殇O回复于2021-07-06

蓝牙吗

0
#5头头头pai回复于2021-06-23

不是6个字节码?

0
#3我还曾经的回复于2018-01-15

很详细,长知识了

0
TOP
切换版块