TI中文支持网
TI专业的中文技术问题搜集分享网站

关于协调器地址管理器AddrMgr满了的一种解决办法。

协调器的地址管理器是3个表的集合:Assoc,Bind,Security。其中第3个只存在于协调器上,这个表的作用是协调器分配密钥。当一个节点通过路由器入网,路由器由于自己不能分配密钥,只能向协调器申请。而协调器的Security表,就是用于解析路由器发送的密钥请求。按照我的理解,Security表中对应的每一个设备,都有一个动态的key值,路由器发送的密钥请求也是加密了的,协调器必须根据这个key去识别路由器的密钥请求。

而AddrMgr的大小定义为

#define NWK_MAX_ADDRESSES (uint16)\( ( NWK_MAX_DEVICES) +\( NWK_MAX_REFLECTOR_ENTRIES ) +\( NWK_MAX_SECURE_PARTNERS))

由于NWK_MAX_SECURE_PARTNERS 等于1,所以AddrMgr表的大小基本上等于AssocList的大小。

协调器在收到任何设备的入网请求后,都会保存Security,所以协调器的AssocList大小基本上就等于网络最大容量。

其实,对于终端节点来说,是不需要保存的。

所以可以加入下面代码

case Device_annce:{ZDO_DeviceAnnce_t devAnnce;ZDO_ParseDeviceAnnce(inMsg, &devAnnce);if(0 == (devAnnce.capabilities & 0x0F)){ZDSecMgrAddrClear(devAnnce.extAddr);}}

即在ZDO消息中,收到终端节点的Device Annce命令,就从Security表中删除。

但是,还有一个问题,路由器用完了协调器的Security表,新的路由器无法分配密钥,但是节点会通过这个路由器入网,怎么办?可以关闭这个路由器的入网功能。

AddrMgrEntry_t addrEntry;addrEntry.user = ADDRMGR_USER_SECURITY;addrEntry.nwkAddr = parent;if(FALSE == AddrMgrEntryLookupNwk(&addrEntry)){zAddrType_t dst;dst.addrMode = afAddr16Bit;dst.addr.shortAddr = parent;ZDP_MgmtPermitJoinReq(&dst,0,FALSE,0);}

在程序中添加这段代码

Viki Shi:

感谢分享:)

gancheng:

如果是这样,那么一个SE使能的网络的容量也太小了吧,如果协调器的关联表满了,设备通过路由入网,这样能分配到密钥吗?

tao feng2:

回复 gancheng:

SE  高级加密 的确会占用内存,安全是要付出代价的 。不过标准加密 也似乎 可以满足要求,请问 标准加密 怎么配置

one Man:

你好,请问为什么说:"所以协调器的AssocList大小基本上就等于网络最大容量"?AssocList这个表的最大容量不是:

NWK_MAX_DEVICES吗?还是说协调器还有另外一个AssocList?,
谢谢!

user4958201:

回复 one Man:

楼上的问题同问啊

赞(0)
未经允许不得转载:TI中文支持网 » 关于协调器地址管理器AddrMgr满了的一种解决办法。
分享到: 更多 (0)