ZigBee(Z-stack)四種綁定方式的程序實現方法

ZigBee(Z-stack)四種綁定方式的程序實現方法

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 );







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章