有三个节点协调器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下面。为何啊?
user3514461:
补充下上面,那个路由器B上还增加了编译选项:
ZDO_MGMT_LEAVE_REQUESTZDO_MGMT_LEAVE_RESPONSE
但是,程序编译时,出现“隐式声明”错误,后来将改为编译选项:MT_ZDO_MGMT (这个编译选项包括上面两个选项),编译就OK了。
此处问题,请TI工程帮忙看看!感谢万分!
x h:
回复 user3514461:
对于想让某个终端离开我是这么做的
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
nicolas zhao4:
回复 x h:
请问ZDP_MgmtLeaveReq如何得知设备离开的状态信息,回调接口是哪个?
目前的问题是Rejoin参数赋0还是1终端都能加回网络,调用该接口还需要跟其他操作吗