ZigBee快速入门

2.ZigBee算法

2.1 设备类型(Device Types)数组

在ZigBee网络中存在三种逻辑设备类型:Coordinator(协调器),Router(路由器)和End-Device(终端设备)。ZigBee网络由一个Coordinator以及多个Router和多个End_Device组成。安全

上图是一个简单的ZigBee网络示意图。其中黑色节点为Coordinator,红色节点为Router,白色节点为End-Device。网络

2.1.1Coordinator(协调器)并发

协调器负责启动整个网络。它也是网络的第一个设备。协调器选择一个信道和一个网络ID(也称之为PAN ID,即Personal Area Network ID),随后启动整个网络。app

协调器也能够用来协助创建网络中安全层和应用层的绑定(bindings)。分布式

注意,协调器的角色主要涉及网络的启动和配置。一旦这些都完成后,协调器的工做就像一个路由器(或者消失go away)。因为ZigBee网络自己的分布特性,所以接下来整个网络的操做就不在依赖协调器是否存在。函数

2.1.2Router(路由器)工具

路由器的功能主要是:容许其余设备加入网络,多跳路由和协助它本身的由电池供电的儿子终端设备的通信。oop

一般,路由器但愿是一直处于活动状态,所以它必须使用主电源供电。可是当使用树群这种网络模式时,容许路由间隔必定的周期操做一次,这样就可使用电池给其供电。

2.1.3End-Device(终端设备)

终端设备没有特定的维持网络结构的责任,它能够睡眠或者唤醒,所以它能够能够是一个电池供电设备。

一般,终端设备对存储空间(特别是RAM的须要)比较小。

注意:在Z-Stack 1.4.1中一个设备的类型一般在编译的时候经过编译选项(ZDO_COORDINATOR 和RTR_NWK)肯定。全部的应用例子都提供独立的项目文件来编译每一种设备类型。

2.2 栈配置(Stack Profile)

栈参数的集合须要被配置为必定的值,连同这些值在一块儿被称之为栈配置。ZigBee联盟定义了这些由栈配置组成的栈参数。

网络中的全部设备必须遵循一样的栈配置。

为了促进互用性这个目标,ZigBee联盟为ZigBee2006规范定义了栈配置。全部遵循此栈配置的设备能够在其余开发商开发的遵循一样栈配置的网络中。

3. 寻址(Addressing)

3.1 地址类型(Address types)

ZigBee设备有两种类型的地址。一种是64位IEEE地址,即MAC地址,另外一种是16位网络地址。

64位地址使全球惟一的地址,设备将在它的生命周期中一直拥有它。它一般由制造商或者被安装时设置。这些地址由IEEE来维护和分配。

16为网络地址是当设备加入网络后分配的。它在网络中是惟一的,用来在网络中鉴别设备和发送数据。

3.2 网络地址分配(Network address assignment)

ZigBee使用分布式寻址方案来分配网络地址。这个方案保证在整个网络中全部分配的地址是惟一的。这一点是必须的,由于这样才能保证一个特定的数据包可以发给它指定的设备,而不出现混乱。同时,这个寻址算法自己的分布特性保证设备只能与他的父辈设备通信来接受一个网络地址。不须要整个网络范围内通信的地址分配,这有助于网络的可测量性。

在每一个路由加入网络以前,寻址方案须要知道和配置一些参数。这些参数是MAX_DEPTH,MAX_ROUTERS和MAX_CHILDREN。这些参数是栈配置的一部分,ZigBee2006协议栈已经规定了这些参数的值:MAX_DEPTH = 5,MAX_ROUTERS = 6和MAX_CHILDREN = 20。

MAX_DEPTH决定了网络的最大深度。协调器(Coordinator)位于深度0,它的儿子位于深度1,他的儿子的的儿子位于深度2,以此类推。MAX_DEPTH参数限制了网络在物理上的长度。

MAX_CHILDREN决定了一个路由(Router)或者一个协调器节点能够处理的儿子节点的最大个数。

MAX_ROUTER决定了一个路由(Router)或者一个协调器(Coordinator)节点能够处理的具备路由功能的儿子节点的最大个数。这个参数是MAX_CHILDREN的一个子集,终端节点使用(MAX_CHILDREN – MAX_ROUTER)剩下的地址空间。

若是开发人员想改变这些值,则须要完成如下几个步骤:

