协调器是如何获取终端的IEEE地址并自动对其分配网络短地址呢

来源:互联网 发布:刘亦菲捏脸数据 编辑:程序博客网 时间:2024/05/18 12:41

协调器是如何获取终端的IEEE地址并自动对其分配网络短地址呢?  

  

|字号 订阅

协调器是如何获取终端的IEEE地址并自动对其分配网络短地址呢?
猜想如下:
终端上电后稳定后就开始寻找周围是否存在网络?向周围发射广播,该广播内容包含自己的身份信息,即MAC地址和其它相关的网络信息,并时刻等待协调器或路由器的回应,一旦收到父网确认加入网路的回应信号则停止广播自己的身份ID,转入定时询问父网是否有自己消息的状态,并一直持续下去,如果有自己的消息则进行消息接收或处理。
协调器上电后首先组建网络,网络组建成功后就可以允许其它设备加入到该网路并对网络进行管理,一旦发现有新的设备加入到网络,则分析该设备的广播包并解析出它的IEEE地址,然后分配给它一个网络短地址,反馈给该设备加入确认信息,至此一个设备加入到了该网络中。

实验与分析:
1、分析终端上电后的行为
      使用sniffer截取一部分采集到数据如下:

协调器是如何获取终端的IEEE地址并自动对其分配网络短地址呢? - 蓝天白云 - 蓝天白云的博客
1)dest pan ID  为0xffff,说明终端未加入到网络;
2)dest address 地址为0xffff 说明终端目前以广播方式进行数据发送;

......................
偶然发现了frank写的一篇文章整好可以回答这个问题,引用一下大家参考参考,我就不继续写了,呵呵。

网络地址的分配及获取[转]  
      Zigbee2006通过分布式寻址方案来分配网络地址的,保证网络内地址的唯一性。这个寻址算法本身的分布特性保证设备只能与其父辈设备通讯来接受一个网络地址。不需要整个网络范围内通讯的地址分配,有助于网络的可测量性。

在04协议栈里有这样一个公式,A=A(parent)+Cskip(d)*Rm+n,Cskip(d)是不同深度的父设备分配地址时的偏移量,Rm是可以携带的最大路由数,n是第n个设备。其中如果Cskip(d)=0x5a6,Rm=4,则协调器的第一个RFD的地址为A=0+0x5a6*4+1=0x1699.

在06协议里看到这样一个描述:对于一个地址为A、深度为d的路由器,如果下式成立,则具有地址为D的目的地址设备为子设备:A<D<A+Cskip(d-1),假设父设备可拥有的最大子设备数为Cm,其拥有的最大路由子设备数为Rm,网络的最大深度为Lm,则父设备所能分配子区段地址数为:

若Rm=1,Cskip(d)= 1+Cm*(Lm-d-1);

若Rm不为1,则Cskip(d)=(1+Cm-Rm-Cm*( Rm)^(Lm-d-1))/(1-Rm).

协调器是如何获取终端的IEEE地址并自动对其分配网络短地址呢? - 蓝天白云 - 蓝天白云的博客

后来在另一本资料上见到一份资料:

子节点为父设备的第n个子路由器的短地址分配:

Achild =Aparent +(n-1)*Cskip(d)+1,n=1

Achild =Aparen +(n-1)*Cskip(d),n>1

子节点为父设备的第n个子终端设备的短地址分配:

Achild = Aparent + Rm*Cskip(d)+ n

下图为Lm=3,Cm=6,Rm=4的网络地址分配示例。

协调器是如何获取终端的IEEE地址并自动对其分配网络短地址呢? - 蓝天白云 - 蓝天白云的博客

几个有用的关于物理地址和网络地址的函数:

得到父节点的网络地址:uint16 NLME_GetCoordShortAddr( void );

得到父节点的物理地址:void NLME_GetCoordExtAddr( byte * );

得到自己的网络地址:uint16 NLME_GetShortAddr( void );

得到自己的物理地址:byte *NLME_GetExtAddr( void );

根据已知物理地址查询远程设备网络地址,作为一个广播信息发送给网络中的所有设备:

afStatus_t ZDP_NwkAddrReq( byte *IEEEAddress, byte ReqType,
                           byte StartIndex, byte SecurityEnable )

根据已知网络地址查询远程设备物理地址,作为一个广播信息发送给网络中的所有设备:

afStatus_t ZDP_IEEEAddrReq( uint16 shortAddr, byte ReqType,
                            byte StartIndex, byte SecurityEnable )

快速查询(不启动无线查询,而是根据已存储于地址管理器中的网络(物理)地址查询物理(网络)地址):

查找基于网络地址的物理地址:

uint8 APSME_LookupExtAddr( uint16 nwkAddr, uint8* extAddr );

查找基于物理地址的网络地址:

uint8 APSME_LookupNwkAddr( uint8* extAddr, uint16* nwkAddr );

一般发送消息,使用物理地址和网络地址都可以发送,但最好用网络地址,使用物理地址可能会出现问题。

采用16bit网络地址可以降低功耗问题。如果采用64bit IEEE地址发送数据,首先其数据发送的最佳路径难以求得,势必会增加多次发送的功耗 其二 如果该数据接收设备离开网络(当机),发送之时也就不知道。 采用网络地址发送数据,可以采用路由算法 找到最佳路径 减其功耗。[摘自fjxsos]

原创粉丝点击