ZigBee地址模式分析
- 格式:docx
- 大小:22.88 KB
- 文档页数:5
ZigBee学习之8——对ZigBee地址的理解Zigbee网络中有三类地址,呵呵有人说只有两类哦,这里是我自己的理解,如果不同意可以发表见解哈第一类是IEEE地址,也叫做扩展地址。
这是一个64位的地址,由设备商固化到设备中,地址由IEEE发配,当然我们现在买到的开发板芯片上的IEEE地址一般应该为全F,这是一个无效地址,就是说这个芯片还没有分配地址拉。
可以用Ti的flash编程软件烧写一个IEEE地址。
第二类地址是所谓的网络地址,也就叫做短地址。
这是一个16位的地址,其中有几个特殊的地址:0xFFFF -这个一个对全网络中设备进行广播的广播地址0xFFFD -如果在命令中将目标地址设为这个地址的话那么只对打开了接收的设备进行广播0xFFFC -广播到协调器和路由器0xFFFE -如果目的地址为这个地址的话,那么应用层将不指定目标设备,而是通过协议栈读取绑定表来获得相应目标设备的短地址此外的0x0000到0xFFF8都是有效的目的地址。
每一个地址就只是了一个目标设备。
第三类地址是终端(endpoint)地址。
这是一个8位的逻辑地址。
每个物理设备节点内部含有256个可编址的逻辑终端(endpoint),其中终端0就是ZDO,终端255是个广播地址,241-254保留为以后使用。
Zigbee的通信其实就是由叫做簇的数据结构在终端之间传播构成的。
关于终端和其操作还是有很多不明白的地方,只知道这是一个逻辑设备,每个终端可以作为一个应用项目,但是怎么操作这个终端呢?是个问题,后面要研究一下,这个样的话是不是可以在一个物理设备上完成几个应用的功能呢?比如一个物理节点即是灯光控制器又是温度控制器?好像有可能,恩,一定要研究研究!。
ZigBee树型网络地址分配及结构
树型路由机制包括配置树型地址和树型地址的路由。
当协调器建立一个新的网络,它将给自己分配网络地址0,网络深度d=0。
网络深度表示仅仅采用父子关系的网络中,一个传送帧传送到ZigBee协调器所传递的最小跳数。
如“节点A”加入网络并与协调器连接,那么“节点A”的网络深度是1;“节点B”加入网络并与“节点A”连接,那么“节点B”的网络深度是2,依此类推。
在树簇型网络中,协调器和路由器都可以连接N个路由节点和终端节点做为自己的子节点,形成一个个“簇”。
但是协调器和路由器能连接的子节点的数量是不是无限的呢?
协议栈中,有以下几个参数影响网络拓扑的形态:
Cm(nwkMaxChildren):每个父节点可以连接的子节点的总个数;
Rm(nwkMaxRouters):在Cm中,可以是路由节点的个数,Rm<=Cm;
Lm:网络最大深度,协调器的深度为0。
这三个参数的值在Z-stack中分别由变量CskipChldrn、CskipRtrs、MAX_NODE_DEPTH决定。
这三个变量可以在NWK中的nwk_globals.c 和 nwk_globals.h 两个文件中查找。
地址的分配:
每一个节点加入网络时,都会被分配16位
(未完待续)。
ZigBee地址模式分析我们知道ZigBee设备有两种地址。
一种是64位IEEE地址(物理),即MAC地址,另一种是16位网络地址。
64位地址使全球唯一的地址,设备将在它的生命周期中一直拥有它。
它通常由制造商或者被安装时设置。
这些地址由IEEE来维护和分配。
我们刚买到的调和上的IEEE地址应该是全部的F,我们可以通过TI的软件SmartRF Flash Programmer重新写入一个IEEE地址,这就像我们的PC上的物理地地类似,在全球范围内物理地址是唯一的。
不过在ZigBee设备中我们也可以更改这个地址,其实也就不确保全球唯一了,当然,在PC上也可以通过软件更改物理地址,不过只要在一个局域网中没有两个相同的物理地址,是一样可以连接互联网。
很多学校里的上网帐号就是和物理地址进行绑定的,分配给一台PC上的IP地址,是不可能在另一个PC上使用,除非修改PC的物理地址。
说多了,其实也就是你应该必须保证在你组成的网络中,不可以写入相同的IEEE地址。
16为网络地址是当设备加入网络后由协调器或路由器分配的。
它在网络中是唯一的,用来在网络中鉴别设备和发送数据。
在这个版本的中Z-Stack-1.4.3-1.2.1中,可以看到下面typedef enum{afAddrNotPresent = AddrNotPresent, //绑定afAddr16Bit = Addr16Bit,//短地址afAddrGroup = AddrGroup, //组发送afAddrBroadcast = AddrBroadcast//广播发送} afAddrMode_t;typedef struct{union{uint16 shortAddr;} addr;afAddrMode_t addrMode;byte endPoint;} afAddrType_t;这里的地址模式只有4种,而没有IEEE地址的什么事,不过可以想像,在一个ZigBee网络中,当ZigBee的协调器建立网络成功以后,终端设备或者路由器设备打开电源开关加入网络时,网络成功后协调如何知道它管辖的表具号呢?这时会分配一个16位的短地址,当加入网络时终端会发送一个响应给协调器,协调器的短地址是知道的因为是0x0000,当设备加入成功后,会产生一个ZDO_STATE_CHANGE_EVT事件,这个事件就是设备加入网络成功后,并在网络中的身份确定后产生的一个事件,我们可以在这里处理,一些初始化,比如可以发送终端的短地址,IEEE地址等,这里协调器接收到以后,可以提取出终端的短地址,其实在终端给协调器发送的每个数据包中,都含有其自身的短地址,如下面的结构体当中的afAddrType_t srcAddr;协调器在接收到短地址后,就可以知道自己下面管辖的终端结点,或者路由结点有那些了,协调器提取到的短地址可以存放到一个非易失性的存储器中,这时如果要使用直接地址模式,也就是单播的话,就可以在这个表中查找,当然这要和上位机的软件结合起来,起码应该让用户看到这些短地址,这种短地址再和某种应用中的属性对应起来。
网络地址的分配及获取[转]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).后来在另一本资料上见到一份资料:子节点为父设备的第n个子路由器的短地址分配:Achild =Aparent +(n-1)*Cskip(d)+1,n=1Achild =Aparen +(n-1)*Cskip(d),n>1子节点为父设备的第n个子终端设备的短地址分配:Achild = Aparent + Rm*Cskip(d)+ n下图为Lm=3,Cm=6,Rm=4的网络地址分配示例。
几个有用的关于物理地址和网络地址的函数:得到父节点的网络地址: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 );一般发送消息,使用物理地址和网络地址都可以发送,但最好用网络地址,使用物理地址可能会出现问题。
ZigBee专业术语解释
透传地址:仅在透传模式下有效,指的是数据发送的目的地址。
ZigBee 设备有两种地址类型:64 位的MAC 地址和16 位的网络地址。
设备的64 位的MAC 地址在全球上是唯一的,并且一直使用在设备的整个生命周期。
它通常在出厂时
就已经配置在设备中,这个地址是由IEEE 分配和维护的。
16 位的网络地址通常在设
备加入网络后分配得到的,并且在网络中得到使用。
它在网络中是唯一的。
它在网络
中起到了标识设备和进行发送接收数据的作用。
协调器的分节点网络地址(16位短地址)固定为0。
分节点网络地址:即16位短地址,指的是ZigBee节点的编号。
在同一个ZigBee网络中,不允许出现相同的分节点网络地址,会出现地址冲突问题。
与电脑的ip冲突类似。
厦门四信的ZigBee模块分节点网络地址既支持随机的方式,也支持预配置的方式。
节点处于同一个ZigBee网络的判断条件:同一空间中,如果2个节点的物理信道相同且网络号(PAN ID)相同,则这2个节点处于同一个ZigBee网络中。
ZigBee网络随机地址分配机制研究摘要:ZigBee网络的随机地址分配机制采用随机算法为节点分配地址,其具有逻辑复杂度低、实现方便、无需参数等优点,但同时会造成较大的通讯开销和时间消耗,且未能对重复地址做出有效清理。
对此,本文提出新型随机地址分配算法,能有效地控制通信开销和时间消耗,且能对重复地址信息进行清理。
最后在NS2软件上进行模拟仿真,测试数据证明了新提出的算法的有效性和可行性。
关键词:ZigBee;随机地址分配;地址冲突;NS21引言ZigBee技术是在IEEE802.15.4无线通信协议标准上建立的近距离无线组网通信技术[1][2],具有近距离、自组织、低功耗、低复杂度等特点[3],主要用于近距离低速率电子设备之间的数据传输以及典型的有周期性数据、间歇性数据传输需求的场景[4],包括汽车工业、家庭自动化、遥控遥测、定位系统等领域[5]。
ZigBee技术的地址分配有两种机制,分别是分布式地址分配机制(Distributed Address Assignment Mechanism,简称DAAM)和随机地址分配机制(Stochastic Address Assignment Mechanism,简称SAAM)。
DAAM强调“地址——位置”的对应关系,更确切地说是“子节点地址——父节点地址”的对应关系,该对应关系是树状路由的基础。
而SAAM采用逻辑上更简单的随机方式分配地址,该机制对应的是网状路由。
现有的随机地址分配算法(简称SAAM算法)虽能完成节点的入网地址分配工作,但时间消耗和通信开销较大,对于采用电池供电的ZigBee设备来讲,显然是技术弊端。
因此,本文在深入研究SSAM算法的基础上,提出新型的基于邻居确认的随机地址分配算法(Stochastic Address Assignment Mechanism based on the Confirm of the Neighbors,简称SAAMCN),以降低时间和通信开销,同时对重复地址做出有效清理。
1、PANID:个域网ID号,有效值:0~0xFFFE。
如果为0xFFFF则网络层将选择PANID 供网络使用!?配置文件中为0xFFFF2、扫描的频道,11~26。
(11)3、NLME_GetShortAddr()4、网络形成:/why_question_how/blog/item/c4a8800862f42f20b1351d12.html绑定的应用:/Article/MSP430/ZigBee/201104/33114.html5、第一类是IEEE地址,也叫做扩展地址。
这是一个64位的地址,由设备商固化到设备中,地址由IEEE发配,当然我们现在买到的开发板芯片上的IEEE地址一般应该为全F,这是一个无效地址,就是说这个芯片还没有分配地址拉。
可以用Ti的flash编程软件烧写一个IEEE地址。
6、第二类地址是所谓的网络地址,也就叫做短地址。
这是一个16位的地址,其中有几个特殊的地址:【1】0xFFFF -这是一个对全网络中设备进行广播的广播地址【2】0xFFFD -如果在命令中将目标地址设为这个地址的话那么只对打开了接收的设备进行广播【3】0xFFFC -广播到协调器和路由器【4】0xFFFE -如果目的地址为这个地址的话,那么应用层将不指定目标设备,而是通过协议栈读取绑定表来获得相应目标设备的短地址7、一旦在源节点上建立了绑定,其应用服务即可向目标节点发送数据,而不需指定目标地址了(调用zb_SendDataRequest(),目标地址可用一个无效值0xFFFE代替)。
这样,协议栈将会根据数据包的命令标识符,通过自身的绑定表查找到所对应的目标设备地址。
在绑定表的条目中,有时会有多个目标端点。
这使得协议栈自动地重复发送数据包到绑定表指定的各个目标地址。
同时,如果在编译目标文件时,编译选项NV_RESTORE被打开,协议栈将会把绑定条目保存在非易失性存储器里。
因此当意外重启(或者节点电池耗尽需要更换)等突发情况的发生时,节点能自动恢复到掉电前的工作状态,而不需要用户重新设置绑定服务。
Zigbee组网原理详解1.组网概述组建一个完整的zigbee网状网络包括两个步骤:网络初始化、节点加入网络。
其中节点加入网络又包括两个步骤:通过与协调器连接入网和通过已有父节点入网。
2. 网络初始化预备Zigbee网络的建立是由网络协调器发起的,任何一个zigbee节点要组建一个网络必须要满足以下两点要求:(1)节点是FFD节点,具备zigbee协调器的能力;(2)节点还没有与其他网络连接,当节点已经与其他网络连接时,此节点只能作为该网络的子节点,因为一个zigbee网络中有且只有一个网络协调器。
FFD:Full FuncTIon Device 全功能节点RFD:Reduced FuncTIonDevice 半功能节点3.网络初始化流程3.1 确定网络协调器:首先判断节点是否是FFD节点,接着判断此FFD节点是否在其他网络里或者网络里是否已经存在协调器。
通过主动扫描,发送一个信标请求命令(Beaconrequest command),然后设置一个扫描期限(T_scan_duraTIon),如果在扫描期限内都没有检测到信标,那么就认为FFD在其pos内没有协调器,那么此时就可以建立自己的zigbee网络,并且作为这个网络的协调器不断地产生信标并广播出去。
注意:一个网络里,有且只能有一个协调器(coordinator)。
3.2 进行信道扫描过程。
包括能量扫描和主动扫描两个过程:首先对指定的信道或者默认的信道进行能量检测,以避免可能的干扰。
以递增的方式对所测量的能量值进行信道排序,抛弃那么些能量值超出了可允许能量水平的信道,选择可允许能量水平的信道并标注这些信道是可用信道。
接着进行主动扫描,搜索节点通信半径内的网络信息。
这些信息以信标帧的形式在网络中广播,。
ZigBee地址模式分析 (2010-12-28 16:15)分类:ZigBee 技术学习我们知道ZigBee设备有两种地址。
一种是64位IEEE地址(物理),即MAC地址,另一种是16位网络地址。
64位地址使全球唯一的地址,设备将在它的生命周期中一直拥有它。
它通常由制造商或者被安装时设置。
这些地址由IEEE来维护和分配。
我们刚买到的调和上的IEEE地址应该是全部的F,我们可以通过TI的软件SmartRF Flash Programmer重新写入一个IEEE地址,这就像我们的PC上的物理地地类似,在全球范围内物理地址是唯一的。
不过在ZigBee设备中我们也可以更改这个地址,其实也就不确保全球唯一了,当然,在PC上也可以通过软件更改物理地址,不过只要在一个局域网中没有两个相同的物理地址,是一样可以连接互联网。
很多学校里的上网帐号就是和物理地址进行绑定的,分配给一台PC上的IP地址,是不可能在另一个PC上使用,除非修改PC的物理地址。
说多了,其实也就是你应该必须保证在你组成的网络中,不可以写入相同的IEEE地址。
16为网络地址是当设备加入网络后由协调器或路由器分配的。
它在网络中是唯一的,用来在网络中鉴别设备和发送数据。
在这个版本的中Z-Stack-1.4.3-1.2.1中,可以看到下面typedef enum{afAddrNotPresent = AddrNotPresent, //绑定afAddr16Bit = Addr16Bit, //短地址afAddrGroup = AddrGroup, //组发送afAddrBroadcast = AddrBroadcast //广播发送} afAddrMode_t;typedef struct{union{uint16 shortAddr;} addr;afAddrMode_t addrMode;byte endPoint;} afAddrType_t;这里的地址模式只有4种,而没有IEEE地址的什么事,不过可以想像,在一个ZigBee网络中,当ZigBee的协调器建立网络成功以后,终端设备或者路由器设备打开电源开关加入网络时,网络成功后协调如何知道它管辖的表具号呢?这时会分配一个16位的短地址,当加入网络时终端会发送一个响应给协调器,协调器的短地址是知道的因为是0x0000,当设备加入成功后,会产生一个ZDO_STATE_CHANGE_EVT事件,这个事件就是设备加入网络成功后,并在网络中的身份确定后产生的一个事件,我们可以在这里处理,一些初始化,比如可以发送终端的短地址,IEEE地址等,这里协调器接收到以后,可以提取出终端的短地址,其实在终端给协调器发送的每个数据包中,都含有其自身的短地址,如下面的结构体当中的afAddrType_t srcAddr;协调器在接收到短地址后,就可以知道自己下面管辖的终端结点,或者路由结点有那些了,协调器提取到的短地址可以存放到一个非易失性的存储器中,这时如果要使用直接地址模式,也就是单播的话,就可以在这个表中查找,当然这要和上位机的软件结合起来,起码应该让用户看到这些短地址,这种短地址再和某种应用中的属性对应起来。
不知道这种理解的正确性有多大,更确切的说是在实际中的可行性有多大?typedef struct{osal_event_hdr_t hdr;uint16 groupId;uint16 clusterId;afAddrType_t srcAddr;byte endPoint;byte wasBroadcast;byte LinkQuality;byte SecurityUse;uint32 timestamp;afMSGCommandFormat_t cmd;} afIncomingMSGPacket_t;extern uint8 APSME_LookupNwkAddr( uint8* extAddr, uint16* nwkAddr );参数:nwkAddr -拥有的短地址,用来查找扩展地址。
extAddr -指向扩展地址存放的缓存该函数知道扩展的IEEE地址,得到网络中的短地址,这里就提供了另一种获得终端设备的短地址的方式,可以这个函数,在网上看到的是,用APSME_LookupNwkAddr得到短地址时,只能查找协调器儿子节点,对孙子节点不可访问,对限制了一些应用。
不过,可以用绑定来解决这个问题。
extern uint8 APSME_LookupExtAddr( uint16 nwkAddr, uint8* extAddr );该函数知道网络地址,得到网络中的扩展地址。
上面两个函数是,快速查询(不启动无线查询,而是根据已存储于地址管理器中的网络(物理)地址查询物理(网络)地址):/******************************************************************** ** @fn ZDP_NwkAddrReq** @brief This builds and send a NWK_addr_req message. This* function sends a broadcast message looking for a 16* bit address with a 64 bit address as bait.** @param IEEEAddress - looking for this device* @param SecurityEnable - Security Options** @return afStatus_t*/afStatus_t ZDP_NwkAddrReq( byte *IEEEAddress, byte ReqType,byte StartIndex, byte SecurityEnable )根据已知网络地址查询远程设备物理地址,作为一个广播信息发送给网络中的所有设备:这个函数也是知道IEEE地址,对短地址进行寻找,这个不存在上面所说的限制,/******************************************************************** ** @fn ZDP_IEEEAddrReq** @brief This builds and send a IEEE_addr_req message. This* function sends a unicast message looking for a 64* bit IEEE address with a 16 bit address as bait.** @param ReqType - ZDP_IEEEADDR_REQTYPE_SINGLE or* ZDP_IEEEADDR_REQTYPE_EXTENDED* @param SecurityEnable - Security Options** @return afStatus_t*/afStatus_t ZDP_IEEEAddrReq( uint16 shortAddr, byte ReqType,byte StartIndex, byte SecurityEnable )这个函数,知道短地址,获取网络中的IEEE地址。
这个函数,在绑定时经常会使用,因为在绑定中有两种方式,一种是知道IEEE地址,另一种是未知IEEE地址的绑定。
这里会使用到ZDP_NwkAddrReq()函数。
这两个函数的返回值并不是得到的地址值,而是状态值,返回的地址值应该是存放在了全局变量中,static uint8 ZDP_Buf[ ZDP_BUF_SZ ];static uint8 *ZDP_TmpBuf = ZDP_Buf+1;应该说在一个网络中IEEE地址是可以事先知道的,可以通过TI的软件SmartRF Flash Programmer进行读取,当知道了IEEE地址后我们就可以单播发送到一个指定的终端了。
这样就不需要终端主动上报给协调器了。
应该利用绑定是最灵活的一种方式,不过这种方式在一个网络中具体的应用还有一点模糊,也是下一个要解决的问题。
在Z-Stack-1.4.2--1.1.0中还有这么一个函数#define ZDApp_AutoFindDestination( endPoint )ZDApp_AutoFindDestinationEx( endPoint, (uint8 *)0 )自动寻找目的设备,而在Z-Stack-1.4.3-1.2.1中,这两个函数都已经找不到了。
这里还有另外几个比较特殊的网络地址,0xFFFF -这个一个对全网络中设备进行广播的广播地址0xFFFD -如果在命令中将目标地址设为这个地址的话那么只对打开了接收的设备进行广播0xFFFC -广播到协调器和路由器0xFFFE -如果目的地址为这个地址的话,那么应用层将不指定目标设备,而是通过协议栈读取绑定表来获得相应目标设备的短地址此外的0x0000到0xFFF8都是有效的目的地址。
每一个地址就只是了一个目标设备。
1.单点传送(Unicast)Uicast是标准寻址模式,它将数据包发送给一个已经知道网络地址的网络设备。
将afAddrMode设置为Addr16Bit并且在数据包中携带目标设备地址。
也就是上面说的使用网络短地址进行发送。
这里的关键应该是在网络形成后,如何获得网络中的设备短地址。
2. 间接传送(Indirect)当应用程序不知道数据包的目标设备在哪里的时候使用的模式。
将模式设置为AddrNotPresent并且目标地址没有指定。
取代它的是从发送设备的栈的绑定表中查找目标设备。
这种特点称之为源绑定。
当数据向下发送到达栈中,从绑定表中查找并且使用该目标地址。
这样,数据包将被处理成为一个标准的单点传送数据包。
如果在绑定表中找到多个设备,则向每个设备都发送一个数据包的拷贝。
上一个版本的ZigBee(ZigBee04),有一个选项可以讲绑定表保存在协调器(Coordinator)当中。
发送设备将数据包发送给协调器,协调器查找它栈中的绑定表,然后将数据发送给最终的目标设备。
这个附加的特性叫做协调器绑定(Coordinator Binding)。
这个版本中的绑定有四种方式,在上几篇文章中也有介绍。
绑定的方式应该比使用短地址进行发送来的更灵活一些,TI的几个例子也都已经调试成功,其中有两个例程都是使用的绑定方式。
上面有篇文章也重点分析了两种绑定例子。
其中一种是经过协调器的绑定,一种是不经过协调器的绑定。
3 广播传送(broadcast)当应用程序需要将数据包发送给网络的每一个设备时,使用这种模式。