首先,你要保证这些参数新的赋值要合法。即,整个地址空间不能超过216,这就限制了参数可以设置的最大值。可使用projects\ZStack\tools文件夹下的CSkip.xls文件来确认这些值是否合法。当在表格中输入了这些数据后,若是你的数据不合法的话就会出现错误信息。

当选择了合法的数据后,开发人员还要保证再也不使用标准的栈配置,取而代之的是网络自定义栈配置(例如:在nwk_globals.h文件中将STACK_PROFILE_ID改成NETWORK_SPECIFIC)。而后nwk_globals.h文件中的MAX_DEPTH参数将被设置为合适的值。

此外,还必须设置nwk_globals.c文件中的Cskipchldrn数组和CskipRtrs数组。这些数组的值由MAX_CHILDREN和MAX_ROUTER构成。

3.3Z-Stack寻址(Addressing in z-stack)

为了向一个在ZigBee网络中的设备发送数据,应用程序一般使用AF_DataRequest()函数。数据包将要发送给一个afAddrType_t(在ZComDef.h中定义)类型的目标设备。

typedefstruct

{

union

{

uint16shortAddr;

}addr;

afAddrMode_taddrMode;

byteendPoint;

}afAddrType_t;

注意,除了网路地址以外,还要指定地址模式参数。目的地址模式能够设置为如下几个值:

typedefenum

{

afAddrNotPresent= AddrNotPresent,

afAddr16Bit= Addr16Bit,

afAddrGroup= AddrGroup,

afAddrBroadcast= AddrBroadcast

}afAddrMode_t;

由于在Zigbee中,数据包能够单点传送(unicast),多点传送(multicast)或者广播传送,因此必须有地址模式参数。一个单点传送数据包只发送给一个设备,多点传送数据包则要传送给一组设备,而广播数据包则要发送给整个网络的全部节点。这个将在下面详细解释。

3.3.1 单点传送(Unicast)

Uicast是标准寻址模式,它将数据包发送给一个已经知道网络地址的网络设备。将afAddrMode设置为Addr16Bit而且在数据包中携带目标设备地址。

3.3.2 间接传送(Indirect)

当应用程序不知道数据包的目标设备在哪里的时候使用的模式。将模式设置为AddrNotPresent而且目标地址没有指定。取代它的是从发送设备的栈的绑定表中查找目标设备。这种特色称之为源绑定。

当数据向下发送到达栈中,从绑定表中查找而且使用该目标地址。这样,数据包将被处理成为一个标准的单点传送数据包。若是在绑定表中找到多个设备,则向每一个设备都发送一个数据包的拷贝。

上一个版本的ZigBee(ZigBee04),有一个选项能够讲绑定表保存在协调器(Coordinator)当中。发送设备将数据包发送给协调器,协调器查找它栈中的绑定表,而后将数据发送给最终的目标设备。这个附加的特性叫作协调器绑定(Coordinator Binding)。

3.3.3 广播传送(broadcast)

当应用程序须要将数据包发送给网络的每个设备时,使用这种模式。地址模式设置为AddrBroadcast。目标地址能够设置为下面广播地址的一种:

NWK_BROADCAST_SHORTADDR_DEVALL(0xFFFF)——数据包将被传送到网络上的全部设备,包括睡眠中的设备。对于睡眠中的设备,数据包将被保留在其父亲节点直到查询到它,或者消息超时(NWK_INDIRECT_MSG_TIMEOUT在f8wConifg.cfg中)。

NWK_BROADCAST_SHORTADDR_DEVRXON(0xFFFD)——数据包将被传送到网络上的全部在空闲时打开接收的设备(RXONWHENIDLE),也就是说,除了睡眠中的全部设备。

NWK_BROADCAST_SHORTADDR_DEVZCZR(0xFFFC)——数据包发送给全部的路由器,包括协调器。

3.3.4 组寻址(Group Addressing)

当应用程序须要将数据包发送给网络上的一组设备时,使用该模式。地址模式设置为afAddrGroup而且addr.shortAddr设置为组ID。

在使用这个功能呢以前,必须在网络中定义组。(参见Z-stack API文档中的aps_AddGroup()函数)。

注意组能够用来关联间接寻址。再绑定表中找到的目标地址多是是单点传送或者是一个组地址。另外,广播发送能够看作是一个组寻址的特例。

下面的代码是一个设备怎样加入到一个ID为1的组当中:

aps_Group_tgroup;

//Assign yourself to group 1

group.ID= 0x0001;

group.name[0]= 0; // This could be a human readable string

