http://bbs.feibit.com/thread-9530-1-1.html
大家好!
大家都知道Z-stack有四種綁定方式:1、兩個節點分别通過按鍵機制調用ZDP_EndDeviceBindReq函數; 2、Match方式; 3、ZDP_BindReq和ZDP_UnbindReq方式; 4、手工管理綁定表。很多人明白這四種綁定方式的原理,但具體的程式事項方法可能并不清楚,今天我在這裡送上這四種綁定方式具體的程式時序實作方法,希望能對大家有所幫助。
一、兩個節點分别通過按鍵機制調用ZDP_EndDeviceBindReq函數
這種綁定方式必須要有協調器裝置存在,兩個裝置通過按鍵在一定時間間隔内(預設為15秒)調用ZDP_EndDeviceBindReq函數完成綁定。首先要在初始化程式中注冊End_Device_Bind_rsp程序,然後按鍵綁定請求程式如下:
http://bbs.feibit.com/thread-9530-1-1.html
if(Up_down_mark==1)
{
Up_down_mark=0;
HalLedSet ( HAL_LED_2, HAL_LED_MODE_ON );
// Initiate an End Device Bind Request for the mandatory endpoint
dstAddr.addrMode = Addr16Bit;
dstAddr.addr.shortAddr = 0x0000; // Coordinator
ZDP_EndDeviceBindReq( &dstAddr, NLME_GetShortAddr(),
ZG_Serial_Control_epDesc.endPoint,
ZG_Serial_Control_PROFID,
ZG_Serial_Control_MAX_CLUSTERS, (cId_t *)ZG_Serial_Control_ClusterList,
ZG_Serial_Control_MAX_CLUSTERS, (cId_t *)ZG_Serial_Control_ClusterList,
FALSE );
}
回調處理函數如下:
case End_Device_Bind_rsp:
if ( ZDO_ParseBindRsp( inMsg ) == ZSuccess )
{
HalLedSet ( HAL_LED_2, HAL_LED_MODE_OFF );
}
break;
二、Match方式
這種綁定方式無需協調器裝置存在,可采用按鍵機制來實作。首先在初始化函數中注冊Match_Desc_rsp程序,然後按鍵請求函數如下:
if(Right_left_mark==1)
{
Right_left_mark=0;
HalLedSet ( HAL_LED_2, HAL_LED_MODE_ON );
// Initiate a Match Description Request (Service Discovery)
dstAddr.addrMode = AddrBroadcast;
dstAddr.addr.shortAddr = NWK_BROADCAST_SHORTADDR;
ZDP_MatchDescReq( &dstAddr, NWK_BROADCAST_SHORTADDR,
ZG_Serial_Control_PROFID,
ZG_Serial_Control_MAX_CLUSTERS, (cId_t *)ZG_Serial_Control_ClusterList,
ZG_Serial_Control_MAX_CLUSTERS, (cId_t *)ZG_Serial_Control_ClusterList,
FALSE );
}
回調處理函數如下:
case Match_Desc_rsp:
{
ZDO_ActiveEndpointRsp_t *pRsp = ZDO_ParseEPListRsp( inMsg );
if ( pRsp )
{
if ( pRsp->status == ZSuccess && pRsp->cnt )
{
ZG_Serial_Control_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
ZG_Serial_Control_DstAddr.addr.shortAddr = pRsp->nwkAddr;
// Take the first endpoint, Can be changed to search through endpoints
ZG_Serial_Control_DstAddr.endPoint = pRsp->epList[0];
// Light LED
HalLedSet( HAL_LED_2, HAL_LED_MODE_OFF );
}
osal_mem_free( pRsp );
}
}
break;
三、ZDP_BindReq和ZDP_UnbindReq方式
這種綁定方式需要第三方裝置輔助完成,即假如A裝置和B裝置想進行綁定,A為源裝置,B為目标裝置,這時需要一個C裝置來發起綁定,C裝置需要知道A裝置和B裝置端點号、簇ID号和64位IEEE 位址。首先需要注冊Bind_rsp/Unbind_rsp,然後綁定請求函數如下:
destAddr.addrMode = Addr16Bit;
destAddr.addr.shortAddr = BUILD_UINT16( Uart_buf[1], Uart_buf[2] ); //目标裝置網絡位址
osal_cpyExtAddr(Bind_SourceAddr,&Uart_buf[3]);
devAddr.addrMode = Addr64Bit;
osal_cpyExtAddr( devAddr.addr.extAddr, &Uart_buf[11] );
ZDP_BindReq( &destAddr,
Bind_SourceAddr,
ZG_Serial_Control_ENDPOINT,
ZG_Serial_Control_CLUSTERID,
&devAddr,
ZG_Serial_Control_ENDPOINT,
0 );
回調處理函數如下:
if ( ZDO_ParseBindRsp( inMsg ) == ZSuccess )//綁定成功
HalLedSet( HAL_LED_2, HAL_LED_MODE_OFF );
四、手工管理綁定表
這種方式是最靈活的方式,不過目前我隻實作了子節點對其父節點的綁定,而無法實作對非父節點的綁定,原因尚不清楚,若有朋友清楚還請告訴我,謝謝!
綁定表添加綁定程式:
BindAddr.addrMode = Addr64Bit;
osal_cpyExtAddr( BindAddr.addr.extAddr, &Uart_buf[1] );
bindAddEntry(ZG_Serial_Control_ENDPOINT,
&BindAddr,
ZG_Serial_Control_ENDPOINT,
ZG_Serial_Control_MAX_CLUSTERS,
ZG_Serial_Control_ClusterList);
綁定表删除綁定條目:
BindAddr.addrMode = Addr64Bit;
osal_cpyExtAddr( BindAddr.addr.extAddr, &Uart_buf[1] );
pBindingTable = bindFindExisting( ZG_Serial_Control_ENDPOINT,
&BindAddr,
ZG_Serial_Control_ENDPOINT );
bindRemoveEntry( pBindingTable );