Other Parts Discussed in Thread: Z-STACK
我们在应用Z-stack时,发现里面有些不足的地方,于是就做了以下改进。
1,协调器和路由器中,增加了MAC地址过滤功能。协调器和路由器中,有一个MAC地址过滤表,当有新设备入网时,会向协调器或者路由器发起Assoc Request,协调器或者路由器会根据MAC地址过滤表来判断这个节点是否应该入网。如果申请入网的节点不在MAC地址表中,协调器或者路由器返回一个Assoc Denied命令给节点(协议分析软件能看到这个命令)。同时,拒绝节点入网的协调器或者路由器,会通过zdoCBFunc注册的回调函数,告诉应用层当前有设备试图加入网络,并且还会将这个拦截信息广播给网络内所有带路由功能的设备,其它路由收到拦截广播后,也会通过zdoCBFunc注册的回调函数,告诉应用层。因此,在应用层可以看到某个设备正在通过某个路由加入网络但是被拒绝。
2,通过应用层,可以向MAC过滤表中输入合法设备的MAC地址,即MAC白名单。MAC白名单可以广播给路由,也可以单播给某个路由。MAC白名单采用新增的ZDO层命令来实现,即ZDO_REQ和ZDO_RSP。当向路由广播或者单播白名单的REQ,会收到返回的白名单RSP,白名单RSP中包含了MAC白名单记录条数。如果白名单REQ携带的白名单MAC值为{0,0,0,0,0,0,0,0}或者{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},MAC记录条数不会增加,但是会返回白名单的RSP。在实际网络中,如果怀疑一个路由器没有MAC地址过滤,可以向其发送一个全0或者全0xFF的MAC地址,如果白名单RSP的状态不为ZSuccess,则说明这个路由器不支持MAC地址过滤,可以通过Mgmt_Permit_Join_req命令,将其入网功能关闭。
MAC白名单是一个动态的数据库,通过osal_mem_alloc分配空间,每个MAC地址记录时间只有1分钟,1分钟后自动清空。另外,当新设备成功入网后,MAC白名单就会清除掉。
3,对于节点来说,则采用滚动入网的方式。节点入网前先扫描网络,会记录多个PANID。然后节点会加入第一个PANID,当第一个PANID拒绝节点加入,节点会依次加入第二个,第三个……直到已经扫描到的PANID都试完,节点才会重新扫描PANID。
4,对于zigbee网络来说,有种协调器叫“恶意协调器”,恶意协调器通常是一直允许加入网络,而且信号非常好,会干扰节点不能加入指定网络。对于这种协调器,我做了以下处理:在密钥使能时,一个节点被协调器“拉”进网络后,是Nuauth状态,当Unauth状态超时,会复位,复位前,把这个PANID记录在NV_RAM中,下次扫描网络时,就跳过这个PANID。
附件 已经去除,需要的请与我私下联系,仅限测试使用。