aps_AddGroup(SAMPLEAPP_ENDPOINT, &group );

3.4 重要设备地址(Important Device Adresses)

应用程序可能须要知道它的设备地址和父亲地址。使用下面的函数获取设备地址(在ZStack API中定义):

lNLME_GetShortAddr()——返回本设备的16位网络地址

lNLME_GetExtAddr()—— 返回本设备的64位扩展地址

使用下面的函数获取该设备的父亲设备的地址:

lNLME_GetCoordShortAddr()——返回本设备的父亲设备的16位网络地址

lNLME_GetCoordExtAddr()—— 返回本设备的父亲设备的64位扩展地址

4. 绑定(Binding)

绑定是一种两个(或者多个)应用设备之间信息流的控制机制。在ZigBee2006发布版本中,它被称为资源绑定,全部的设备都必须执行绑定机制。

绑定容许应用程序发送一个数据包而不须要知道目标地址。APS层从它的绑定表中肯定目标地址,而后将数据继续向目标应用或者目标组发送。

注意:在ZigBee的1.0版本中,绑定表是保存在协调器(Coordinator当中)。如今全部的绑定记录都保存在发送信息的设备当中。

4.1 创建绑定表(Building a Binding Table)

有三种方法能够创建一个绑定表:

lZigbee Device Object Bind Request——一个启动工具能够告诉设备建立一个绑定记录

lZigbee Device Object End Device Bind Request——两个设备能够告诉协调器它们想要创建一个绑定表记录。协调器来协调并在两个设备中建立绑定表记录。

lDevice Application——一个设备上的应用程序创建或者管理一个绑定表

4.1.1ZigBee Device Object Binding Request

任何一个设备均可以发送一个ZDO信息给网络中的另外一个设备,用来创建绑定表。称之为援助绑定,它能够为一个发送设备建立一个绑定记录。

4.1.1.1启动申请(The CommissioningApplication)

一个应用程序能够经过ZDP_BindReq()函数(在ZDProfile.h),并在绑定表中包含两个请求(地址和终点)以及想要的群ID。第一个参数(目标dstAddr)是绑定源的短地址即,16位网络地址。

肯定你已经在ZDConfig.h容许了这个功能(ZDO_BIND_UNBIND_REQUEST)。

你也可使用ZDP_UnbindReq()用一样的参数取消绑定记录。

目标设备发回ZigBee Device Object Bind 或者Unbind Response信息,该信息是ZDO代码根据动做的状态,经过调用ZDApp_BindRsq()或者ZDApp_UnbindRsq()函数来分析和通知ZDApp.c的。

对于绑定响应,从协调器返回的状态将是ZDP_SUCCESS,ZDP_TABLE_FULL或者ZDP_NOT_SUPPORTED。

对于解除绑定响应,从协调器返回的状态将是ZDP_SUCCESS,ZDP_NO_ENTRY或者ZDP_NOT_SUPPORTED。

4.1.1.2ZigBee Device Object End Device Bind Request

这个机制是在指定的时间周期(timeout period)内,经过按下选定设备上的按钮或者相似的动做来绑定。协调器在指定的时间周期内,搜集终端设备的绑定请求信息,而后以配置ID(Profile ID)和群ID(Cluster ID)协议为基础,建立一个绑定表记录做为结果。默认的设备绑定时间周期(APS_DEFAULT_MAXBINDING_TIME)是16秒钟(在nwk_globals.h中定义)。可是将它添加到f8wConfig.cfg中,则能够更改。

在“用户指南”中的应用程序就是一个终端设备绑定的例子(在每一个设备上按下SW2按键)。

你应该注意到,全部的例程都有处理关键事件的函数(例如:在TransmitApp.c中的TransmitApp_HandleKeys()函数)。这个函数调用ZDApp_SendEndDeviceBindReq()(在ZDApp.c中)。这个函数搜集全部终端节点的请求信息,而后调用ZDP_EndDeviceBindReq()函数将这些信息发送给协调器。

协调器调用函数ZDP_IncomingData()【ZDProfile.c中】函数接收这些信息,而后再调用ZDApp_ProcessEndDeviceBindReq()【ZDObject.c中】函数分析这些信息,最后调用ZDApp_EndDeviceBindReqCB【ZDApp.c中】函数,这个函数再调用ZDO_MatchEndDeviceBind()【ZDObject.c中】函数来处理这个请求。

