微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI Zigbee设计交流 > NLME_PermitJoiningRequest(0)是禁止新节点加入网络还是加入本节点

NLME_PermitJoiningRequest(0)是禁止新节点加入网络还是加入本节点

时间:10-02 整理:3721RD 点击:

我在协调器中调用NLME_PermitJoiningRequest(0),那新节点是不能加入协调器但可以加入已存在的路由器?   还是不能加入整个网络?

通过路由器加网是没有问题的

正解。 NLME_PermitJoiningRequest只管本节点是否允许其他设备加入,管不了整个网络。所以多级组网或者设备很多的时候,不但协调器的Permit需要打开,下面Router的Permit也要打开,否则一旦设备和协调器之间无法直接通信,或者协调器直接挂载的设备数已经达到最大值,都会导致设备无法入网。同样,设备退网的时候,也需要将整个网络的Permit都关掉,不然的话,设备一退网,如果发入网请求的话,又会加回来,这就是有人说的设备退不了网的情况。

这个函数 只能允许 让 路由 器用吗?

我看 EZMODE的 函数实现中

开permitjoin  时是 这样的

    // openers will broadcast permit joining
    case EZMODE_STATE_OPENER:
      zclEZModeOpener = 1;

      // enable joining both locally and over-the-air
      NLME_PermitJoiningRequest( (byte)(EZMODE_TIME / 1000)  );
      ZDP_MgmtPermitJoinReq( &dstAddr, (byte)(EZMODE_TIME / 1000), TRUE, FALSE);

.....
    break;

为什么 要调用两条函数呢?

  单独使用 NLME_PermitJoiningRequest  不可以吗?

   ZDP_MgmtPermitJoinReq 又有什么 作用?

    SampleSW 中  开permitjoin  的实现 又只用   ZDP_MgmtPermitJoinReq  

    另外参数的地址 代表什么 意思?  是本设备的地址 还是 允许设备的 地址?

    zAddrType_t tmpAddr;

      tmpAddr.addrMode = Addr16Bit;
      tmpAddr.addr.shortAddr = NLME_GetShortAddr();

      // toggle permit join
      gPermitDuration = gPermitDuration ? 0 : 0xff;

      // Trust Center significance is always true
      ZDP_MgmtPermitJoinReq( &tmpAddr, gPermitDuration, TRUE, FALSE );

请问  一个入网后 的路由器 (关掉协调器后)调用该函数 可以 让 终端设备入网吗?

我尝试了一下, 结果ubiqua  抓不到任何信息。

终端设备 加入 路由之后  也为显示成功,只是发了association ,后面一直data request。。。。

然后显示了一堆 update device

但是这时我打开 协调器时, 终端设备 直接加入 协调器, 

后面我把协调器 关闭, 路由保持不变,  终端设备 迅速的切换了一下, 也不会断网`~~~~

请问到底 如何让 路由  允许 其他设备入网?

NLME_PermitJoiningRequest是让协调器自己关掉入网。

ZDP_MgmtPermitJoinReq是让协调器关掉附件路由的入网,地址就是路由器的地址,一般发个广播就行

谢谢你!

你说对了

NLME_PermitJoiningRequest  是对于自己而言,  开启或者关闭 本地端   允许其他设备入网

ZDP_MgmtPermitJoinReq  是通过 地址 ,告诉某个设备 或者 所有路由     开启或者关闭 允许其他设备入网

但是有一点要明确的是, 如果通信是加密的, 那么 就必须有一个trust center。 一般是协调器,

因为我上面的通信是加密的, 关了协调器 就没有了 trust center,导致了 终端只能association  不能入网!

@Aries Lord你好,

我想请教向你一下,如何使用NLME_PermitJoiningRequest

是需要在应用层设置NLME_PermitJoining = FALSE;吗?但是这句话一直编译不对

如果不需要的话,我在应用层按键触发这添加了

void SampleApp_HandleKeys( uint8 shift, uint8 keys )
{
if ( keys & HAL_KEY_SW_1 )
{
NLME_PermitJoiningRequest(0);
}

结果是根本不用按下按键s1就无法组网,不知道这是怎么回事,是少了什么步骤吗?

希望能给我建议,在此先谢谢了!

NLME_PermitJoiningRequest的参数如果是0,就是disable了,当然不允许入网了。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top