seewolf 发表于 2013-3-12 14:01:44

ZigBee(Z-stack)四种绑定方式的程序实现方法

大家好!今天在这里送上我的第五篇分享。
大家都知道Z-stack有四种绑定方式:1、两个节点分别通过按键机制调用ZDP_EndDeviceBindReq函数; 2、Match方式; 3、ZDP_BindReq和ZDP_UnbindReq方式; 4、手工管理绑定表。很多人明白这四种绑定方式的原理,但具体的程序事项方法可能并不清楚,今天我在这里送上这四种绑定方式具体的程序时序实现方法。
一、两个节点分别通过按键机制调用ZDP_EndDeviceBindReq函数
这种绑定方式必须要有协调器设备存在,两个设备通过按键在一定时间间隔内(默认为15秒)调用ZDP_EndDeviceBindReq函数完成绑定。首先要在初始化程序中注册End_Device_Bind_rsp进程,然后按键绑定请求程序如下: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;

            // 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, Uart_buf ); //目标设备网络地址
                osal_cpyExtAddr(Bind_SourceAddr,&Uart_buf);
               
                devAddr.addrMode = Addr64Bit;
                osal_cpyExtAddr( devAddr.addr.extAddr, &Uart_buf );
               
                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 );
                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 );
                pBindingTable = bindFindExisting( ZG_Serial_Control_ENDPOINT,
                                                &BindAddr,
                                                ZG_Serial_Control_ENDPOINT );
               
                bindRemoveEntry( pBindingTable );

ljt80158015 发表于 2013-3-12 14:21:45

很好         

zigbee_luo 发表于 2013-3-14 11:05:19

seewolf 发表于 2013-3-14 14:56:48

zigbee_luo 发表于 2013-3-14 11:05 static/image/common/back.gif
有没有试过AES加密?

加密到没试过,一般情况下都用不到呀,呵呵

zigbee_luo 发表于 2013-3-15 09:02:41

seewolf 发表于 2013-3-16 22:25:23

zigbee_luo 发表于 2013-3-15 09:02 static/image/common/back.gif
听说过协议分析仪没,直接抓你包,你的数据全部就曝光了。

呵呵~协议分析仪必然知道啊,不然怎么搞zigbee。不过也没太大的必要,我们不是什么需要严格保密的行业,也没人那么无聊去攻击我们的设备

zigbee_luo 发表于 2013-3-17 12:11:57

I爱电子 发表于 2013-8-26 00:43:39

不懂。。。。

seewolf 发表于 2013-8-26 09:27:47

I爱电子 发表于 2013-8-26 00:43 static/image/common/back.gif
不懂。。。。

呵呵~你搞zigbee么?如果搞的话应该能看懂

Stormbreaker 发表于 2013-12-17 17:54:31

请问一下楼主,第四种方法你现在搞定了吗?

与狼共舞 发表于 2013-12-17 20:00:00

先MARK一下!!

青蛙小雪 发表于 2013-12-18 15:22:02

支持!楼主加油,以后上更多ZIGBEE的资料给我们学习

ddcour 发表于 2013-12-23 09:28:06

zigbee 协议栈绑定

werewofe 发表于 2014-5-5 11:20:17

正想弄这个呢,感谢楼主

werewofe 发表于 2014-5-5 17:11:05

楼主,你方式一中的回调处理函数在协调器中,还是在节点中?

seewolf 发表于 2014-5-6 21:30:44

werewofe 发表于 2014-5-5 17:11
楼主,你方式一中的回调处理函数在协调器中,还是在节点中?

是在节点中

werewofe 发表于 2014-5-6 23:41:06

seewolf 发表于 2014-5-6 21:30
是在节点中

协调器中需要做什么处理吗?

seewolf 发表于 2014-5-9 10:56:49

werewofe 发表于 2014-5-6 23:41
协调器中需要做什么处理吗?

不需要,只要网络中又协调器就行了

fafuzhao 发表于 2014-8-5 08:07:34

学习了..刚看到这部分内容..

enwa 发表于 2016-2-25 10:54:38

正学习中,MARK备忘
页: [1]
查看完整版本: ZigBee(Z-stack)四种绑定方式的程序实现方法