当收到两个匹配的终端设备绑定请求,协调器在请求设备中启动建立源绑定记录的进程。假设在ZDO终端设备中发现了匹配的请求,协调器将执行下面的步骤:

l 发送一个解除绑定请求给第一个设备。这个终端设备锁定进程,这样解除绑定被首先发送来去掉一个已经存在的绑定记录。

l 等待ZDO解除绑定的响应,若是响应的状态是ZDP_NO_ENTRY,则发送一个ZDO绑定请求在源设备中建立一个绑定记录。若是状态是ZDP_SUCCESS,则继续前进到第一个设备的群ID。

l 等待ZDO绑定响应,若是收到了,则继续前进到第一个设备的下一个群ID。

l 当地一个设备完成后,用一样的方法处理第二个设备。

l 当第二个设备也完成以后,发送ZDO 终端设备绑定请求消息给两个设备。

4.1.1.3Device Application Binding Manager

另外一种进入设备绑定记录的方式是应用本身管理绑定表。这就意味着应用程序须要经过调用下面的绑定管理函数在本地进入而且删除绑定记录:

lbindAddEntry()——在绑定表中增长一个记录

lbindRemoveEntry()——从绑定表中删除一个记录

lbindRomoveClusterIdFromList()——从一个存在的绑定表记录中删除一个群ID

lbindAddClusterIdToList()——向一个已经存在的绑定记录中增长一个群ID

lbindRemoveDev()——删除全部地址引用的记录

lbindRemoveSrcDev()——删除全部源地址引用的记录

lbindUpdateAddr()——将记录更新为另外一个地址

lbindFindExisting()——查找一个绑定表记录

lbindIsClusterIdInList()——在表记录中检查一个已经存在的群ID

lbindNumBoundTo()——拥有相同地址(源或者目的)的记录的个数

lbindNumEntries()——表中记录的个数

lbindCapacity()——最多容许的记录个数

lbindWriteNV()——在NV中更新表

4.1.2 配置源绑定(Configuring Source Binding)

为了在你的设备中使能源绑定在f8wConfig.cfg文件中包含REFLECTOR编译标志。同时在f8wConfig.cfg文件中查看配置项目NWK_MAX_BINDING_ENTRIES和MAX_BINDING_CLUSTER_IDS。NWK_MAX_BINDING_ENTRIES是限制绑定表中的记录的最大个数,MAX_BINDING_CLUSTER_IDS是每一个绑定记录的群ID的最大个数。

绑定表在静态RAM中(未分配),所以绑定表中记录的个数,每条记录中群ID的个数都实际影响着使用RAM的数量。每一条绑定记录是8字节多(MAX_BINDING_CLUSTER_IDS * 2字节)。除了绑定表使用的静态RAM的数量,绑定配置项目也影响地址管理器中的记录的个数。

5. 路由(Routing)

5.1 概述(Overview)

A meshnetwork is described as a network in which the routing of messages is performedas a decentralized,cooperative process involving many peer devices routingon each others’ behalf.

路由对与应用层来讲是彻底透明的。应用程序只需简单的向下发送去往任何设备的数据到栈中,栈会负责寻找路径。这种方法,应用程序不知道操做是在一个多跳的网络当中的。

路由还可以自愈ZigBee网络,若是某个无线链接断开了,路由功能又能自动寻找一条新的路径避开那个断开的网络链接。这就极大的提升了网络的可靠性,同时也是ZigBee网络的一个关键特性。

5.2 路由协议(Routing Protocol)

ZigBee执行基于用于AODV专用网络的路由协议。简化后用于传感器网络。ZigBee路由协议有助于网络环境有能力支持移动节点,链接失败和数据包丢失。

当路由器从他自身的应用程序或者别的设备那里收到一个单点发送的数据包,则网络层(NWK Layer)根据一下程序将它继续传递下去。若是目标节点是它相邻路由器中的一个,则数据包直接被传送给目标设备。不然,路由器将要检索它的路由表中与所要传送的数据包的目标地址相符合的记录。若是存在与目标地址相符合的活动路由记录,则数据包将被发送到存储在记录中的下一级地址中去。若是没有发现任何相关的路由记录,则路由器发起路径寻找,数据包存储在缓冲区中知道路径寻找结束。

ZigBee终端节点不执行任何路由功能。终端节点要向任何一个设备传送数据包,它只需简单的将数据向上发送给它的父亲设备,由它的父亲设备以它本身的名义执行路由。一样的,任何一个设备要给终端节点发送数据,发起路由寻找,终端节的的父亲节点都已它的名义来回应。

