CK345 发表于 2014-6-6 17:16:46

关于ZIGBEE使用NLME_PermitJoiningRequest()控制节点加入网络解答

本帖最后由 CK345 于 2014-6-6 17:17 编辑

问题1:我在使用协调器建立网络15分钟后,使用NLME_PermitJoiningRequest(0)函数禁止新节点加入网络,不知道使用NLME_PermitJoiningRequest(0)函数禁止节点加入是都正确?

问题2:使用NLME_PermitJoiningRequest(0)这个函数禁止节点加入网络后(15分钟后),我原来加入网络的节点在信号很弱的时候掉线了(离开网络),却再也不能自动连上协调器(不能回到网络)。要把协调器使用NLME_PermitJoiningRequest(0xff)函数允许节点加入才可以连上协调器,有没有可以让协调器不使用NLME_PermitJoiningRequest(0xff)函数就能让掉线的节点自动连上原来的协调器?也就是协调器不需要改软件,改节点的软件。

期盼解答,十分谢谢!

Elex 发表于 2014-6-6 19:44:53

1, 用DP_MgmtPermitJoinReq来代替NLME_PermitJoiningRequest, 因为还需要处理security keys.
2, 所有节点信号弱不需要离开网络,但其可以选择信号强的节点作父节点重新加入. 由于新加入的节点选择其它路由节点作父节点, 故这个过程不需要协调器允许NLME层的permitjoining, 而是需要协调器打开security层的permitjoining 传keys给新加入的节点. 如果是rejoin, 则节点已经有keys就不需要协调器再传key了.

CK345 发表于 2014-6-6 20:36:30

本帖最后由 CK345 于 2014-6-6 20:43 编辑

Elex 发表于 2014-6-6 19:44
1, 用DP_MgmtPermitJoinReq来代替NLME_PermitJoiningRequest, 因为还需要处理security keys.
2, 所有节点信 ...

你好,谢谢你的回复,刚才查了你说的这个函数DP_MgmtPermitJoinReq 协议栈里面没找到{:smile:} 我现在使用的版本是ZStack-CC2530-2.5.1a 你不是这个函数 ZDP_MgmtPermitJoinReq()
要是ZStack-CC2530-2.5.1a里面的ZNP程序建立协调器,网络中只有一个协调器和多个终端设备。现在我想让协调器上电建立网络之后就 调用ZDP_MgmtPermitJoinReq(&dstAddr, 0x00, 1, FALSE);来禁止任何设备加入网络。请问这个调用放在什么位置最合适?也就是说要绝对保证在建立网络之后没有任何设备能加入网络。

Elex 发表于 2014-6-6 22:33:53

是ZDP_MgmtPermitJoinReq.
你使能NV_RESTORE就可以保存网络信息不用每次上电建立网络的.
网络状态是可以默认上电打开或关闭的,具体见全局变量NLME_PermitJoining初始值.
只有在需要增加设备的时候才打开网络,所有设备加入网络后就不需要再打开网络了.

CK345 发表于 2014-6-7 12:32:23

本帖最后由 CK345 于 2014-6-7 12:59 编辑

Elex 发表于 2014-6-6 22:33
是ZDP_MgmtPermitJoinReq.
你使能NV_RESTORE就可以保存网络信息不用每次上电建立网络的.
网络状态是可以默 ...

//事件按键处理
void GenericApp_HandleKeys( uint8 shift, uint8 keys )
{
(void)shift;// Intentionally unreferenced parameter

if ( keys & HAL_KEY_SW_6 )
{
   //   LED_D2=~LED_D2;
}

if ( keys & HAL_KEY_SW_5 )
{
   
   

   zAddrType_t destAddr;
    LED_D2=~LED_D2;
    // enable permit joining on all routers
/*
dstAddr.addrMode = AddrBroadcast;
dstAddr.addr.shortAddr = NWK_BROADCAST_SHORTADDR_DEVZCZR;            
ZDP_MgmtPermitJoinReq(&dstAddr, 0xFF, 1, FALSE);            
*/

// disable permit joining on all routers
dstAddr.addrMode = AddrBroadcast;
dstAddr.addr.shortAddr = NWK_BROADCAST_SHORTADDR_DEVZCZR;            
ZDP_MgmtPermitJoinReq(&dstAddr, 0x00, 1, FALSE);
   
}
我现在在协调器里面这么做,可以吗?还有我这是禁用路由的,要是禁用终端呢

fiaanull 发表于 2014-6-23 08:41:27

不错的帖子,顶下!不过,牛人怎么没有回复了,还有楼主的问题解决了吗?能否分享下{:biggrin:}

tomjark 发表于 2014-10-29 18:50:47

1、uint8 NLME_PermitJoining = TRUE; 设置为FALSE (这个变量可能定义在协议的未开源部分了,应该属于一个全局变量,如果在用户程序的初始化部分将其设置为FALSE

       那么,协调器或者是路由器上电后就不允许设备的加入了)

2,如果NV_RESTORE开启了,路由和终端设备以前加过这个协调器,那么即便你Pertmitjoin禁止了,他们也能加进来的

3,NLME_PermitJoiningRequest是让自己不允许其他设备加入,只是一个内部的操作,没有无线数据的交互。

if ( keys & HAL_KEY_SW_1 )
{
    NLME_PermitJoiningRequest(20); //按下按键则允许设备在20s内加入,如果是0则禁止加入
}

ZDP_MgmtPermitJoinReq发送命令给别人,让别的设备不允许其他设备加入。是通过无线数据让别的设备不允许加入。设备在收到ZDP_MgmtPermitJoinReq进行处理的时候,最后调用的也是NLME_PermitJoiningRequest来实现的。

CK345 发表于 2014-10-29 21:23:20

fiaanull 发表于 2014-6-23 08:41
不错的帖子,顶下!不过,牛人怎么没有回复了,还有楼主的问题解决了吗?能否分享下 ...

可以这么干,你试试就知道了

buxiaohui1108 发表于 2014-11-1 22:10:08

顶一下,不错的帖子!

WorldFly 发表于 2014-11-12 15:06:48

Permit Join只能限制Associate Join模式,无法限制恶意的Rejoin模式

linlusan 发表于 2019-2-25 11:09:19

不错!试过可行
页: [1]
查看完整版本: 关于ZIGBEE使用NLME_PermitJoiningRequest()控制节点加入网络解答