对于一个应用程序最大有效载荷的大小基于几个因素。MAC层提供了一个有效载荷长度常数102。NWK层需要一个固定头大小,一个有安全的大小和一个没有安全的大小。APS层必须有一个可变的基于变量设置的头大小,包括ZigBee协议版本,KVP的使用和APS帧控制设置等等。最后,用户不必根据前面的要素来计算最大有效载荷大小。AF模块提供一个API,允许用户查询栈的最大有效载荷或者最大传送单元(MTU)。用户调用函数 afDataReqMTU(见af.h文件),该函数将返回MTU或者最大有效载荷大小。
typedef struct {
uint8 kvp;
APSDE_DataReqMTU_t aps;
}afDataReqMTU_t;
uint8 afDataReqMTU( 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-Volatile Memory)
ZigBee设备有许多状态信息需要被存储到非易失性存储空间中,这样能够让设备在意外复位或者断电的情况下复原。否则它将无法重新加入网络或者起到有效作用。
为了启用这个功能,需要包含NV_RESTORE编译选项。注意,在一个真正的ZigBee网络中,这个选项必须始终启用。关闭这个选项的功能也仅仅是在开发阶段使用。
ZDO层负责保存和恢复网络层最重要的信息,包括最基本的网络信息(Network Information Base NIB,管理网络所需要的最基本属性);儿子节点和父亲节点的列表;包含应用程序绑定表。此外,如果使用了安全功能,还要保存类似于帧个数这样信息。
当一个设备复位后重新启动,这类信息恢复到设备当中。如果设备重新启动,这些信息可以使设备重新恢复到网络当中。在ZDAPP_Init中,函数NLME_RestoreFromNV()的调用指示网络层通过保存在NV中的数据重新恢复网络。如果网络所需的NV空间没有建立,这个函数的调用将同时初始化这部分NV空间。
9.6.2 应用的非易失性存储器(Application Non-Volatile Memory)
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)
ZigBee security is built with the AES block cipher and the CCM mode of operation as the 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)
相关推荐: