求教ZDP_MgmtPermitJoinReq的使用方法
我在帖子上看了关于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这个函数呢?