注意ZigBee地址分配方案使得对于任何一个目标设备,根据它的地址均可以获得一条路径。在Z-Stack中,若是万一正常的路径寻找过程不能启动的话(一般因为缺乏路由表空间),那么Z-Stack拥有自动回退机制。

此外,在Z-Stack中,执行的路由已经优化了路由表记录。一般,每个目标设备都须要一条路由表记录。可是,经过把必定父亲节点记录与其子全部子结点的记录合并,这样既能够优化路径也能够不丧失任何功能。

ZigBee路由器,包括协调器执行下面的路由函数:(i)路径发现和选择;(ii)路径保持维护;(iii)路径期满。

5.2.1 路径的发现和选择(Route Discovery andSelection)

路径发现是网络设备凭借网络相互协做发现和创建路径的一个过程。路由发现能够由任意一个路由设备发起,而且对于某个特定的目标设备一直执行。路径发现机制寻找源地址和目标地址之间的全部路径,而且试图选择可能的最好的路径。

路径选择就是选择出可能的最小成本的路径。每个结点一般持有跟它全部邻接点的“链接成本(link costs)”。一般,链接成本的典型函数是接收到的信号的强度。沿着路径,求出全部链接的链接成本总和,即可以获得整个路径的“路径成本”。路由算法试图寻找到拥有最小路径成本的路径。

路径经过一系列的请求和回复数据包被发现。源设备经过向它的全部邻接节点广播一个路由请求数据包,来请求一个目标地址的路径。当一个节点接收到RREQ数据包,它依次转发RREQ数据包。可是在转发以前,它要加上最新的链接成本,而后更新RREQ数据包中的成本值。这样,沿着全部它经过的链接,RREQ数据包携带着链接成本的总和。这个过程一直持续到RREQ数据包到达目标设备。经过不一样的路由器,许多RREQ副本都将到达目标设备。目标设备选择最好的RREQ数据包,而后发回一个路径答复数据包(a Route Reply)RREP给源设备。

RREP数据包是一个单点发送数据包,它沿着中间节点的相反路径传送直到它到达原来发送请求的节点为止。

一旦一条路径被建立,数据包就能够发送了。当一个结点与它的下一级相邻节点失去了链接(当它发送数据时,没有收到MAC ACK),该节点向全部等待接收它的RREQ数据包的节点发送一个RERR数据包,将它的路径设为无效。各个结点根据收到的数据包RREQ、RREP或者RERR来更新它的路由表。

5.2.2 路径保持维护(Route maintenance)

网状网提供路径维护和网络自愈功能。中间节点沿着链接跟踪传送失败,若是一个链接被认定是坏链,那么上游节点将针对全部使用这条链接的路径启动路径修复。节点发起从新发现直到下一次数据包到达该节点,标志路径修复完成。若是不可以启动路径发现或者因为某种缘由失败了,节点则向数据包的源节点发送一个路径错误包(RERR),它将负责启动新路径的发现。这两种方法,路径都自动重建。

5.2.3 路径期满(Route expiry)

路由表为已经创建链接路径的节点维护路径记录。若是在必定的时间周期内,没有数据经过沿着这条路径发送,这条路径将被表示为期满。期满的路径一直保留到它所占用的空间要被使用为止。这样,路径在绝对不使用以前不会被删除掉的。在配置文件f8wConfig.cfg文件中配置自动路径期满时间。设置ROUTE_EXPIRY_TIME为期满时间,单位为秒。若是设置为0,则表示关闭自动期满功能。

5.3 表存储(Table storage)

路由功能须要路由器保持维护一些表格。

5.3.1 路由表(Routing table)

每个路由器包括协调器都包含一个路由表。设备在路由表中保存数据包参与路由所需的信息。每一条路由表记录都包含有目的地址,下一级节点和链接状态。全部的数据包都经过相邻的一级节点发送到目的地址。一样,为了回收路由表空间,能够终止路由表中的那些已经无用的路径记录。

路由表的容量代表一个设备路由表拥有一个自由路由表记录或者说它已经有一个与目标地址相关的路由表记录。在文件“f8wConfig.cfg”文件中配置路由表的大小。将MAX_RTG_ENTRIES设置为表的大小(不能小于4)。

5.3.2 路径发现表(Route discovery table)

