zigbee學習筆記——四種地址繫結模式
阿新 • • 發佈:2019-01-31
ZDP_MatchDescReq( &dstAddr, NWK_BROADCAST_SHORTADDR,
SERIALAPP_PROFID,
SERIALAPP_MAX_CLUSTERS, (cId_t *)SerialApp_ClusterList,
SERIALAPP_MAX_CLUSTERS, (cId_t *)SerialApp_ClusterList,
FALSE ); 也叫匹配描述符繫結,一般相當於廣播繫結,網路中可能有一個或多個與本節點埠匹配的裝置,本節點只接受其中一個節點的裝置資訊,既一對一繫結。處理函式是: case Match_Desc_rsp:
{
ZDO_ActiveEndpointRsp_t *pRsp = ZDO_ParseEPListRsp( inMsg );
if ( pRsp )
{
if ( pRsp->status == ZSuccess && pRsp->cnt )
{
SerialApp_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
SerialApp_DstAddr.addr.shortAddr = pRsp->nwkAddr;
// Take the first endpoint, Can be changed to search through endpoints
SerialApp_DstAddr.endPoint = pRsp->epList[0];
// Light LED
HalLedSet( HAL_LED_4, HAL_LED_MODE_ON );
}
osal_mem_free( pRsp );
}
}
也叫終端繫結,當按鍵按下時,呼叫函式 ZDP_EndDeviceBindReq( &dstAddr, NLME_GetShortAddr(),
SerialApp_epDesc.endPoint,
SERIALAPP_PROFID,
SERIALAPP_MAX_CLUSTERS, (cId_t *)SerialApp_ClusterList,
SERIALAPP_MAX_CLUSTERS, (cId_t *)SerialApp_ClusterList,
FALSE ); 終端繫結實際上是兩個終端裝置通過與協調器繫結,實現兩個終端裝置之間互相通訊。處理函式 case End_Device_Bind_rsp: 廣播模式一般採用匹配符繫結方式,和直接地址模式相似,只是在傳送函式中加入下列語句 SerialApp_DstAddr.addrMode = (afAddrMode_t)AddrBroadcast;//自己新增 SerialApp_DstAddr.addr.shortAddr = 0xffff;//自己修改,用於協調器廣播 然後會呼叫 AF_DataRequest函式,這樣既可以將協調器資料發給網路中的所有裝置。 aps_Group_t SerialApp_Group;
SerialApp_Group.ID = 0x0001;
osal_memcpy(SerialApp_Group.name,"Broad Group",11);
static afAddrType_t SerialApp_GrpDstAddr;
SerialApp_GrpDstAddr.addrMode = (afAddrMode_t)afAddrGroup;
SerialApp_GrpDstAddr.endPoint = SERIALAPP_ENDPOINT;
SerialApp_GrpDstAddr.addr.shortAddr = SerialApp_Group.ID; aps_AddGroup(SERIALAPP_ENDPOINT,&SerialApp_Group);
SERIALAPP_PROFID,
SERIALAPP_MAX_CLUSTERS, (cId_t *)SerialApp_ClusterList,
SERIALAPP_MAX_CLUSTERS, (cId_t *)SerialApp_ClusterList,
FALSE ); 也叫匹配描述符繫結,一般相當於廣播繫結,網路中可能有一個或多個與本節點埠匹配的裝置,本節點只接受其中一個節點的裝置資訊,既一對一繫結。處理函式是: case Match_Desc_rsp:
{
ZDO_ActiveEndpointRsp_t *pRsp = ZDO_ParseEPListRsp( inMsg );
if ( pRsp )
{
if ( pRsp->status == ZSuccess && pRsp->cnt )
{
SerialApp_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
SerialApp_DstAddr.addr.shortAddr = pRsp->nwkAddr;
// Take the first endpoint, Can be changed to search through endpoints
SerialApp_DstAddr.endPoint = pRsp->epList[0];
// Light LED
HalLedSet( HAL_LED_4, HAL_LED_MODE_ON );
}
osal_mem_free( pRsp );
}
}
也叫終端繫結,當按鍵按下時,呼叫函式 ZDP_EndDeviceBindReq( &dstAddr, NLME_GetShortAddr(),
SerialApp_epDesc.endPoint,
SERIALAPP_PROFID,
SERIALAPP_MAX_CLUSTERS, (cId_t *)SerialApp_ClusterList,
SERIALAPP_MAX_CLUSTERS, (cId_t *)SerialApp_ClusterList,
FALSE ); 終端繫結實際上是兩個終端裝置通過與協調器繫結,實現兩個終端裝置之間互相通訊。處理函式 case End_Device_Bind_rsp: 廣播模式一般採用匹配符繫結方式,和直接地址模式相似,只是在傳送函式中加入下列語句 SerialApp_DstAddr.addrMode = (afAddrMode_t)AddrBroadcast;//自己新增 SerialApp_DstAddr.addr.shortAddr = 0xffff;//自己修改,用於協調器廣播 然後會呼叫 AF_DataRequest函式,這樣既可以將協調器資料發給網路中的所有裝置。 aps_Group_t SerialApp_Group;
SerialApp_Group.ID = 0x0001;
osal_memcpy(SerialApp_Group.name,"Broad Group",11);
static afAddrType_t SerialApp_GrpDstAddr;
SerialApp_GrpDstAddr.addrMode = (afAddrMode_t)afAddrGroup;
SerialApp_GrpDstAddr.endPoint = SERIALAPP_ENDPOINT;
SerialApp_GrpDstAddr.addr.shortAddr = SerialApp_Group.ID; aps_AddGroup(SERIALAPP_ENDPOINT,&SerialApp_Group);