我在帖子上看了关于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的值
这究竟是怎么回事呢?
Isaac Huang:
回复 shuming ye:
请教下,路由器接收到Mgmt_Permit_Joining_req进行处理的代码怎样写?
binbin lin:
回复 Isaac Huang:
不用自己写,协议栈里已经写好了的,ZDO_ProcessMgmtPermitJoinReq( zdoIncomingMsg_t *inMsg )这个函数
MarS:
回复 binbin lin:
ZDO_ProcessMgmtPermitJoinReq( zdoIncomingMsg_t *inMsg ) 这个函数 的调用 是建立在 MT_ZDO_MGMT 这个宏存在的基础上,
但是MT_ZDO_MGMT 这个宏 哪里被定义了呢?好像没有找到, 是不是要在工程中的 option 中添加呢?
MarS:
回复 shuming ye:
请问你是如何让路由或者协调器 开permit join ‘
允许其他设备 入网的?
只是单独调用NLME_PermitJoiningRequest()吗?还是需要别的函数?
x h:
回复 MarS:
你好,
请问你是如何使用NLME_PermitJoiningRequest()?
网上找了些资料说要使NLME_PermitJoining=FALSE;才行,但是我在应用层设置了该值=FALSE发现还是有错误
不知道你解决问题了吗?有什么建议给我,再此先谢过了!
MarS:
回复 x h:
直接 在 准备关闭permit join 的地方 这样调用 NLME_PermitJoiningRequest(0) ;
就把 允许入网给关闭了。
x h:
回复 MarS:
你的意思是就不需要再设置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 ); }
但是不需要按下按键设备就无法入网了 不知道哪里出错了,还是少了什么步骤??
MarS:
回复 x h:
首先zstack 默认是允许设备入网的。
协调器和路由 上电一段时间 后就会关闭 允许入网。
另外你 设置 0x10 的意思 应该是开了允许入网 16s。
你具体是希望实现什么功能呢?
x h:
回复 MarS:
不好意思,我刚才没把代码改过来.。。。不是0x10是0
是这样的,我想把zstack默认允许设备入网改成不允许设备入网,
但是外界给一个信号比如按键,就在这段时间内允许终端加入网络,之后就再回到禁止终端加入的状态。
现在我在调试,在按键触发里写入 NLME_PermitJoiningRequest(0);不用按下按键协调就不让设备入网了,
如果把时间设置成0x10,就会一直允许入网,不管你有没有按下按键。
TI中文支持网