路由器设备致力于路径发现,保持维护路径发现表。这个表用来保存路径发现过程当中的临时信息。这些记录只在路径发现操做期间存在。一旦某个记录到期,则它能够被另外一个路径发现使用。这个值决定了在一个网络中,能够同时并发执行的路径发现的最大个数。这个能够在f8wConfig.cfg文件中配置MAX_ RREQ_ENTRIES。

5.4 路径设置快速参考(Routing Settings Quickreference)

设置路由表大小

MAX_RTG_ENTRIES,这个值不能小于4 (f8wConfig.cfg文件)

设置路径期满时间

ROUTE_EXPIRY_TIME,单位秒。设置为零则关闭路径期满(f8wConfig.cfg文件)

设置路径发现表大小

MAX_RREQ_ENTRIES,网络中能够同时执行的路径发现操做的个数

6. ZDO消息请求(ZDO Message requests)

ZDO模块提供功能用来发送ZDO服务发现请求消息,接收ZDO服务发现回复消息。下图描述了应用程序发送IEEE 地址请求和接收IEEE地址回复的函数调用。

ZDOIEEE地址请求及应答

下面这个例子,一个应用程序想知道何时一个新的设备加入网络。一个应用想要接收全部ZDO设备的通知信息。

ZDODevice Announce delivered to an application

7. 便携式设备(Portable Devices)

在ZigBee2006中终端节点就是便携式的设备。这就意味着当一个终端节点没有侦听到它的父节点回应(超出范围或者没法胜任),它将试着从新加入网络(加入到另外一个新的父亲节点)。没有设置或者编译标志位来设置这个选项。

终端节点经过巡检(MAC 数据请求)失败或者经过数据消息失败侦听它的父亲节点都没有回应。MAX_POLL_FAILURE_RETRIES用来控制失败的敏感度。这个值能够在f8wConfig.cfg文件中修改。而且,这个值越大敏感度就越低,从新加入网络须要的时间就更长。

当网络层侦测到它的父亲节点没有回应,它将调用ZDO_SynIndicationCB()函数,这个函数将启动从新加入。从新加入过程首先对已有的父亲节点进行孤儿扫描(orphan-scan),而后扫描潜在的父亲节点而且跟它的潜在父节点加入网络。

在一个安全网络中,假设设备都拥有一个钥匙,新的钥匙不用在分发给设备。

8. 端到端确认(End-to-end acknowledgements)

对于非广播消息,有两种基本的消息重试类型:端到端的确认(APS ACK)和单级确认(single hop acknowledgement)(MACACK)。MAC ACK默认状况下是一直打开的,一般可以充分保证网络的高可靠性。为了提供附加的可靠性,同时使发送设备可以获得数据包已经被发送到目的地的确认,可使用APS ACK。

APSacknowledgement在APS层完成,是从目标设备到源设备的一个消息确认系统。源设备将保留这个消息知道目标设备发送一个APS ACK消息代表它已经收到了消息。对于每一个发出的消息能够经过调用函数AF_DataRequest()的选项来使能/禁止来禁止这个功能。这个选项区域是一个位映射选项,对于将要发送的消息的选项区域或上(OR)AF_ACK_REQUEST就可使能APS ACK。消息重试(若是APS ACK消息没有收到)的次数和重试之间的时间间隔的配置项在f8wConfig.cfg文件中。APSC_MAX_FRAME_RETRIES是APS层在放弃发送数据以前,没有收到APS ACK确认从新发送消息的次数。APSC_ACK_WAIT_DURATION_POLLED是从新发送之间的时间间隔。

9. 其余(Miscellaneous)

9.1 配置信道(Configuring channel)

每个设备都必须有一个DEFAULT_CHANLIST来控制信道集合。对于一个ZigBee协调起来讲,这个表格用来扫描噪音最小的信道。对于终端节点和路由器几点来讲,这个列表用来扫描并加入一个存在的网络。

9.2 配置PAN ID和要加入的网络(Configuring PAN ID andnetwork to join)

这个可选配置项用来控制ZigBee路由器和终端节点要加入那个网络。文件f8wConfg.cfg中的ZDO_CONFIG_PAN_ID参数能够设置为一个0~0x3FFF之间的一个值。协调器使用这个值,做为它要启动的网络的PAN ID。而对于路由器节点和终端节点来讲只要加入一个已经用这个参数配置了PAN ID的网络。若是要关闭这个功能,只要将这个参数设置为0xFFFF。

