微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI Zigbee设计交流 > 求教ZDP_MgmtPermitJoinReq的使用方法

求教ZDP_MgmtPermitJoinReq的使用方法

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

我在帖子上看了关于ZDP_MgmtPermitJoinReq的使用方法,尝试了一下,但是发现没有想象中的结果,情况是这样的:

我有三个节点,协调器,路由器,终端,可以正常组网,路由器和终端都可以发送消息给协调器,我可以从串口打印出来的。现在我在协调器上添加这样的代码:

  if ( keys & HAL_KEY_SW_1 )
  {
    zAddrType_t dstAddr;
    dstAddr.addr.shortAddr = 0xfffc;        // all routers (for PermitJoin) devices
    dstAddr.addrMode = AddrBroadcast;
    
    if(NLME_PermitJoining)
    {
      ZDP_MgmtPermitJoinReq(&dstAddr, 0, TRUE, FALSE);
      NLME_PermitJoiningRequest(0);  //下面按键 
      P1_0 = 1;
    }
     else
     {
       ZDP_MgmtPermitJoinReq(&dstAddr, 0xff, TRUE, FALSE);
        NLME_PermitJoiningRequest(0xFF);
        P1_0 = 0;
     }
  }

先给协调器和路由器上电,待它们正常组网,我再摁下协调器的按键,再给终端上电。按照道理,终端是不能入网的,但是情况相反,终端通过路由器入网了,还给协调器发送了消息。

我进一步探究,通过抓包软件发现,按键按下后,协调器广播了一条数据出来,但是对路由器进行打断查看NLME_PermitJoining变量,发现一直为0x01。我有两点猜测:

1、路由器没有收到Mgmt_Permit_Joining_req原语

2、路由器收到了Mgmt_Permit_Joining_req原语,但是因为某些条件没有改变NLME_PermitJoining的值

这究竟是怎么回事呢?

自己已经找到原因,是因为协议栈没有接收到Mgmt_Permit_Joining_req进行处理的代码,需要自己添加进去,注册一个Mgmt_Permit_Joining_req原语,调用NLME_PermitJoiningRequest()进行处理即可。

请教下,路由器接收到Mgmt_Permit_Joining_req进行处理的代码怎样写?

不用自己写,协议栈里已经写好了的,ZDO_ProcessMgmtPermitJoinReq( zdoIncomingMsg_t *inMsg )这个函数

ZDO_ProcessMgmtPermitJoinReq( zdoIncomingMsg_t *inMsg ) 这个函数  的调用 是建立在 MT_ZDO_MGMT 这个宏存在的基础上,

但是MT_ZDO_MGMT 这个宏 哪里被定义了呢?  好像没有找到, 是不是要在工程中的 option 中添加呢?

请问你是如何  让路由或者协调器 开permit join ‘

允许其他设备 入网的? 

只是单独调用NLME_PermitJoiningRequest()吗?  还是需要别的函数?

你好,

请问你是如何使用NLME_PermitJoiningRequest()?

网上找了些资料说要使NLME_PermitJoining=FALSE;才行,但是我在应用层设置了该值=FALSE发现还是有错误

不知道你解决问题了吗?有什么建议给我,再此先谢过了!

直接 在 准备关闭permit join 的地方 这样调用    NLME_PermitJoiningRequest(0) ;

就把 允许入网给关闭了。 

你的意思是就不需要再设置NLME_PermitJoining=FALSE;?

我现在这设置了按键触发NLME_PermitJoiningRequest(0) ;

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

但是不需要按下按键设备就无法入网了 不知道哪里出错了,还是少了什么步骤?

首先zstack 默认是允许设备入网的。

 协调器和路由 上电一段时间 后就会关闭  允许入网。

另外你 设置 0x10  的意思 应该是开了允许入网 16s。

你具体是希望实现什么功能呢?

不好意思,我刚才没把代码改过来.。。。不是0x10是0

是这样的,我想把zstack默认允许设备入网改成不允许设备入网,

但是外界给一个信号比如按键,就在这段时间内允许终端加入网络,之后就再回到禁止终端加入的状态。

现在我在调试,在按键触发里写入 NLME_PermitJoiningRequest(0);不用按下按键协调就不让设备入网了,

如果把时间设置成0x10,就会一直允许入网,不管你有没有按下按键。

那你可以先在 

 zclxxx_event_loop 里面的 if ( events & SYS_EVENT_MSG )  里面的 case ZDO_STATE_CHANGE: 

下面判断 如果 设备的网络 类型是DEV_ZB_COORD 或者DEV_ROUTER  时  执行 

 NLME_PermitJoiningRequest(0);

那么设备 跑起来之后 就关闭  允许入网。

(你的设备应该是 协调器)然后按键的 地方  添加:    允许  timeout 填入你需要允许入网的时间

dstAddrLocal.addr.shortAddr = 0xFFFC;
dstAddrLocal.addrMode = afAddr16Bit;
rtrn = ZDP_MgmtPermitJoinReq(&dstAddrLocal, timeout, TRUE, FALSE);

@MarS

谢谢你耐心得解答!

我还想再请教你一下ZDP_MgmtPermitJoinReq 这个函数能不能指定某个终端的接入(已知某个终端的MAC)?通过指定这个终端的MAC来使这个终端能够加入

入过想要实现这个功能是不是可以用ZDP_ MgmtDirectJoin Req这个函数呢?

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

网站地图

Top