查看: 4783|回复: 2

Zigbee白名单机制解决多协调器终端节点不知所措的问题

[复制链接]
梁先生 发表于 2014-6-18 13:50:09 | 显示全部楼层 |阅读模式
Zigbee白名单机制解决多协调器终端节点不知所措的问题{:soso_e144:}
在同一空间内如果同时存在两个或者两个以上的协调器,终端节点在选择网络的时候肯定会不知所措。要使得终端节点最终加入我们所希望的协调器,我想出了白名单机制。具体实现方式如下以GenericApp为例:
终端节点上电后,如果网络状态发生变化,成为了网络中的一个终端节点:即在GenericApp_ProcessEvent事件中ZDO_STATE_CHANGE事件。这个时候我们可以设置一个事件,每隔5s也好,3s也好,向协调器发送数据,内容包含自己的MAC地址。
协调器上电后,成功分配网络,当有无线消息到来的时候,首先判断这串消息里包含的MAC地址在自己的白名单列表里是否存在,如果存在,就正常工作,如果不存在,就请他离开,具体实现方式如下:
这里用到了协议栈网络层的ZStatus_t NLME_LeaveReq( NLME_LeaveReq_t* req );这个API函数,请求自己或者其他设备脱离网络,执行此函数不会导致其父节点重新分配设备地址。
这里我们可以看到参数是NLME_LeaveReq_t* req,那么我们就定义一个这样的结构体并给他分配内存空间。NLME_LeaveReq_t *req;  req = osal_mem_alloc(sizeof(NLME_LeaveReq_t)); 利用goto可以看到这个结构体的具体信息
typedef struct
{
  uint8* extAddr;
  uint8  removeChildren;
  uint8  rejoin;
  uint8  silent;
} NLME_LeaveReq_t;
extAddr -要脱离的设备的扩展地址
removeChildren -true 子设备也脱离,false只脱离当前设备。目前只能用false
rejoin -true 允许设备重新加入网络,false 不允许设备重新加入网络
silent – 是否通知。
正确设置后调用NLME_LeaveReq(req);这个时候终端节点被协调器剔除。
最后不要忘了malloc和free是成对使用的,有借有还,osal_mem_free(req);

至于怎么添加白名单这个问题,我想就自己解决吧,你程序预先写好也可以,上电后通过串口发送到协调器也行,反之方法很多,不过要值得注意的是,如果你在设置NLME_LeaveReq_t的时候如果不允许节点重新加入的话,记得先给协调器上电,然后再给终端节点上电,这个步骤要注意一下。
    这差不多是我的想法,如果有什么疏漏的地方或者不正确的地方欢迎指出{:soso_e140:} 。QQ:326575140.
zigbee_luo 发表于 2014-11-14 16:43:12 | 显示全部楼层
LeaveReq,节点可以拒绝执行,恶意消耗掉你的AssocList。
另外你怎么保证节点被踢出后,加到自己该加的网络中?
 楼主| 梁先生 发表于 2014-11-20 15:27:15 | 显示全部楼层
zigbee_luo 发表于 2014-11-14 16:43
LeaveReq,节点可以拒绝执行,恶意消耗掉你的AssocList。
另外你怎么保证节点被踢出后,加到自己该加的网 ...

这个是我做过的第一版本的关于白名单的处理,第二版中我已经摒弃了这种方法。
暂且不考虑恶意节点这个问题的前提下,可以在ZDO中添加过滤,晚上有空的时候我会抽空写篇最新的关于白名单机制的东西。
谢谢你的回复。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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