⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zdprofile.c

📁 Zigbee2006入门(源代码+文档讲解+系统推荐)
💻 C
📖 第 1 页 / 共 4 页
字号:
    // LQI
    *pBuf++ = list->lqi;

    list++; // next list entry
  }

  FillAndSendBuffer( &TransSeq, dstAddr, Mgmt_Lqi_rsp, len, buf );
}
#endif // ZDO_MGMT_LQI_RESPONSE && RTR_NWK

#if defined ( ZDO_MGMT_RTG_RESPONSE )
/*********************************************************************
 * @fn          ZDP_MgmtRtgRsp
 *
 * @brief       This builds and send a Mgmt_Rtg_rsp message. This
 *              function sends a unicast message.
 *
 * @param       dstAddr - destination address of the message
 * @param       Status - message status (ZDP_SUCCESS or other)
 * @param       RoutingTableEntries - Total number of entries
 * @param       StartIndex - Starting index within the reporting list
 * @param       RoutingTableListCount - number of entries included
 *                                      in this message
 * @param       RoutingTableList - List of Routing Table entries
 * @param       SecurityEnable - true to enable security for this message
 *
 * @return      ZStatus_t
 */
ZStatus_t ZDP_MgmtRtgRsp( byte TransSeq, zAddrType_t *dstAddr,
                            byte Status,
                            byte RoutingTableEntries,
                            byte StartIndex,
                            byte RoutingListCount,
                            rtgItem_t *RoutingTableList,
                            byte SecurityEnable )
{
  byte *buf;
  byte *pBuf;
  // Status + RoutingTableEntries + StartIndex + RoutingListCount.
  byte len = 1 + 1 + 1 + 1;
  byte x;

  // Add an array for Routing List data
  len += (RoutingListCount * ZDP_ROUTINGENTRY_SIZE);

  buf = osal_mem_alloc( (short)(len+1) );
  if ( buf == NULL )
  {
    return afStatus_MEM_FAIL;
  }

  pBuf = buf+1;

  *pBuf++ = Status;
  *pBuf++ = RoutingTableEntries;
  *pBuf++ = StartIndex;
  *pBuf++ = RoutingListCount;

  for ( x = 0; x < RoutingListCount; x++ )
  {
    *pBuf++ = LO_UINT16( RoutingTableList->dstAddress );  // Destination Address
    *pBuf++ = HI_UINT16( RoutingTableList->dstAddress );
    *pBuf++ = RoutingTableList->status;
    *pBuf++ = LO_UINT16( RoutingTableList->nextHopAddress );  // Next hop
    *pBuf++ = HI_UINT16( RoutingTableList->nextHopAddress );
    RoutingTableList++;    // Move to next list entry
  }

  FillAndSendBuffer( &TransSeq, dstAddr, Mgmt_Rtg_rsp, len, buf );
}
#endif // ZDO_MGMT_RTG_RESPONSE

#if defined ( ZDO_MGMT_BIND_RESPONSE ) && defined ( REFLECTOR )
/*********************************************************************
 * @fn          ZDP_MgmtBindRsp
 *
 * @brief       This builds and send a Mgmt_Bind_rsp message. This
 *              function sends a unicast message.
 *
 * @param       dstAddr - destination address of the message
 * @param       Status - message status (ZDP_SUCCESS or other)
 * @param       BindingTableEntries - Total number of entries
 * @param       StartIndex - Starting index within the reporting list
 * @param       BindingTableListCount - number of entries included
 *                                 in this message
 * @param       BindingTableList - List of Binding Table entries
 * @param       SecurityEnable - Security Options
 *
 * @return      ZStatus_t
 */
