微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI Zigbee设计交流 > 关于这个函数ZDP_NwkAddrReq

关于这个函数ZDP_NwkAddrReq

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

网上说这个函数ZDP_NwkAddrReq可以通过mac地址获得短地址.....请问获得的短地址存放在哪里,该怎么得到...

这个函数的返回值并不是得到的地址值,而是状态值,返回的地址值应该是存放在了全局变量 ZDP_Buf中。

你好,请问还有什么API或有什么方式通过mac地址来寻找到网络短地址吗?我们的想法是在协调器上通过mac地址来获取节点(或路由器上中转的节点)的网络地址。

谢谢!

afStatus_t ZDP_NwkAddrReq( uint8 *IEEEAddress, byte ReqType,
byte StartIndex, byte SecurityEnable )

这个函数就可以用来根据IEEE地址请求对于设备的网络地址,响应会以ZDO_CB_MSG消息通知应用层,消息类型为NWK_addr_rsp,在一些例程里面有相关的例子

我想你应该知道怎么样调用和发送ZDP_NwkAddrReq函数吧。

主要在当你收到NWK_addr_rsp,这个消息以后,如何对它进行处理。

首先这个消息是一个ZDO层的命令,那么这个response消息会从底层传到ZDO层,

在ZDApp_ProcessOSALMsg( osal_event_hdr_t *msgPtr )的case ZDO_CB_MSG的ZDApp_ProcessMsgCBs( (zdoIncomingMsg_t *)msgPtr );进行处理。

如果你的应用层也想得到这个消息,那么你就得在应用层对这个消息进行注册,

// Register with the ZDO to receive Match Descriptor Responses
ZDO_RegisterForZDOMsg(task_id, NWK_addr_rsp);

然后你可以在应用层的event loop里面去做相应的处理

类似于

case ZDO_CB_MSG:
zclSample!_ProcessZDOMsgs( (zdoIncomingMsg_t *)MSGpkt );

这个函数里面你可以去做处理了,那么处理的方法,先把数据进行解析,类似于下面的过程。

ZDO_NwkIEEEAddrResp_t *pAddrRsp;

pAddrRsp = ZDO_ParseAddrRsp( inMsg );//拿到pAddrRsp就可以了
if ( pAddrRsp )
{
if ( pAddrRsp->status == ZSuccess )
{
ZDO_UpdateAddrManager( pAddrRsp->nwkAddr, pAddrRsp->extAddr );
}

VV,你好!
我调用ZDP_NwkAddrReq()函数:
byte MOD_extAddr[8];//这个是IEEE地址
ZDP_NwkAddrReq(MOD_extAddr, ZDP_ADDR_REQTYPE_SINGLE, 0, 0 );

我按照你的提示来做,我在应用层试两种方式:
我的理解:调用ZDP_NwkAddrReq()函数才会触发ZDO_CB_MSG。
第1种:
UINT16 XXX_ProcessEvent( byte task_id, UINT16 events )
{
afIncomingMSGPacket_t *MSGpkt;

(void)task_id; // Intentionally unreferenced parameter

if ( events & SYS_EVENT_MSG )
{
MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( GenericApp_TaskID );

while ( MSGpkt )
{
switch ( MSGpkt->hdr.event )
{
case AF_INCOMING_MSG_CMD:
GenericApp_MessageMSGCB( MSGpkt );
break;
case ZDO_CB_MSG:
{
//在这里我调用了函数ZDP_NwkAddrReq()也不会触发ZDO_CB_MSG,执行不到这里代码。
zclSample!_ProcessZDOMsgs( (zdoIncomingMsg_t *)MSGpkt );
}
break;

}
}
}
}
第2种:
我不在 if ( events & SYS_EVENT_MSG )里面。而是直接让检测events
if ( events & ZDO_CB_MSG ){
//这里有一个奇怪现象,这里的代码可以执行到了。但是我还没有执行调用ZDP_NwkAddrReq()函数,ZDO_CB_MSG竟然自己被触发了,并执行这里的代码。
//不停地循环执行这里代码。
zclSample!_ProcessZDOMsgs( (zdoIncomingMsg_t *)MSGpkt );
}


VV大神,我这两种方式哪里出问题了?求教!谢谢^_^

你的zclSample!_ProcessZDOMsgs( (zdoIncomingMsg_t *)MSGpkt );函数里面是什么?

你好,

以下就是函数内容:
void zclSample!_ProcessZDOMsg( zdoIncomingMsg_t *inMsg )
{
ZDO_NwkIEEEAddrResp_t *pAddrRsp;
pAddrRsp = ZDO_ParseAddrRsp( inMsg );//拿到pAddrRsp就可以了
if ( pAddrRsp )
{
if ( pAddrRsp->status == ZSuccess )
{
ZDO_UpdateAddrManager( pAddrRsp->nwkAddr, pAddrRsp->extAddr );
}
}
}

但是这个函数内容与这个问题应该没什么太大关系吧,主要是怎么可以找执行函数zclSample!_ProcessZDOMsg( zdoIncomingMsg_t *inMsg ),对于这个函数里的内容都是个人代码哦

我的问题是怎么检查(或在哪里检查) ZDO_CB_MSG 后执行这个函数zclSample!_ProcessZDOMsg( zdoIncomingMsg_t *inMsg ),重点在于 ZDO_CB_MSG,而不是这个函数zclSample!_ProcessZDOMsg( )的内容,谢谢

如果你在应用层任务初始化的时候,注册了

// Register with the ZDO to receive Match Descriptor Responses
ZDO_RegisterForZDOMsg(task_id, NWK_addr_req);

那么当收到event loop下的ZDO_CB_MSG 进行处理

zclSample!_ProcessZDOMsg( zdoIncomingMsg_t *inMsg )

你在上面的函数中需要加入以下的判断,然后直接打断去调试。不过首先得确保你的request确实发出去了。

if ( pMsg->clusterID == NWK_addr_rsp )

{}

VV大神  请问我可以直接调用ZDP_Buf这个变量来操作吗?

我实验过,直接初始化,可以调用到应用层。但是当调用ZDP_NwkAddrReq这个函数的时候,数据是不对的,而已变量的数据通过串口打印是乱码。求指点.......

ZDApp在收到NWK_addr_rsp时会执行一个ZDO_UpdateAddrManager函数,这里是否会占用AddrMgr的空间?

不会的 你可以在这个函数里面改一下代码 把最后一个addrmgrupdate函数的返回值 读取下

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

网站地图

Top