本文将介绍zigbee应用程序中重要的参数与其对应的RAM开销,实际产品开发中,可根据芯片的RAM空间以及性能需求,对各个参数进行调整,已达到节约RAM的目的。
参数名称 | 默认值 | 占用RAM字节 |
---|---|---|
EMBER_PACKET_BUFFER_COUNT | 75 | 40 |
EMBER_NEIGHBOR_TABLE_SIZE | 16 | 18 |
EMBER_APS_UNICAST_MESSAGE_COUNT | 10 | 13 |
EMBER_DISCOVERY_TABLE_SIZE | 4 | 9 |
EMBER_MAX_END_DEVICE_CHILDREN | 6 | 4 |
->EMBER_ADDRESS_TABLE_SIZE | 8 | 10 |
->EMBER_UNICAST_ALARM_DATA_SIZE | 16 | 4 |
->EMBER_UNICAST_ALARM_DATA_SIZE | 0 | 4 |
各个参数,具体介绍如下:
(1)EMBER_PACKET_BUFFER_COUNT
表示协议栈支持发送和接收信息缓存包的最大数量,其作用包括:
a. 转发路由信息:in-transit(routed);
b. 接收信息:incoming messages;
c. 发送信息:outcoming messages(其中包含了父节点准备发给睡眠子节点的信息);
d. 接受和发送碎片化信息(大数据量分多次传输):fragmented message;
e. 为Stack存储临时信息,包括:
–>> currently joined mobile end devices;
–>> stored beacons being considered during a join/rejoin event;
–>> listings of conflicted node IDs;
–>> scan results;
–>> matches for a ZDO End Device Bind request
该参数对于RAM空间影响最大,但同时涉及到众多消息处理,silicon官方建议在不了解各个消息是如何处理的情况下,不要对其进行改动。不过对于em357芯片,官方设置默认值是75(共消耗300个Byte)的原因在于对于Demo程序的RAM是比较充足的。。。即便改成25也是可以的。同时对于zigbee3中设备类型,对于该参数的需求值关系:
Cordinator > Router > End Device
同时,对于网络情况复杂、信息负载重的应用场景,该值需视具体情况要调大。
(2)EMBER_NEIGHBOR_TABLE_SIZE
neighbor table用于存储当前设备一跳范围内的节点信息。当大规模组网时:
调大:更低的路由跳转,利于网络的稳定、低延迟;
调小:更多的路由跳转,更高的网络延迟;
silicon官方建议设置最小为8,最大支持16。
(3)EMBER_APS_UNICAST_MESSAGE_COUNT
在等待MessageSentHandler callback期间,最大能缓存的APS Unicast消息数量。每当协议栈发送一次单播命令时,都会给上层应用层一个反馈,应用层拿到反馈,就是在MessageSentHandler callback期间做处理的。这个数值,在发送消息不频繁的情况,可以适当改小。
(4)EMBER_DISCOVERY_TABLE_SIZE
代表节点可以同时运行的Route Discovery命令的个数。每当执行一次one-to-one discovery,就会在该表中记录一条entry,当该one-to-one discovery发现一条节到目的地的路径时,或者在时间限制内没有发现有效路径,则entry会被删除。当table表满时,节点就不会再发route discovery命令了。对于传感器类的休眠设备,该值设置为1即可。
(5)EMBER_MAX_END_DEVICE_CHILDREN
代表一个Cordinator/Router设备最多可以挂载的end device子节点的数量。对于ember357芯片来说,最大值为64。64作为上限,设计的原因,有以下两点:
1) 存储器RAM容量;
2) Cordinator/Router在接受子节点MAC Data Request(Poll)的时候,会轮询children表内所有的记录,如果在表内,则需相应Mac Ack,而802.15.4协议要求,这个响应时间必须在864ms内完成。因此数值过高,将会导致轮询时间过长,进而引发ack响应失败,子节点离开网络。
Tips:
zigbee要求end device设备定期向父节点进行MAC Data Request,以告知父节点,“我还在线,不要删我!”
EMBER_MAX_END_DEVICE_CHILDREN会影响以下3条,因此以5-1、5-2、5-3表示:
(5-1)EMBER_UNICAST_ALARM_DATA_SIZE
当使用Alarm cluster(0x0009)时,才有意义;
(5-2)EMBER_ADDRESS_TABLE_SIZE
该值包含了address table和trust center cache的总和。
(5-3)EMBER_KEY_TABLE_SIZE
对于Trust Center来说,这个值代表Trust Center Link Key可以存储的数量。对于其他节点来说, 代表了可以存储的Application Link Key数量,而Trust Center Link key则单独存储。
根据以上参数,在应用程序中可以根据自己具体的需要进行参数调整。虽然本文是基于silicon芯片em357,但原理相同,可以类推到其他zigbee芯片供应商的方案中去,当然,前提是他们开放了这些参数接口。
备注:本文使用em357芯片,协议栈版本5.3,参数配置文件如下:
/stack/config/ember-configuration-defaults.h