使用Zstack如何让终端节点扫描周围所有路由节点并读取所扫描到的路由节点信息
查看api说明,有NLME_RouteDiscoveryRequest和NLME_NwkDiscReq2这两个函数尝试过实现标题的功能,在终端节点入网后去调用这些函数获取信息,跟踪调试结果只能获取到一个路由信息,除非周围还有其他panid网络的路由,而终端节点是0xFFFF的设置,那么就可以扫描到两个路由信息,仅此而已。
这个是哪里使用不档导致的?如何显示如上一个功能还请大牛们出出主意帮帮忙。现在我是使用路由节点1跳广播来路由设备上实现如上功能,终端节点还没能实现。
还有就是如何让已经入网的终端节点重新入网,选择新的父节点?使用NLME_ReJoinRequest并没有回调到ZDO_JoinConfirmCB里,好似没触发。
这个函数只对Router节点有效果,对End Device是没有效果的。
想问下,你提到的终端设备获取周围路由信息的目的为了什么?从ZigBee协议角度来讲,终端设备不管什么情况,只会和父设备通信,所以即便知道除了父设备以外的路由设备也没什么用的。
是想像蓝牙ibeacon那样,获取rssi计算位置,做zigbee的定位。zstack旧版本好似有个定位功能的说法,不知道是什么原理来着?
那就不要用NLME_RouteDiscoveryRequest了,直接用Scan就可以了。用NLME_DISC_SCAN
参考下面函数
/*********************************************************************
* @fn ZDO_ProcessMgmtNwkDiscReq
*
* @brief This function handles parsing the incoming Management
* Network Discover request and starts the request.
*
* @param inMsg - incoming message (request)
*
* @return none
*/
void ZDO_ProcessMgmtNwkDiscReq( zdoIncomingMsg_t *inMsg )
{
NLME_ScanFields_t scan;
uint8 index;
uint8 *msg;
msg = inMsg->asdu;
scan.channels = osal_build_uint32( msg, 4 );
msg += 4;
scan.duration = *msg++;
index = *msg;
scan.scanType = ZMAC_ACTIVE_SCAN;
scan.scanApp = NLME_DISC_SCAN;
// Save off the information to be used for the response
zdappMgmtNwkDiscReqInProgress = true;
zdappMgmtNwkDiscRspAddr.addrMode = Addr16Bit;
zdappMgmtNwkDiscRspAddr.addr.shortAddr = inMsg->srcAddr.addr.shortAddr;
zdappMgmtNwkDiscStartIndex = index;
zdappMgmtNwkDiscRspTransSeq = inMsg->TransSeq;
if ( NLME_NwkDiscReq2( &scan ) != ZSuccess )
{
NLME_NwkDiscTerm();
// zdappMgmtNwkDiscReqInProgress will be reset in the confirm callback
}
}
在完成Scan以后,会调用ZDO_FinishProcessingMgmtNwkDiscReq();函数,就可以把周围网络信息拿到了
@大神VV,可否直接调用ZDO_ProcessMgmtNwkDiscReq来获取数据呢?inMsg这个对象里的数据参数分别代表什么,如何造一个这样的参数来完成这次任务?
现在想先调试看看获取到啥,但是参数不知道如何造,卡住了。
另外,这个函数在API文档里没找说明,还真隐晦。
还烦大神打解下。谢谢
我设置了一个定时任务,直接如下代码调用函数
zdoIncomingMsg_t inMsg;
inMsg.srcAddr.addrMode = Addr16Bit;
inMsg.srcAddr.addr.shortAddr = 0xFFFF;
inMsg.wasBroadcast = TRUE;
inMsg.clusterID = 1;
inMsg.SecurityUse = 0;
inMsg.asduLen = 1;
uint8 asdu = 0xFF;
inMsg.asdu = &asdu;
inMsg.TransSeq = 0xFF;
inMsg.macDestAddr = 0;
ZDO_ProcessMgmtNwkDiscReq(&inMsg);
函数是进去了,可是没能在ZDO_FinishProcessingMgmtNwkDiscReq发现被调用到。是调用ZDO_ProcessMgmtNwkDiscReq的参数不对导致的还是其他什么原因?麻烦请VV大神解答下。谢谢
你好,我现在做一个低功耗终端节点的项目,用的是PM2,五秒唤醒一次,我发现我用协调器直接给终端发数据,终端有时候收不到,是怎么回事?谢谢
@kobe bryant
你的问题可能是由于协调器侧的发送队列满了,把数据给删除了。
Hi VV:
手头上的一个项目需要解决的问题是:一个手持节点,可扫描当前区域内所有信道上的网络和网络ID号。
碰到几个问题,烦请大神指点一二。
1.在Scan后,调用ZDO_NetworkDiscoveryConfirmCB()函数返回networkDesc_t.寻遍整个工程都没有发现此函数在何处被显性调用的。难道此函数调用过程的源码未公开?
2.针对于函数NLME_NwkDiscReq2,技术文档上说:This function requests the network layer to discover neighboring routers. Use this function to perform a network scan but you are NOT expecting to join. The scan confirm (results) will be returned in ZDO_NetworkDiscoveryConfirmCB() callback. After the callback (results), call NLME_NwkDiscTerm() to clean up this action.
在进入ZDO_NetworkDiscoveryConfirmCB()函数立即调用ZDO_FinishProcessingMgmtNwkDiscReq()在对网络列表进行相应处理后终于调用了 NLME_NwkDiscTerm()函数,"clean up this action"。
我的问题是在NLME_NwkDiscTerm函数执
行后,ZDO_NetworkDiscoveryConfirmCB()函数后部分的代码还可以实现吗?如:ZDApp_SendMsg( ZDAppTaskID, ZDO_NWK_DISC_CNF, sizeof(ZDO_NetworkDiscoveryCfm_t), (uint8 *)&msg );也就是技术文献上说的call NLME_NwkDiscTerm() to clean up this action(req),清除了哪些呢?
3.寻遍整个工程都没有发现ZDApp_NwkDescListProcessing()函数的申明和实现。
Z-Stack版本:Z-Stacka-CC2530-2.3.1-1.4.0
1, 这个是callback函数,调用的地方是在库函数里面。
2,清楚的是NwkDescList里面的内容
3,在ZDApp.c文件里面