ZStatus_t ZDP_MgmtBindRsp( byte TransSeq, zAddrType_t *dstAddr,
                            byte Status,
                            byte BindingTableEntries,
                            byte StartIndex,
                            byte BindingTableListCount,
                            apsBindingItem_t *BindingTableList,
                            byte SecurityEnable )
{
  uint8 *buf;
  uint8 *pBuf;
  uint8 maxLen; // maxLen is the maximum packet length to allocate enough memory space
  uint8 len;    // Actual length varies due to different addrMode
  uint8 x;
  uint8 protoVer;
  byte extZdpBindEntrySize = ZDP_BINDINGENTRY_SIZE + 1 + 1; // One more byte for cluserID and DstAddrMode
  byte shortZdpBindEntrySize = ZDP_BINDINGENTRY_SIZE + 1 + 1 + 2 - 8 - 1; // clusterID + DstAddrMode + shortAddr - ExtAddr - DstEndpoint

  protoVer = NLME_GetProtocolVersion();

  // Status + BindingTableEntries + StartIndex + BindingTableListCount.
  maxLen = 1 + 1 + 1 + 1;
  maxLen += (BindingTableListCount * extZdpBindEntrySize );  //max length
  buf = osal_mem_alloc( maxLen + 1 );  // +1 for transaction ID

  if ( buf == NULL )
  {
    return afStatus_MEM_FAIL;
  }

  pBuf = buf+1;

  *pBuf++ = Status;
  *pBuf++ = BindingTableEntries;
  *pBuf++ = StartIndex;
  *pBuf++ = BindingTableListCount;

  // Initial length = Status + BindingTableEntries + StartIndex + BindingTableListCount.
  // length += ZDP_BINDINGENTRY_SIZE   -- Version 1.0
  //           extZdpBindEntrySize     -- Version 1.1 extended address mode
  //           shortZdpBindEntrySize   -- Version 1.1 group address mode

  len = 1 + 1 + 1 + 1;
  for ( x = 0; x < BindingTableListCount; x++ )
  {
    pBuf = osal_cpyExtAddr( pBuf, BindingTableList->srcAddr );
    *pBuf++ = BindingTableList->srcEP;

    // Cluster ID
    *pBuf++ = LO_UINT16( BindingTableList->clusterID );

    if ( protoVer != ZB_PROT_V1_0 )
    {
      *pBuf++ = HI_UINT16( BindingTableList->clusterID );
    }

    if ( protoVer == ZB_PROT_V1_0 )
    {
      len += ZDP_BINDINGENTRY_SIZE;
      pBuf = osal_cpyExtAddr( pBuf, BindingTableList->dstAddr.addr.extAddr );
      *pBuf++ = BindingTableList->dstEP;
    }
    else
    {
      *pBuf++ = BindingTableList->dstAddr.addrMode;
      if ( BindingTableList->dstAddr.addrMode == Addr64Bit )
      {
        len += extZdpBindEntrySize;
        pBuf = osal_cpyExtAddr( pBuf, BindingTableList->dstAddr.addr.extAddr );
       *pBuf++ = BindingTableList->dstEP;
      }
      else
      {
        len += shortZdpBindEntrySize;
        *pBuf++ = LO_UINT16( BindingTableList->dstAddr.addr.shortAddr );
        *pBuf++ = HI_UINT16( BindingTableList->dstAddr.addr.shortAddr );
      }
    }
    BindingTableList++;    // Move to next list entry
  }

  FillAndSendBuffer( &TransSeq, dstAddr, Mgmt_Bind_rsp, len, buf );
}
#endif // ZDO_MGMT_BIND_RESPONSE && REFLECTOR

/*********************************************************************
 * Callbacks from the APS layer
 */

/*********************************************************************
 * @fn          ZDP_IncomingData
 *
 * @brief       This function indicates the transfer of a data PDU (ASDU)
 *              from the APS sub-layer to the ZDO.
 *
 * @param       pData - Incoming Message
 *
 * @return      none
 */
