Other Parts Discussed in Thread: Z-STACK
目的:根据64位长地址寻得短地址,协调器通过该短地址与设备进行单点通信
我现在除了协调器,所有的设备都是router,还没有enddevice。
方法1:在节点数比较少的情况下,router与coordinator都是直连的,中间没有经过其他的router跳转,因此可以在网关端直接使用
APSME_LookupNwkAddr函数,参考blog.chinaunix.net/uid-20788636-id-1841417.html。需要注意长地址要翻转一下,代码很简单就。但是正如这个帖子所说,该函数只能找到子节点短地址,孙子节点就找不到。所以在设备增多的时候,就没法获取一些节点的地址了。
uint16 destNWKaddr; uint8 revdestIEEEaddr[ZIGBEE_DEVID_LEN]; uint8 destIEEEaddr[ZIGBEE_DEVID_LEN]; uint8 len = SerialData_Buf[UART_LEN_OFFSET]; uint8 i = 0; osal_memcpy(destIEEEaddr,SerialData_Buf+4,ZIGBEE_DEVID_LEN); osal_revmemcpy(revdestIEEEaddr,destIEEEaddr,ZIGBEE_DEVID_LEN); APSME_LookupNwkAddr(revdestIEEEaddr,&destNWKaddr) ; GenericApp_DstAddr.addrMode = (afAddrMode_t)Addr16Bit; GenericApp_DstAddr.endPoint = GENERICAPP_ENDPOINT; GenericApp_DstAddr.addr.shortAddr = destNWKaddr;
方法2:全网络寻找短地址,参考www.deyisupport.com/.../91221.aspx。我的做法是
//第一步
void GenericApp_Init( uint8 task_id )
{
...
// Register with the ZDO to receive Match Descriptor Response
ZDO_RegisterForZDOMsg( GenericApp_TaskID,NWK_addr_rsp );
...
}
//第二步
uint16 GenericApp_ProcessEvent( uint8 task_id, uint16 events )
{
...
switch ( MSGpkt->hdr.event )
{
case ZDO_CB_MSG:
GenericApp_ProcessZDOMsgs( (zdoIncomingMsg_t*)MSGpkt );
break;
}
...
}
//第三步
void GenericApp_ProcessZDOMsgs( zdoIncomingMsg_t *inMsg )
{
switch ( inMsg->clusterID)
{
case NWK_addr_rsp:
//Send find device callback to application
ZDO_NwkIEEEAddrResp_t *pNwkAddrRsp = ZDO_ParseAddrRsp( inMsg );
if( pNwkAddrRsp )
{
if( pNwkAddrRsp->status == ZSuccess)
{
uint8 test[2];
Map_NwkAdd = pNwkAddrRsp->nwkAddr;
test[0] = (Map_NwkAdd&0xFF00)>>8;
test[1] = Map_NwkAdd&0x00FF;
HalUARTWrite(0,test,2);
}
}
break;
}
}
//第4步
//同样在GenericApp_ProcessEvent中添加了一个轮询事件,用来处理串口来的消息,最后就是调用ZDP_NwkAddrReq来获取目标短地址
ZDP_NwkAddrReq(destIEEEaddr,ZDP_ADDR_REQTYPE_SINGLE,0,0);
可是问题是我在第三步设置断点,程序根本跑不到这里,这是为什么呢?
其实全网广播获取并不是个好方法,对网络负载大。我已经放弃使用了,但还是想知道实现的具体步骤。
2楼继续。。。。。。