查看: 3049|回复: 1

协调器和路由器的JOIN白名单加入方法。

[复制链接]
zigbee_luo 发表于 2013-6-7 11:52:32 | 显示全部楼层 |阅读模式
在加入网络的时候,有两种方式,一种是JOIN,一种是REJOIN。前者要用MAC层来完成,节点向协调器发起一个AssoReq指令,该指令包含节点的物理地址,协调器向节点返回一条AssoRsp指令包含分配给节点的网络地址。而REJOIN是NWK层的命令,节点自己生成一个网络地址并向协调器发起请求,协调器收到后,如果这个地址已经分配给其它设备,则返回一包拒绝信息(这种情况我还没见过,概率太低了),通常返回允许加入,并修改子节点表的信息。

第一种方法,在Zmac_cb.c文件中,找到函数MAC_CbackEvent,这个函数是MAC层把消息上传给NWK层的,可以过滤AssoReq命令。这个地方是判断MAC层生成的消息,并进一步传递给NWK,在传递给NWK前要用osal_msg_allocate分配消息空间,同时会进行一些预处理。其中有个对MAC_MCPS_DATA_IND事件的预处理,就是收到错误的数据包直接return,不上传给NWK。
我们可以在这里添加一个else if(event == MAC_MLME_ASSOCIATE_IND),然后判断pData->associateInd.deviceAddress是否合法,不合法直接return。

第二种方法,在ZDApp.c中找到ZDO_JoinIndicationCB,这里是直接接驳NWK层处理加入网络请求的。可以处理JOIN和REJOIN两种事件。参数type是加入网络的方式,ShortAddress是NWK分配好的网络地址,ExtendedAddress是加入网络的设备的物理地址。在这个地方加入白名单验证,不合法的,直接返回ZFailure。

通过协议分析仪观察,第一种方法,协调器收到AssoReq后不响应AssoRsp,节点超时后重新寻找其它网络。第二种方法,协调器返回的AssoRsp指令,分配的网络地址是0xFFFF,这个地址是不合法的,节点收到后会重新寻找其它网络。
outman 发表于 2013-6-7 23:08:37 | 显示全部楼层
已转为vip会员,并赠送100飞币,感谢罗工对飞比论坛的贡献,也期待以后的大作
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表