微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > 射频无线通信设计 > 关于zigbee物理地址的问题。 @wateras1!

关于zigbee物理地址的问题。 @wateras1!

时间:10-02 整理:3721RD 点击:
@wateras1 这个问题已经困扰我很多天了,真心请求一位大神能够帮我指点指点。是这样的。

我现在知道了这四个API的作用,
uinit16 NLME_GetShortAddr(void) 返回该节点的网络地址。

byte* NLME_GetExtAddr(void) 返回指向该节点MAC地址的指针。

uint16 NLME_GetCoordShortAddr(void) 函数返回父节点的网络地址

void NLME_GetCoordExtAdd(byte* buf)该函数的参数是指向存放父节点的MAC地址的缓冲区的指针。

然后再网上找了帖子就按照他的方式把函数写了进去

void ShowInfo(void)
{
RFTX rftx;
uint8 buff[8]
uint8 changline[2]={0x0A,0x0D};
uint16 nwk,nwk1;

nwk=NLME_GetShortAddr()
To_string(rftx.myNWK,(uint8*)&nwk,2); //uint8*4 uint16=uint8*2
To_string(rftx.myMAC,NLME_GetExtAddr(),8);//uint8*16 byte*8

nwk1=NLME_GetCoordShortAddr();
To_string(rftx.pNWK,(uint8*)&nwk1,2);
NLME_GetCoordExtAddr(buff)C
To_string(rftx.pMAC,buff,8);

HalUARTWrite(0,"NWK:",osal_strlen("NWK:"));
HalUARTWrite(0,rftx.myNWK,4);

HalUARTWrite(0,"MAC",3);
HalUARTWrite(0,rftx.myMAC,16);

HalUARTWrite(0,"p-NWK:",5);
HalUARTWrite(0,rftx.pNWK,4);

HalUARTWrite(0,"p-MAC:",6);
HalUARTWrite(0,rftx.pMAC,16);

HalUARTWrite(0,changline,2);
}

后面还有二进制和十六进制转换
void To_string(uint8 *dest, unsigned char* src,uint8 length)//二进制书转化为十六进制数 { uint8* xad;
uint8 i=0;
uint8 ch;
xad=src+length-1;
for(i=0;i<length;i++,xad--)
{ ch=(*xad>>4)&0x0F; //除以十六
dest[i<<1]=ch+((ch<10)?'0':'7');
ch=*xad&0x0F;
dest[(i<<1)+1]=ch+((ch<10)?'0':'7');
}
}

另外还有一个结构体
typedef struct RFTXBUF
{
uint8 myNWK[4];
uint8 myMAC[16];
uint8 pNWK[4];
uint8 pMAC[16];
}RFTX;

我把ShowInfo()的函数放在了MessageMSGCB底下,之前还有个事件函数是周期发的,进到MessageMSGCB的时间里以后就执行ShowInfo()。结果用串口看一下是:NWK:0000 MAC00124B00028B679 Bp-NWK0000 p-MAC:0000000000000000
NWK:0000 MAC00124B00028B679 Bp-NWK0000 p-MAC:0000000000000000
NWK:0000 MAC00124B00028B679 Bp-NWK0000 p-MAC:0000000000000000
NWK:0000 MAC00124B00028B679 Bp-NWK0000 p-MAC:0000000000000000
PS:NWK之前还有我的需要周期发的数据。之后我又用软件看了一下这个有地址信息的是协调器的物理地址,不是节点的物理地址。但是在程序中个人觉得 NLME_GetCoordExtAddr(buff)C 是协调器的地址,而在串口写的时候写到了 HalUARTWrite(0,rftx.pMAC,16); pMAC结构体了,个人觉得应该写到myMAC里,所以觉得有点懵。还有不知道到为什么就给我一个协调器的物理地址。剩下的都是0000.

之前用过一些例程已经把节点的短地址做出来了,temp=pkt->srcAddr.addr.shortAddr; //读出数据包的16位短地址,利用结构体赋值的方法。用到了PKT包。而上述这种方法是怎样一个发送过程,如果有大神了解的话请您指点指点@wateras1

最近也在学,插个队和楼主探讨下
LZ本意是希望打印网络拓扑或者取得所有节点地址,NLME_GetCoordShortAddr函数是从flash里面读出来,所以是不是要在终端执行然后发送到协调器从串口打印出来,或者在终端的周期事件里执行并打印输出。不知道你是怎么处理的。

你那个是几个组网呢?其次你调用有问题,0000是协调器的固定地址,后面是它的物理地址,因为协调器是根结点没有父节点所以默认地址为0。你如果想获得其他加入协调器的节点地址,首先你需要在每个节点的接受函消息中调用相应的API,在调用发送函数指定协调器的地址发送出去就没问题了,而不是打印出来。打印仅仅在协调器处的接触函数里面打印。

搭车请教:请问如果上位机请求协调器把网络中的设备数量和地址发过去,我该怎么做呢,查表么?查那个表呢?

按照上面的思路来,调用上面的API获得每个节点的地址,建立一个网络设备表,其实就是一个结构体。不过你要删除掉相同节点的信息。这个可以协调器做也可以上传到PC软件去做 其实你可以定义一个查询设备信息的事件,每次规定时间轮询下。我自己就曾经设计过一个路由表,方法类似


你给这个图片看不出什么,就是一个节点的短地址,MAC地址以及父节点的短地址和MAC地址

首先谢谢回复。
上面的图片是给LZ看的,我在端点调用他的函数可以正常输出地址信息。
其次,我的问题。
我担心协调器自己建表维护内存开销较大,所以我打算上传给上位机来做。
我的暂定做法是:
各个端点在组网成功后的ZDO_STATE_CHANGE事件里用以上函数读出自己的短地址和MAC地址,以点播方式发送给协调器。协调器收到一个端点发过来的地址,就把他转发给上位机,由上位机依据mac地址的唯一性来进行绑定管理。
我想请教的问题:
1、这样做可行么,有什么缺点,通常的做法是什么
2、怎么做到设备地址和设备类型对应(比如那个是灯,那个是开关)
3、端点发回的信息怎么保证协调器一定能收到,发送函数返回afStatus_SUCCESS是表示对方收到了么?自动应答机制是在那里设置的还是默认开启的?
4、我打算靠端点定时发送周期性消息来检测在线状态,类似于心跳信号,有更好的办法么?心跳周期一般式多少合适呢?
非常抱歉一下子问了这么多问题,原谅我初涉zigbee很迷茫。

昨天请假了,今天才看到帖子。非常感谢郭工的答复。 首先我是一个协调器,底下有两个节点,您说我调用的有问题提醒了我。那我把这个API分配给节点让节点去执行以下,然后再发给协调器应该就没问题了。 谢谢您,我稍后试试。

哈哈, 您的想法和wateras1一样哦。 我是直接就再处理函数了用串口写了,所以没弄出来。 谢谢您的回答。我也是接触zigbee半年,目前主攻这个技术,以后有什么问题多交流。 谢谢您。

第一个问题,我目前也在做这部分。 是利用MAC绑定的。 缺点就是长度比较大,传的数据比较多。
第二个问题,同求。

MAC绑定的话
1、前期输入问题怎么解决,就是读出各端点MAC,输入到主机管理。
2、发现不匹配的端点怎么拒绝它加入,具体在那里处理

节点入网后有条ZDO命令叫做Annce,上报物理地址和短地址。

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

网站地图

Top