📄 zdprofile.c
字号:
*
* @param dstAddr - destination address
* @param nwkAddr - 16 bit address
* @param epIntf - endpoint/interface
* @param SecurityEnable - Security Options
*
* @return afStatus_t
*/
afStatus_t ZDP_SimpleDescReq( zAddrType_t *dstAddr, uint16 nwkAddr,
byte endPoint, byte SecurityEnable )
{
ZDP_TmpBuf[0] = LO_UINT16( nwkAddr );
ZDP_TmpBuf[1] = HI_UINT16( nwkAddr );
ZDP_TmpBuf[2] = endPoint;
return fillAndSend( &ZDP_TransID, dstAddr, Simple_Desc_req, 3 );
}
#endif // ZDO_SIMPLEDESC_REQUEST
#if defined ( ZDO_USERDESCSET_REQUEST )
/*********************************************************************
* @fn ZDP_UserDescSet
*
* @brief This builds and send a User_Desc_set message to set
* the user descriptor. This function sends unicast
* message to the destination device.
*
* @param dstAddr - destination address
* @param nwkAddr - 16 bit address
* @param UserDescriptor - user descriptor
* @param SecurityEnable - Security Options
*
* @return afStatus_t
*/
afStatus_t ZDP_UserDescSet( zAddrType_t *dstAddr, uint16 nwkAddr,
UserDescriptorFormat_t *UserDescriptor,
byte SecurityEnable )
{
byte *pBuf = ZDP_TmpBuf;
byte len = (UserDescriptor->len < AF_MAX_USER_DESCRIPTOR_LEN) ?
UserDescriptor->len : AF_MAX_USER_DESCRIPTOR_LEN;
byte addrLen = 2;
*pBuf++ = LO_UINT16( nwkAddr );
*pBuf++ = HI_UINT16( nwkAddr );
*pBuf++ = len;
addrLen = 3;
pBuf = osal_memcpy( pBuf, UserDescriptor->desc, len );
osal_memset( pBuf, AF_USER_DESCRIPTOR_FILL, AF_MAX_USER_DESCRIPTOR_LEN-len );
return fillAndSend( &ZDP_TransID, dstAddr, User_Desc_set, (AF_MAX_USER_DESCRIPTOR_LEN + addrLen) );
}
#endif // ZDO_USERDESCSET_REQUEST
#if defined ( ZDO_SERVERDISC_REQUEST )
/*********************************************************************
* @fn ZDP_ServerDiscReq
*
* @brief Build and send a Server_Discovery_req request message.
*
* @param serverMask - 16-bit bit-mask of server services being sought.
* @param SecurityEnable - Security Options
*
* @return afStatus_t
*/
afStatus_t ZDP_ServerDiscReq( uint16 serverMask, byte SecurityEnable )
{
byte *pBuf = ZDP_TmpBuf;
zAddrType_t dstAddr;
dstAddr.addrMode = AddrBroadcast;
dstAddr.addr.shortAddr = NWK_BROADCAST_SHORTADDR_DEVZCZR;
*pBuf++ = LO_UINT16( serverMask );
*pBuf = HI_UINT16( serverMask );
FillAndSendTxOptions( &ZDP_TransID, &dstAddr, Server_Discovery_req, 2,
((SecurityEnable) ? AF_EN_SECURITY : AF_TX_OPTIONS_NONE) );
}
#endif
#if defined ( ZDO_ENDDEVICE_ANNCE_REQUEST ) || defined ( ZDO_ENDDEVICE_ANNCE_GENERATE )
/*********************************************************************
* @fn ZDP_EndDeviceAnnce
*
* @brief This builds and send an End_Device_Annce
* message. This function sends a broadcast message.
*
* @param nwkAddr - 16 bit address of the device
* @param IEEEAddr - 64 bit address of the device
* @param capabilities - device capabilities. This field is only
* sent for v1.1 networks.
* @param SecurityEnable - Security Options
*
* @return afStatus_t
*/
afStatus_t ZDP_EndDeviceAnnce( uint16 nwkAddr, byte *IEEEAddr,
byte capabilities, byte SecurityEnable )
{
zAddrType_t dstAddr;
uint8 len;
dstAddr.addrMode = (afAddrMode_t)AddrBroadcast;
dstAddr.addr.shortAddr = NWK_BROADCAST_SHORTADDR;
ZDP_TmpBuf[0] = LO_UINT16( nwkAddr );
ZDP_TmpBuf[1] = HI_UINT16( nwkAddr );
osal_cpyExtAddr( &ZDP_TmpBuf[2], IEEEAddr );
len = 2 + Z_EXTADDR_LEN;
ZDP_TmpBuf[10] = capabilities;
len++;
return fillAndSend( &ZDP_TransID, &dstAddr, End_Device_annce, len );
}
#endif // ZDO_ENDDEVICE_ANNCE_REQUEST
/*********************************************************************
* Address Responses
*/
/*********************************************************************
* @fn zdpProcessAddrReq
*
* @brief Process an incoming NWK_addr_req or IEEE_addr_req message and then
* build and send a corresponding NWK_addr_rsp or IEEE_addr_rsp msg.
*
* @param inMsg - incoming message
*
* @return none
*/
void zdpProcessAddrReq( zdoIncomingMsg_t *inMsg )
{
uint8 reqType;
uint16 aoi = INVALID_NODE_ADDR;
uint8 *ieee = NULL;
reqType = inMsg->asdu[(inMsg->clusterID == NWK_addr_req) ? Z_EXTADDR_LEN : sizeof( uint16 ) ];
if ( inMsg->clusterID == NWK_addr_req )
{
ieee = inMsg->asdu;
if ( osal_ExtAddrEqual( saveExtAddr, ieee ) )
{
aoi = ZDAppNwkAddr.addr.shortAddr;
}
/*
else if ( reqType == ZDP_ADDR_REQTYPE_MEMBERSHIP )
{
//ggg - what to do?
}
*/
}
else // if ( inMsg->clusterID == IEEE_addr_req )
{
aoi = BUILD_UINT16( inMsg->asdu[0], inMsg->asdu[1] );
if ( aoi == ZDAppNwkAddr.addr.shortAddr )
{
ieee = saveExtAddr;
}
}
if ( (aoi != INVALID_NODE_ADDR) && (ieee != NULL) )
{
byte *pBuf = ZDP_TmpBuf;
// Status + IEEE-Addr + Nwk-Addr.
byte len = 1 + Z_EXTADDR_LEN + 2;
byte stat = ((reqType == ZDP_ADDR_REQTYPE_SINGLE)
|| (reqType == ZDP_ADDR_REQTYPE_EXTENDED)
|| ((reqType == ZDP_ADDR_REQTYPE_MEMBERSHIP)
&& (inMsg->clusterID == NWK_addr_req)) ) ? ZDP_SUCCESS : ZDP_INVALID_REQTYPE;
*pBuf++ = stat;
pBuf = osal_cpyExtAddr( pBuf, ieee );
*pBuf++ = LO_UINT16( aoi );
*pBuf++ = HI_UINT16( aoi );
#if defined( RTR_NWK )
if ( (reqType == ZDP_ADDR_REQTYPE_EXTENDED) &&
(aoi == ZDAppNwkAddr.addr.shortAddr) )
{
byte cnt = 0;
uint16 *list = AssocMakeList( &cnt );
if ( list != NULL )
{
byte idx = inMsg->asdu[(((inMsg->clusterID == NWK_addr_req) ? Z_EXTADDR_LEN : sizeof( uint16 )) + 1)];
uint16 *pList = list + idx;
// NumAssocDev field is only present on success.
if ( cnt > idx )
{
cnt -= idx;
len += (cnt * sizeof( uint16 ));
}
else
{
cnt = 0;
}
*pBuf++ = cnt;
len++;
// StartIndex field is only present if NumAssocDev field is non-zero.
*pBuf++ = idx;
len++;
while ( cnt != 0 )
{
*pBuf++ = LO_UINT16( *pList );
*pBuf++ = HI_UINT16( *pList );
pList++;
cnt--;
}
osal_mem_free( (uint8 *)list );
}
else
{
// NumAssocDev field is only present on success.
*pBuf++ = 0;
len++;
}
}
#endif
ZDP_TxOptions = AF_MSG_ACK_REQUEST;
fillAndSend( &(inMsg->TransSeq), &(inMsg->srcAddr),
(cId_t)(inMsg->clusterID | ZDO_RESPONSE_BIT), len );
ZDP_TxOptions = AF_TX_OPTIONS_NONE;
}
}
/*********************************************************************
* @fn ZDP_NodeDescMsg
*
* @brief Builds and sends a Node Descriptor message, unicast to the
* specified device.
*
* @param inMsg - incoming message
* @param nwkAddr - 16 bit network address for device
* @param pNodeDesc - pointer to the node descriptor
*
* @return afStatus_t
*/
afStatus_t ZDP_NodeDescMsg( zdoIncomingMsg_t *inMsg,
uint16 nwkAddr, NodeDescriptorFormat_t *pNodeDesc )
{
byte *pBuf = ZDP_TmpBuf;
byte len;
len = 1 + 2 + 10; // Status + nwkAddr + Node descriptor
*pBuf++ = ZDP_SUCCESS;
*pBuf++ = LO_UINT16( nwkAddr );
*pBuf++ = HI_UINT16( nwkAddr );
*pBuf++ = (byte)((pNodeDesc->ComplexDescAvail << 3) |
(pNodeDesc->UserDescAvail << 4) |
(pNodeDesc->LogicalType & 0x07));
*pBuf++ = (byte)((pNodeDesc->FrequencyBand << 3) | (pNodeDesc->APSFlags & 0x07));
*pBuf++ = pNodeDesc->CapabilityFlags;
*pBuf++ = pNodeDesc->ManufacturerCode[0];
*pBuf++ = pNodeDesc->ManufacturerCode[1];
*pBuf++ = pNodeDesc->MaxBufferSize;
*pBuf++ = pNodeDesc->MaxTransferSize[0];
*pBuf++ = pNodeDesc->MaxTransferSize[1];
*pBuf++ = LO_UINT16( pNodeDesc->ServerMask );
*pBuf++ = HI_UINT16( pNodeDesc->ServerMask );
return fillAndSend( &(inMsg->TransSeq), &(inMsg->srcAddr), Node_Desc_rsp, len );
}
/*********************************************************************
* @fn ZDP_PowerDescMsg
*
* @brief Builds and sends a Power Descriptor message, unicast to the
* specified device.
*
* @param inMsg - incoming message (request)
* @param nwkAddr - 16 bit network address for device
* @param pPowerDesc - pointer to the node descriptor
*
* @return afStatus_t
*/
afStatus_t ZDP_PowerDescMsg( zdoIncomingMsg_t *inMsg,
uint16 nwkAddr, NodePowerDescriptorFormat_t *pPowerDesc )
{
byte *pBuf = ZDP_TmpBuf;
byte len = 1 + 2 + 2; // Status + nwkAddr + Node Power descriptor.
*pBuf++ = ZDP_SUCCESS;
*pBuf++ = LO_UINT16( nwkAddr );
*pBuf++ = HI_UINT16( nwkAddr );
*pBuf++ = (byte)((pPowerDesc->AvailablePowerSources << 4)
| (pPowerDesc->PowerMode & 0x0F));
*pBuf++ = (byte)((pPowerDesc->CurrentPowerSourceLevel << 4)
| (pPowerDesc->CurrentPowerSource & 0x0F));
return fillAndSend( &(inMsg->TransSeq), &(inMsg->srcAddr), Power_Desc_rsp, len );
}
/*********************************************************************
* @fn ZDP_SimpleDescMsg
*
* @brief Builds and sends a Simple Descriptor message, unicast to the
* specified device.
*
* @param inMsg - incoming message (request)
* @param Status - message status (ZDP_SUCCESS or other)
* @param pSimpleDesc - pointer to the node descriptor
*
* @return afStatus_t
*/
afStatus_t ZDP_SimpleDescMsg( zdoIncomingMsg_t *inMsg, byte Status,
SimpleDescriptionFormat_t *pSimpleDesc )
{
uint8 *pBuf = ZDP_TmpBuf;
uint8 i, len;
if ( Status == ZDP_SUCCESS && pSimpleDesc )
{
// Status + NWKAddrOfInterest + desc length + empty simple descriptor.
len = 1 + 2 + 1 + 8;
len += (pSimpleDesc->AppNumInClusters + pSimpleDesc->AppNumOutClusters) * sizeof ( uint16 );
}
else
{
len = 2; // Status + desc length
}
if ( len >= ZDP_BUF_SZ-1 )
{
return afStatus_MEM_FAIL;
}
*pBuf++ = Status;
*pBuf++ = LO_UINT16( ZDAppNwkAddr.addr.shortAddr );
*pBuf++ = HI_UINT16( ZDAppNwkAddr.addr.shortAddr );
if ( len > 2 )
{
*pBuf++ = len - 4; // Simple descriptor length
*pBuf++ = pSimpleDesc->EndPoint;
*pBuf++ = LO_UINT16( pSimpleDesc->AppProfId );
*pBuf++ = HI_UINT16( pSimpleDesc->AppProfId );
*pBuf++ = LO_UINT16( pSimpleDesc->AppDeviceId );
*pBuf++ = HI_UINT16( pSimpleDesc->AppDeviceId );
*pBuf++ = (byte)(pSimpleDesc->AppDevVer << 4);
*pBuf++ = pSimpleDesc->AppNumInClusters;
if ( pSimpleDesc->AppNumInClusters )
{
for (i=0; i<pSimpleDesc->AppNumInClusters; ++i)
{
*pBuf++ = LO_UINT16( pSimpleDesc->pAppInClusterList[i] );
*pBuf++ = HI_UINT16( pSimpleDesc->pAppInClusterList[i] );
}
}
*pBuf++ = pSimpleDesc->AppNumOutClusters;
if ( pSimpleDesc->AppNumOutClusters )
{
for (i=0; i<pSimpleDesc->AppNumOutClusters; ++i)
{
*pBuf++ = LO_UINT16( pSimpleDesc->pAppOutClusterList[i] );
*pBuf++ = HI_UINT16( pSimpleDesc->pAppOutClusterList[i] );
}
}
}
else
{
*pBuf = 0; // Description Length = 0;
}
return fillAndSend( &(inMsg->TransSeq), &(inMsg->srcAddr), Simple_Desc_rsp, len );
}
/*********************************************************************
* @fn ZDP_EPRsp
*
* @brief This builds and send an endpoint list. Used in
* Active_EP_rsp and Match_Desc_Rsp
* message. This function sends unicast message to the
* requesting device.
*
* @param MsgType - either Active_EP_rsp or Match_Desc_Rsp
* @param dstAddr - destination address
* @param Status - message status (ZDP_SUCCESS or other)
* @param nwkAddr - Device's short address that this response describes
* @param Count - number of endpoint/interfaces in list
* @param pEPIntfList - Array of Endpoint/Interfaces
* @param SecurityEnable - Security Options
*
* @return afStatus_t
*/
afStatus_t ZDP_EPRsp( uint16 MsgType, byte TransSeq, zAddrType_t *dstAddr,
byte Status, uint16 nwkAddr, byte Count,
byte *pEPList,
byte SecurityEnable )
{
byte *pBuf = ZDP_TmpBuf;
byte len = 1 + 2 + 1; // Status + nwkAddr + endpoint/interface count.
byte txOptions;
if ( MsgType == Match_Desc_rsp )
txOptions = AF_MSG_ACK_REQUEST;
else
txOptions = 0;
*pBuf++ = Status;
*pBuf++ = LO_UINT16( nwkAddr );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -