本文件讨论了影响ZigBee Z-Stack 使用和配置的各种全局变量、编译选项和编译器指令。本文件适用于ZigBee Z-Stack 的版本1.4.0。最常见的用于定义一个ZigBee Z-Stack 设备的编译器命令行选项现在可以通过编辑一个叫做f8wConfig.cfg 的配置文件来设置。该文件可以根据使用的Z-Stack平台,在\Projects\zstack\Tools\CC2430DB 或者\Projects\zstack\Tools\CC2420DB 中找到。
1 定义
以下术语用于本文件:
APS – 应用支持子层
MT – 监控测试
NV – 非易失
AES – 高级加密引擎
2 一般考虑
一般来说,应该使用默认设置。除非想要根据自己的应用程序需求调整栈,否则默认设置对大多数应用程序就足够了。
3 全局变量
本节讨论了nwk_globals.c 中的全局变量,用户可以修改这些变量。
应用层
CONST byte apscMaxFrameRetries = APSC_MAX_FRAME_RETRIES;(APSC_MAX_FRAME_RETRIES在f8wConfig.cfg 中)
如果传输信息使用了APS 确认服务,这个变量控制APS 层尝试的重试次数。为了使用APS 确认服务,当调用afDataRequest()函数时,要把AF_ACK_REQUEST 的值传递给tx_options 参数。
安全选项
在nwk_globals.c 中,以下部分描述了安全全局变量。
/********************************************************************** 安全全局变量*/
// 这是默认的预配置密钥,
// 把它修改为一个唯一的密钥
//SEC_KEY_LEN 定义在ssp.h 中。
CONST byte defaultKey[SEC_KEY_LEN] ={//供内部测试使用的密钥0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F}; (DEFAULT_KEY在f8wConfig.cfg 中)
// 如果为真,应为网络上所有设备配置preConfigKey
// 如果为假,仅为协调器配置,并在其它设备加入时发送给该设备byte gPreConfigKeys = FALSE; // TRUE;
// 选择AES引擎
// HARDWARE_AES使用硬件AES引擎(最快的设置)
// SOFTWARE_AES使用软件AES引擎(最慢的设置)
// SW_AES_AND_KEY_EXP使用带有密钥扩展的软件AES(速度提高了,但代价是176字节的数据(RAM))
byte aesEngineSetting = HARDWARE_AES
如果gPreConfigKeys 设置为TRUE,所有设备必须使用相同的预配置安全密钥。如果gPreConfigKeys 设置为FALSE,仅对协调器设备设置预配置密钥,并发送给正在加入的设备。密钥在最后一跳明确发出。如果定义了NV_RESTORE 和NV_INIT 编译选项,在复位时,设备将从NV 存储器中检索预配置密钥。
变量aesEngineSetting 控制AES 加密使用硬件还是软件。默认情况下, 设置为HARDWARE_AES,这在使用安全功能时提供了最高的吞吐量。
4 编译选项
以下编译选项用于调试跟踪和监控测试的目的。
MT_TASK
这个编译选项使得设备可以与Z-Tool PC 应用程序通信,并可以使用debug_str()函数输出最低限度的调试信息。删除它可以节省一些代码和RAM 的使用。
MT_ZDO_FUNC 和其它MT 编译选项
MT_ZDO_FUNC 是编译选项使ZDO 命令可以和Z-Tool 一起使用的一个例子。大多数设备不需要启用所有的监控测试命令。每个ZDO 命令可以在ZDConfig.h 中分别启用。选择性地启用应用程序所需的请求可以使使用的代码达到最少。关于不同MT 编译选项的详细信息见Z-Stack 编译选项文件。
LCD_SUPPORTED
这个选项可以支持显示一个LCD 开发板的调试跟踪信息。在CC2420DB 上,设置LCD_SUPPORTED会发送信息到串行端口(因为它没有LCD 显示器)。启用这个编译选项会占用RAM 很重要的一部分。
LCD_SUPPORTED=DEBUG
在CC2430EB 上,设置LCD_SUPPORTED=DEBUG 会发送信息到LCD 和串行端口,这样代码实际上更大了。在CC2420DB 上,由于没有LCD,调试信息只发送到串行端口,因此比起CC2430EB 同样的设置,使用的代码较少。
BLINK_LEDS
BLINK_LEDS 编译选项可以使用扩展的LED 功能,但代价是额外的代码和RAM 空间。
更多信息见Z-Stack 编译选项文件。
5 编译器指令
以下编译器指令允许适当的时候尽量减少RAM 的使用,或修改不同的用户设
置。
Nwk_globals.h:
NWK_MAX_DEVICE_LIST
这用于为子设备预分配RAM。每修改NWK_MAX_DEVICE_LIST 一位就改变了关联表的18 字节大小。这个设置必须匹配MAX_CHILD_NODES #define,以保证设备有足够的RAM 供子节点最大个数使用。
STACK_PROFILE_ID, MAX_CHILD_NODES, MAX_ROUTER_NODES,MAX_NODE_DEPTH
默认情况下STACK_PROFILE_ID设置为HOME_CONTROLS的栈profile。栈profile ID确定了设置MAX_CHILD_NODES、MAX_ROUTER_NODES、MAX_NODE DEPTH、NWK_MODE,以及其它网络参数。因此,修改栈profile ID将典型的允许用户使用一个#define改变网络拓扑。如果需要定义自己的拓扑,可以使用NETWORK_SPECIFIC栈profile ID 。
MAX_CHILD_NODES指的是一个设备可以有多少个许多子节点。而MAX_ROUTER_NODES指的是路由器子节点(因此区别在于前者指的是终端设备子节点)。
MAX_DEPTH指的是可以有多少连续的父节点-子节点连接,以此作为网络最大规模。
这些必须根据你所希望的网络密集度,以及路由器和终端设备的比例来设置。
MAX_UNRESERVED_RTG_ENTRIES 和MAX_RTG_ENTRIES
MAX_UNRESERVED_RTG_ENTRIES定义了一般情况下可以使用的路由表条目的实际个数。这个参数和MAX_RTG_ENTRIES的区别在于仅在路由修复时使用的条目。在路由请求频繁进行的情况下,用户可以增加未保留条目的个数。路由条目指的是通过某个结点的路由个数。如果所有设备都给一个设备发送数据,就只有一条路由(因为数据只能到达一个目的地)。否则,有几个目的地,就有几条路由。但是所有路由都不经过一个给定设备是不可能的。
MAX_BCAST_ENTRIES (MAX_BCAST 在f8wConfig.cfg 中)
这是在_NIB.BroadcastDeliveryTime(在nwk_globals.c中)期间内可以持有的广播条目(对于数据包而言)的个数。这两个设置一起,确定了广播数据包在网络中传输的过渡时间。例如,如果MAX_BCAST_ENTRIES设置为9,且_NIB.BroadcastDeliveryTime设置为10(秒),设备可以向外发送9个连续的数据包,但是不能向外发送第10个,直到10秒后才能发送。
_NIB.RouteExpiryTime (ROUTE_EXPIRY_TIME
在f8wConfig.cfg 中)这个设置确定了如果一条路由上没有数据传输,在它到期之前所经过的时间,以秒为单位(默认设置为30,意味着建立的路由将从被记录的时间开始,在30秒内到期)。如果路由经常改变(由于路由器设备位置移动或终端设备在网络内移动),就希望旧的路由到期。每次一个数据包通过某条路由,到期时间就重置为这个值。因此,路由仅会在它上面没有数据传输时到期。一条路由到期后,路由表条目将被删除。设置这个值为0就能禁止路由到期。
Nwk_globals.c:
POLL_RATE, QUEUED_POLL_RATE, and RESPONSE_POLL_RATE
这些参数为终端设备控制不同的轮询间隔。这些#defines的详细解释见AN017或AN030。
gMAX_POLL_FAILURE_RETRIES (MAX_POLL_FAILURE_RETRIES
在f8wConfig.cfg中)在表明丢失同步之前,终端设备轮询其父节点的次数。一旦超过了这个阀值,终端设备将尝试执行一个网络重新加入请求(见ZigBee2006规范)。注意更大的值将导致子节点重新加入网络的延迟时间更长。
gREJOIN_POLL_RATE (REJOIN_POLL_RATE
在f8wConfig.cfg中)这用作另一种响应轮询率,仅用于网络重新加入请求。这个轮询率由设备试着加入的父节点的响应时间确定。
gNWK_MAX_DATA_RETRIES (NWK_MAX_DATA_RETRIES 在f8wConfig.cfg 中)
一旦MAC层用完重试(注意MAC层在给网络层返回一个失败状态之前,将重试3次),该语句控制网络层为下一跳信息执行的重试次数。
Cskip数组
Cskip值由栈版本1.4.0的参数MAX_CHILD_NODES、MAX_ROUTER_NODES和MAX_NODE DEPTH自动确定。用户自己不需要修改这个数组。但是需要保证CskipRtrs和CskipChldrn分别匹配MAX_ROUTER_NODES和MAX_CHILD_NODES的设置。
例如如果使用了:
#if ( STACK_PROFILE_ID == HOME_CONTROLS )
byte CskipRtrs[MAX_NODE_DEPTH+1] = {6,6,6,6,6,0};byte CskipChldrn[MAX_NODE_DEPTH+1] = {20,20,20,20,20,0};
MAX_ROUTER_NODES = 6
MAX_CHILD_NODES = 20
MAX_NEIGHBOR_ENTRIES
MAX_NEIGHBOR_ENTRIES用于不是子节点或父节点的邻居节点。这个设置与MAX_ROUTER_NODES无关。这里的值需要在4和8之间,因为它只用于保证网络有足够的连通性。值再大没有好处。
BindingTable.h:
NWK_MAX_BINDING_ENTRIES
这控制绑定表条码的最大数。如果不使用绑定,设置为1,以尽量减少RAM使用。这个值每改变1,绑定表就会改变12字节的大小。
MAX_BINDING_CLUSTER_IDS
这控制每个绑定表条目的簇ID的最大数。如果不使用绑定,设置为1,以尽量减少RAM使用。
ZDApp.c:DEF_PROTO_VERS
从栈版本1.4.0开始,支持ZigBee规范版本1.0和1.1。新的处理器宏
DEF_PROTO_VERS
可以用于控制要加入的网络的默认协议版本。关于协议版本的更多详细信息请参阅AN026。
NWK_START_DELAY (NWK_START_DELAY 在f8wConfig.cfg 中)
这个#define使用户选择在启动网络中的设备之前,等待NWK_START_DELAY毫秒的时间。
ZMain.c:
gZDO_CONFIG_PAN_ID (ZDAPP_CONFIG_PAN_ID 在f8wConfig.cfg 中)
在zMain_NvInit()函数中,PAN ID全局变量gZDO_CONFIG_PAN_ID被初始化。如果不是0xFFFF,协调器将从这个PAN ID启动,路由器和终端设备将加入设置为该ID的PAN。如果定义了NV_INIT编译选项,用户可以从NV存储器中回调这个值。用户可以使用Z-Tool在NV存储器中配置这个值。
nwkDefaultChannelList (DEFAULT_CHANLIST 在f8wConfig.cfg 中)
在zMain_NvInit()函数中,信道列表全局变量nwkDefaultChannelList被初始化为DEFAULT_CHANLIST的设置。用户可以用它配置自己设备支持的信道的列表。