void ZDP_IncomingData( afIncomingMSGPacket_t *pData )
{
  byte proVer = NLME_GetProtocolVersion();
  zAddrType_t addr;
  zAddrType_t *srcAddr;
  byte wasBroadcast;
  cId_t clusterID;
  byte asduLen;
  byte *asdu;
  byte SecurityUse;
  byte TransSeq;

  addr.addrMode = Addr16Bit;
  addr.addr.shortAddr = pData->srcAddr.addr.shortAddr;
  srcAddr = &addr;
  wasBroadcast = pData->wasBroadcast;
  clusterID = pData->clusterId;
  SecurityUse = pData->SecurityUse;

  if ( proVer == ZB_PROT_V1_0 )
  {
  asduLen = pData->cmd.DataLength;
  asdu = pData->cmd.Data;
  TransSeq = pData->cmd.TransSeqNumber;
  }
  else
  {
    asduLen = pData->cmd.DataLength-1;
    asdu = pData->cmd.Data+1;
    TransSeq = pData->cmd.Data[0];
  }

  switch ( clusterID )
  {
    // Response messages for our requests

#if defined ( ZDO_NWKADDR_REQUEST ) || defined ( ZDO_IEEEADDR_REQUEST ) || defined ( REFLECTOR )
    case NWK_addr_rsp:
    case IEEE_addr_rsp:
      ZDO_ProcessAddrRsp( srcAddr, clusterID, asdu, asduLen);
      break;
#endif

#if defined ( ZDO_NODEDESC_REQUEST )
    case Node_Desc_rsp:
      ZDO_ProcessNodeDescRsp( srcAddr, asdu );
      break;
#endif

#if defined ( ZDO_POWERDESC_REQUEST )
    case Power_Desc_rsp:
      ZDO_ProcessPowerDescRsp( srcAddr, asdu );
      break;
#endif

#if defined ( ZDO_SIMPLEDESC_REQUEST )
    case Simple_Desc_rsp:
      ZDO_ProcessSimpleDescRsp( srcAddr, asdu );
      break;
#endif

#if defined ( ZDO_MATCH_REQUEST ) || defined ( ZDO_ACTIVEEP_REQUEST )
    case Match_Desc_rsp:
    case Active_EP_rsp:
      ZDO_ProcessEPListRsp( srcAddr, clusterID, asdu );
      break;
#endif

#if defined ( ZDO_BIND_UNBIND_REQUEST ) || defined ( ZDO_ENDDEVICEBIND_REQUEST ) || defined ( ZDO_COORDINATOR )
  #if defined ( ZDO_BIND_UNBIND_REQUEST ) || defined ( ZDO_COORDINATOR )
    case Bind_rsp:
    case Unbind_rsp:
  #endif
  #if defined ( ZDO_BIND_UNBIND_REQUEST ) || defined ( ZDO_ENDDEVICEBIND_REQUEST )
    case End_Device_Bind_rsp:
  #endif
      ZDO_ProcessBindUnbindRsp( srcAddr, clusterID, *asdu, TransSeq );
      break;
#endif

#if defined ( ZDO_MGMT_NWKDISC_REQUEST )
    case Mgmt_NWK_Disc_rsp:
      ZDO_ProcessMgmNwkDiscRsp( srcAddr, asdu, SecurityUse );
      break;
#endif

#if defined ( ZDO_MGMT_LQI_REQUEST )
    case Mgmt_Lqi_rsp:
      ZDO_ProcessMgmtLqiRsp( srcAddr, asdu, SecurityUse );
      break;
#endif

#if defined ( ZDO_MGMT_RTG_REQUEST )
    case Mgmt_Rtg_rsp:
      ZDO_ProcessMgmtRtgRsp( srcAddr, asdu, SecurityUse );
      break;
#endif

#if defined ( ZDO_MGMT_BIND_REQUEST )
    case Mgmt_Bind_rsp:
      ZDO_ProcessMgmtBindRsp( srcAddr, asdu, SecurityUse );
      break;
#endif

#if defined ( ZDO_MGMT_JOINDIRECT_REQUEST )
    case Mgmt_Direct_Join_rsp:
      ZDO_ProcessMgmtDirectJoinRsp( srcAddr, *asdu, SecurityUse );
      break;
#endif

#if defined ( ZDO_MGMT_LEAVE_REQUEST )
    case Mgmt_Leave_rsp:
      ZDO_ProcessMgmtLeaveRsp( srcAddr, *asdu, SecurityUse );
      break;
#endif

#if defined ( ZDO_MGMT_PERMIT_JOIN_REQUEST )
    case Mgmt_Permit_Join_rsp:
      ZDO_ProcessMgmtPermitJoinRsp( srcAddr, *asdu, SecurityUse );
      break;
#endif

#if defined ( ZDO_USERDESC_REQUEST )
    case User_Desc_rsp:
      ZDO_ProcessUserDescRsp( srcAddr, asdu, SecurityUse );
      break;
#endif

#if defined ( ZDO_SERVERDISC_REQUEST )
    case Server_Discovery_rsp:
      ZDO_ProcessServerDiscRsp( srcAddr, asdu, SecurityUse );
      break;
#endif

#if defined( ZDO_CACHE )
    case Discovery_Cache_rsp:
    case Discovery_store_rsp:
    case Remove_node_cache_rsp:
    case Find_node_cache_rsp:
    case Node_Desc_store_rsp:
    case Power_Desc_store_rsp:
    case Active_EP_store_rsp:
    case Simple_Desc_store_rsp:
    case Mgmt_Cache_rsp:
#if ( CACHE_DEV_MAX == 0 )
      ZDCacheProcessRsp( srcAddr, asdu, asduLen, clusterID, TransSeq );
#endif
      break;
#endif

    // Request messages
    case NWK_addr_req:
    case IEEE_addr_req:
      zdpProcessAddrReq( TransSeq, srcAddr, asdu, clusterID, SecurityUse );
      break;

    case Node_Desc_req:
      ZDO_ProcessNodeDescReq( TransSeq, srcAddr, asdu, SecurityUse );
      break;

    case Power_Desc_req:
      ZDO_ProcessPowerDescReq( TransSeq, srcAddr, asdu, SecurityUse );
      break;

    case Simple_Desc_req:
      ZDO_ProcessSimpleDescReq( TransSeq, srcAddr, asdu, SecurityUse );
      break;

    case Active_EP_req:
      ZDO_ProcessActiveEPReq( TransSeq, srcAddr, asdu, SecurityUse );
      break;

    case Match_Desc_req:
      ZDO_ProcessMatchDescReq( TransSeq, srcAddr, asdu, SecurityUse );
      break;

#if defined ( ZDO_COORDINATOR )
    case End_Device_Bind_req:
      ZDO_ProcessEndDeviceBindReq( TransSeq, srcAddr, asdu, SecurityUse );
      break;
#endif

#if defined ( REFLECTOR ) || defined ( ZDO_BIND_UNBIND_RESPONSE )
    case Bind_req:
    case Unbind_req:
      ZDO_ProcessBindUnbindReq( TransSeq, srcAddr, clusterID, asdu, SecurityUse );
      break;
#endif

#if defined ( ZDO_MGMT_NWKDISC_RESPONSE )
    case Mgmt_NWK_Disc_req:
      ZDO_ProcessMgmtNwkDiscReq( TransSeq, srcAddr, asdu, SecurityUse );
      break;
#endif

#if defined ( ZDO_MGMT_LQI_RESPONSE ) && defined ( RTR_NWK )
    case Mgmt_Lqi_req:
      ZDO_ProcessMgmtLqiReq( TransSeq, srcAddr, *asdu, SecurityUse );
      break;
#endif

#if defined ( ZDO_MGMT_RTG_RESPONSE ) && defined ( RTR_NWK )
    case Mgmt_Rtg_req:
      ZDO_ProcessMgmtRtgReq( TransSeq, srcAddr, *asdu, SecurityUse );
      break;
#endif

#if defined ( ZDO_MGMT_BIND_RESPONSE )
    case Mgmt_Bind_req:
      ZDO_ProcessMgmtBindReq( TransSeq, srcAddr, *asdu, SecurityUse );
      break;
#endif

#if defined ( ZDO_MGMT_JOINDIRECT_RESPONSE ) && defined ( RTR_NWK )
    case Mgmt_Direct_Join_req:
      ZDO_ProcessMgmtDirectJoinReq( TransSeq, srcAddr, asdu, SecurityUse );
      break;
#endif

#if defined ( ZDO_MGMT_LEAVE_RESPONSE )
    case Mgmt_Leave_req:
      ZDO_ProcessMgmtLeaveReq( TransSeq, srcAddr, asdu, SecurityUse );
      break;
#endif

#if defined ( ZDO_MGMT_PERMIT_JOIN_RESPONSE )  && defined ( RTR_NWK )
    case Mgmt_Permit_Join_req:
      ZDO_ProcessMgmtPermitJoinReq( TransSeq, srcAddr, asdu, SecurityUse );
      break;
#endif

#if defined ( ZDO_USERDESC_RESPONSE )
    case User_Desc_req:
      ZDO_ProcessUserDescReq( TransSeq, srcAddr, asdu, SecurityUse );
      break;
#endif

#if defined ( ZDO_USERDESCSET_RESPONSE )
    case User_Desc_set:
      ZDO_ProcessUserDescSet( TransSeq, srcAddr, asdu, SecurityUse );
      break;
#endif

#if defined ( ZDO_SERVERDISC_RESPONSE )
    case Server_Discovery_req:
      ZDO_ProcessServerDiscReq( TransSeq, srcAddr, asdu, SecurityUse );
      break;
#endif

#if defined ( ZDO_ENDDEVICE_ANNCE ) && defined ( RTR_NWK )
    case End_Device_annce:
      ZDO_ProcessEndDeviceAnnce( TransSeq, srcAddr, asdu, SecurityUse );
      break;
#endif

#if defined( ZDO_CACHE )
    case Discovery_Cache_req:
    case Discovery_store_req:
    case Remove_node_cache_req:
    case Find_node_cache_req:
    case Node_Desc_store_req:
    case Power_Desc_store_req:
    case Active_EP_store_req:
    case Simple_Desc_store_req:
    case Mgmt_Cache_req:
#if ( CACHE_DEV_MAX > 0 )
      ZDCacheProcessReq(srcAddr,asdu,asduLen,clusterID,TransSeq,SecurityUse);
#endif
      break;
#endif

    case Complex_Desc_req:
    case Complex_Desc_rsp:
    default:
      ZDApp_InMsgCB( TransSeq, srcAddr, wasBroadcast,
                     clusterID, asduLen, asdu, SecurityUse );
      break;
  }
}

/*********************************************************************
*********************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -