大家好,关于白名单我的解决方法是在Zdo中添加了自己的判别,详细代码我就不贴了,只是说说方法,大家各自按照自己的想法去尝试吧。这种方法是可行的,我已经使用了2个月了,也做过一些测试(并不是极端的测试)
言归正传,接下来就说说我的实现步骤:
在ZDO->ZDO_JoinIndicationCB函数中可以得到当前申请加入网络的节点的MAC地址,假如现在有个路由节点或者协调器A,一个未入网的终端节点B,B尝试去加入A,那么你在A中的ZStatus_t ZDO_JoinIndicationCB( uint16 ShortAddress, uint8 *ExtendedAddress,uint8 CapabilityInformation, uint8 type );函数中就可以看到B的MAC地址,也就是字体突出的那个,这个时候你就可以将这个MAC地址提取出来,进行验证比对(验证方法自己想,这个没难度吧,自己搞个链表,结构体,数组什么的都可以),事先可以通过串口,或者程序直接添加好你要的白名单。如果比对的结果是不存在,直接在这个函数的结尾return ZFailure就可以了,这样就可以拒绝B的加入。如果是你想要的就直接ZSuccess就OK了。
实际上还可以利用NLME_PermitJoiningRequest还执行过多的场景,确保正确的节点加入正确的ZigBee网络。
上一个帖子有网友回复我如果是恶意节点,现在除非那个节点变换他的MAC地址,并且刚好我的白名单中也有的情况下,他才能加入,如果恶意节点运气好,刚好某一次他的MAC地址对应上了我的白名单MAC地址,那在MAC层他就加入了,这个时候我们还需要在网络层进行一些控制,比如进行ZigBee网络的加密,协议栈提供了AES加密算法,这样虽然加入了MAC层,但是没法在网络层进行通信。
到这个时候,可能又有人问我了,万一占用满了我的AssocList怎么办,没问题,我们在应用层做一个白名单的超时,如果某个刚加入的节点在一定时间内没有发送我们预先设定好的“注册数据”,我们就认为这个白名单超时了,主动剔除他的同时AssocRemove掉就没问题了。
如果你还要问,他要是一直用这个mac地址来加,怎么办,正确的那个节点就没法加了,那你就NLME_PermitJoiningRequest关闭吧,打把游戏,楼主只能帮你到这了。
其实这个过程还牵扯到很多问题,比如路由,2级路由,3级路由怎么来管理这个白名单,白名单同步问题,这个东西大家仁者见仁智者见智,我的处理方法是全部放到协调器上,有节点加再向协调器询问,不同的应用场景方案肯定是不同的。
如果有什么疑问的地方或者我提到的某些解决方法是错误的地方还请大家提出,我也好改正,大家共同进步。
QQ:326575140.加我的时候请注明是电子工程世界论坛的。谢谢。
想请问下楼主“允许入网的MAC地址全部放到协调器上,有节点申请加入再向协调器询问”这个步骤,当一个路由器发现有子节点申请加入触发了该路由的ZDO_JoinIndicationCB()时,不是就要在函数中返回failure或是success了吗?还是说楼主的方法是先failure然后询问协调器,如果存在该MAC地址,那么下次该子节点再次入网时允许其加入;或者是先success让子节点加入然后再对其MAC地址进行验证,若无法匹配上则将该子节点退掉?
lz,写的好高深。想问下怎么给mac层数据打上时间戳呢