📄 zdprofile.c
字号:
// 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 + -