要更进一步控制加入过程,须要修改ZDApp.c文件中的ZDO_NetworkDiscoveryConfirmCB函数。

9.3 最大有效载荷大小(Maximum payload size)

对于一个应用程序最大有效载荷的大小基于几个因素。MAC层提供了一个有效载荷长度常数102。NWK层须要一个固定头大小,一个有安全的大小和一个没有安全的大小。APS层必须有一个可变的基于变量设置的头大小,包括ZigBee协议版本,KVP的使用和APS帧控制设置等等。最后,用户没必要根据前面的要素来计算最大有效载荷大小。AF模块提供一个API,容许用户查询栈的最大有效载荷或者最大传送单元(MTU)。用户调用函数afDataReqMTU(见af.h文件),该函数将返回MTU或者最大有效载荷大小。

typedefstruct

{

uint8kvp;

APSDE_DataReqMTU_taps;

}afDataReqMTU_t;

uint8afDataReqMTU( afDataReqMTU_t* fields )

一般afDataReqMTU_t结构只须要设置kvp的值,这个值代表KVP是否被使用。而aps保留。

9.4 离开网络(Leave Network)

ZDO管理器执行函数“ZDO_ProcessMgmtLeaveReq”,这个函数提供对“NLME-LEAVE.request”原语的访问。“NLME-LEAVE.request”原语设备移除它自身或者它的一个儿子设备。ZDO_ProcessMgmtLeaveReq根据提供给它的IEEE地址移除设备。若是设备要移除它本身,它需等待大约5秒钟而后复位。一旦设备复位它将从新回来,并处于空闲模式。它将不在试图链接或者加入网络。若是设备要移除它的儿子设备,它将从本地的群从表(accociation table)中删除该设备。只有在它的儿子设备是个终端节点的状况下,NWK地址才会被从新使用。若是儿子节点是个路由器设备,NWK地址将再也不使用。

若是一个儿子节点的父亲节点离开了网络,儿子节点依然存在于网络。

尽管“NLME-LEAVE.request”原语提供了一些可选参数,可是ZigBee2006(TI当前的应用也同样)却限制了这些参数的使用。如今,在ZDO_ProcessMgmtLeaveReq函数中使用的可选参数(“RemoveChildren”、“Rejion”and “Silent”)都应该使用默认值。若是改变这些值,将会发生不可预料的结果。

9.5 描述符(Descriptors)

ZigBee网络中的全部设备都有一个描述符,用来描述设备类型和它的应用。这个信息能够被网络中的其余设备获取。

配置项在文件ZDOConfig.h和ZDOConfig.c中定义和建立。这两个文件还包含节点,电源描述符和默认用户描述符。确认改变这些描述符来定义你的网络。

9.6 非易失性存储项(Non-volatile Memory Items)

9.6.1 网络层非易失性存储器(Network Layer Non-VolatileMemory)

ZigBee设备有许多状态信息须要被存储到非易失性存储空间中,这样可以让设备在乎外复位或者断电的状况下复原。不然它将没法从新加入网络或者起到有效做用。

为了启用这个功能,须要包含NV_RESTORE编译选项。注意,在一个真正的ZigBee网络中,这个选项必须始终启用。关闭这个选项的功能也仅仅是在开发阶段使用。

ZDO层负责保存和恢复网络层最重要的信息,包括最基本的网络信息(Network Information Base NIB,管理网络所须要的最基本属性);儿子节点和父亲节点的列表;包含应用程序绑定表。此外,若是使用了安全功能,还要保存相似于帧个数这样信息。

当一个设备复位后从新启动,这类信息恢复到设备当中。若是设备从新启动,这些信息可使设备从新恢复到网络当中。在ZDAPP_Init中,函数NLME_RestoreFromNV()的调用指示网络层经过保存在NV中的数据从新恢复网络。若是网络所需的NV空间没有创建,这个函数的调用将同时初始化这部分NV空间。

9.6.2 应用的非易失性存储器(Application Non-VolatileMemory)

NV一样能够用来保存应用程序的特定信息,用户描述符就是一个很好的例子。NV中用户描述符ID项是ZDO_NV_USERDESC(在ZComDef.h中定义)。

在ZDApp_Init()函数中,调用函数osal_nv_item_init()来初始化用户描述符所须要的NV空间。若是这个针对这个NV项,这个函数是第一次调用,这个初始化函数将为用户描述符保留空间,而且将它设置为默认值ZDO_DefaultUserDescriptor。

