微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI Zigbee设计交流 > 在路由器上使用NLME_DirectJoinRequest()和ZDP_MgmtLeaveReq(),不能让已经加入到协调器上的终端节点退出协调器,为何?盼赐教!

在路由器上使用NLME_DirectJoinRequest()和ZDP_MgmtLeaveReq(),不能让已经加入到协调器上的终端节点退出协调器,为何?盼赐教!

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

有三个节点协调器A,路由器B,终端C,  上电后,终端C加入到了协调器A,现在我想让加入到协调器的终端节点C,退出协调器,加入到路由器B。

终端的IEEE地址:uint8  endieeeAddr[8]={0x00,0x12,0x4b,0x00,0x05,0x4f,0xd6,0xc4};

根据TI工程师提示的资料,在路由器B上某处触发如下代码:

byte mac_cap = CAPINFO_DEVICETYPE_RFD;  

NLME_DirectJoinRequest( endieeeAddr, mac_cap );

之后,在其它地方触发以下代码:

uint16 leaveaddr;  (这个变量保存的是终端节点C的短地址)

zAddrType_t Z_leaveADDr;

Z_leaveADDr.addr.shortAddr = leaveaddr;  
Z_leaveADDr.addrMode = Addr16Bit;

ZDP_MgmtLeaveReq( &Z_leaveADDr, endieeeAddr, 1,1,0 );

另外, ZDApp.c中也如下修改:

#if ( ZG_BUILD_RTRONLY_TYPE ) || ( ZG_BUILD_ENDDEVICE_TYPE )
//devStartModes_t devStartMode = MODE_JOIN; // Assume joining
devStartModes_t devStartMode = MODE_RESUME; // if already "directly joined"
// to parent. Set to make the device do an Orphan scan.
#else
// Set the default to coodinator
devStartModes_t devStartMode = MODE_HARD;
#endif

按照以上3处修改,发现终端节点C始终在协调器A下面。为何啊?

补充下上面,那个路由器B上还增加了编译选项:

ZDO_MGMT_LEAVE_REQUEST
ZDO_MGMT_LEAVE_RESPONSE

但是,程序编译时,出现“隐式声明”错误,后来将改为编译选项:MT_ZDO_MGMT  (这个编译选项包括上面两个选项),编译就OK了。

此处问题,请TI工程帮忙看看!感谢万分!

对于想让某个终端离开我是这么做的

srcid.addrMode=(afAddrMode_t) Addr16Bit;
srcid.addr.shortAddr=pkt->srcAddr.addr.shortAddr;
if (Leavecommand)
ZDP_MgmtLeaveReq(&srcid,srcMAC,1,0,0);

终端的mac最好不要用过解析数据包里的source mac得到,直接让终端发自己的MAC协调器接受就好

可能是你的ZDP_MgmtLeaveReq选择了rejion

请问ZDP_MgmtLeaveReq如何得知设备离开的状态信息,回调接口是哪个?

目前的问题是Rejoin参数赋0还是1终端都能加回网络,调用该接口还需要跟其他操作吗

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

网站地图

Top