This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

关于这个函数ZDP_NwkAddrReq

网上说这个函数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函数的返回值 读取下