当须要使用保存在NV中的用户描述符时,就像ZDO_ProcessUserDescReq()(在ZDObject.c中)函数同样,调用osal_nv_read()函数从NV中获取用户描述符。

若是要更新NV中的用户描述符,就像ZDO_ProcessUserDescSet()(在ZDObject.c中)函数同样,调用osal_nv_write()函数更新NV中的用户描述符。

记住:NV中的项都是独一无二的。若是用户应用程序要建立本身的NV项,那么必须从应用值范围0x0201~0x0FFF中选择ID。

10. 安全(Security)

10.1 概述(Overview)

ZigBeesecurity is built with the AES block cipher and the CCM mode of operation asthe underlying security primitive。AES/CCM安全算法是ZigBee联盟之外的研究人员发明的,而且普遍应用于其余通信协议之中。

ZigBee提供以下的安全特性:

l 构造安全 (Infrastructure security)

l 网络访问控制(Network access control)

l 应用数据安全

10.2 配置(Configuration)

为了拥有一个安全的网络,首先全部的设备镜像的建立,必须将预处理标志位SECURE都置为1。在文件“f8wConfig.cfg”文件中能够找到。

接下来,必须选择一个默认的密码。这个能够经过“f8wConfig.cfg”文件中的DEFAULT_KEY来设置。理论上,这个值设置为一个随机的128位数据。

这个默认的密码能够预先配置到网络上的每一个设备或者只配置到协调器上,而后分发给假如网络的全部设备。这个能够经过文件“nwk_globals.c”文件的gPreConfigKeys选项来配置。若是这个值为真,那么默认的密码将被预先配置到每个网络设备上。若是这个值为假,那么默认的密码只需配置到协调器设备当中。注意,在之后的场合,这个密码将被分发到每个加入网络当中的设备。所以,加入网络期间成为“瞬间的弱点”,竞争对手能够经过侦听获取密码,从而下降了网络的安全性能。

10.3 网络访问控制(Network access control)

在一个安全的网络中,当一个设备加入网络时会被告知一个信任中心(协调器)。协调器拥有容许设备保留在网络或者拒绝网络访问这个设备的选择权。

信任中心能够经过任何逻辑方法决定一个设备是否容许进入这个网络中。其中一种就是信任中心只容许一个设备在很短的窗口时间加入网络。这个时可能的,举例说明,若是一个信任中心设备有一个“push”按键。当按键按下,在这个很短的时间窗口中,它容许任何设备加入网络。不然全部的加入请求都将被拒绝。以他们的IEEE地址为基础,一个秒级的时间段将被配置在信任中心用来接收或者拒绝设备。

这种类型的策略能够经过修改ZDSeeMgr.c模块中的ZDSecMgrDeviceValidate()函数来实现。

10.4 更新密码(Key Updates)

信任中心能够根据本身的判断更新通用网络密码。应用程序开发人员修改网络密码更新策略。默认信任中心执行可以用来符合开发人员的指定策略。一个样例策略将按照必定的间隔周期更新网络密码。另一种将根据用户输入来更新网络密码。ZDO安全管理器(ZDSecMgr.c)API经过 “ZDSecMgrUpdateNwkKey”和“ZDSecMgrSwitchNwkKey”提供必要的功能。“ZDSecMgrUpdateNwkKey”容许信任中心向网络中的全部设备广播新的网络密码,此时,新的网络密码将被做为替代密码保存在全部网络设备中。一旦信任中心调用“ZDSecMgrSwitchNwkKey”,一个全网范围的广播将触发全部的网络设备使用替代密码。

10.5 快速参考(Quick Reference)

使能安全(Enabling Security)

SECURE = 1(f8wConfig.cfg)

使能预配置网络密码(Enabling Preconfig Network Key)

gPreConfigKeys = TRUE(nwk_globals.c)

设置预配置网络密码(Setting Preconfig Network Key)

设置defautlKey = {KEY}(ZDSecMgr.c)

使能/禁止信任中心的加入许可功能(Enabling/Disabling joining permission on the Trust Center)

调用函数ZDSecMgrPermitJoining()(ZDSecMgr.c)

加入期间特定设备批准(Specific device validation during joining)

修改ZDSecMgrDeviceValidate(ZDSecMgr.c)

网络密码更新(Network key updates)

调用ZDSecMgrUpdateNwkKey()和ZDSecMgrSwitchNwkKEy()函数(ZDSecMgr.c)

相关文章
相关标签/搜索