This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

关于AddrMsgIsFull()方法的问题



不管程序中设置的NWK_MAX_DEVICES值为多少,就算实际终端设备超过了这个数量,协调器执行AddrMsgIsFull()结果依然为FALSE,求指导。

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

    而AddrMgr的大小定义为

    1
    2
    3
    4
    #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大小基本上就等于网络最大容量。

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

    所以可以加入下面代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    case Device_annce:
        {
            ZDO_DeviceAnnce_t devAnnce;
            ZDO_ParseDeviceAnnce(inMsg, &devAnnce);
            if(0 == (devAnnce.capabilities & 0x0F))
            {
                ZDSecMgrAddrClear(devAnnce.extAddr);
            }
        }

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

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

    参考:http://www.deyisupport.com/question_answer/wireless_connectivity/zigbee/f/104/t/72645.aspx