zoukankan      html  css  js  c++  java
  • 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进程,然后按键绑定请求程序如下:

    1. if(Up_down_mark==1)
    2.           {
    3.               Up_down_mark=0;
    4.               HalLedSet ( HAL_LED_2, HAL_LED_MODE_ON );
    5.               // Initiate an End Device Bind Request for the mandatory endpoint
    6.               dstAddr.addrMode = Addr16Bit;
    7.               dstAddr.addr.shortAddr = 0x0000; // Coordinator
    8.               ZDP_EndDeviceBindReq( &dstAddr, NLME_GetShortAddr(), 
    9.                                     ZG_Serial_Control_epDesc.endPoint,
    10.                                     ZG_Serial_Control_PROFID,
    11.                                     ZG_Serial_Control_MAX_CLUSTERS, (cId_t *)ZG_Serial_Control_ClusterList,
    12.                                     ZG_Serial_Control_MAX_CLUSTERS, (cId_t *)ZG_Serial_Control_ClusterList,
    13.                                     FALSE );
    14.               
    15.           }
    复制代码
    回调处理函数如下:
    1. case End_Device_Bind_rsp:
    2.       if ( ZDO_ParseBindRsp( inMsg ) == ZSuccess )
    3.       {
    4.         HalLedSet ( HAL_LED_2, HAL_LED_MODE_OFF );
    5.       }
    6.       break;
    复制代码
    二、Match方式
    这种绑定方式无需协调器设备存在,可采用按键机制来实现。首先在初始化函数中注册Match_Desc_rsp进程,然后按键请求函数如下:
    1. if(Right_left_mark==1)
    2.           {
    3.               Right_left_mark=0;
    4.               HalLedSet ( HAL_LED_2, HAL_LED_MODE_ON );
    5.               // Initiate a Match Description Request (Service Discovery)
    6.               dstAddr.addrMode = AddrBroadcast;
    7.               dstAddr.addr.shortAddr = NWK_BROADCAST_SHORTADDR;
    8.               ZDP_MatchDescReq( &dstAddr, NWK_BROADCAST_SHORTADDR,
    9.                                 ZG_Serial_Control_PROFID,
    10.                                 ZG_Serial_Control_MAX_CLUSTERS, (cId_t *)ZG_Serial_Control_ClusterList,
    11.                                 ZG_Serial_Control_MAX_CLUSTERS, (cId_t *)ZG_Serial_Control_ClusterList,
    12.                                 FALSE );
    13.           }
    复制代码
    回调处理函数如下:
    1. case Match_Desc_rsp:
    2.       {  
    3.         ZDO_ActiveEndpointRsp_t *pRsp = ZDO_ParseEPListRsp( inMsg );
    4.         if ( pRsp )
    5.         {
    6.           if ( pRsp->status == ZSuccess && pRsp->cnt )
    7.           {
    8.             ZG_Serial_Control_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
    9.             ZG_Serial_Control_DstAddr.addr.shortAddr = pRsp->nwkAddr;
    10.             // Take the first endpoint, Can be changed to search through endpoints
    11.             ZG_Serial_Control_DstAddr.endPoint = pRsp->epList[0];
    12.             // Light LED
    13.             HalLedSet( HAL_LED_2, HAL_LED_MODE_OFF );
    14.           }
    15.           osal_mem_free( pRsp );
    16.         }
    17.       }
    18.       break;
    复制代码
    三、ZDP_BindReq和ZDP_UnbindReq方式
    这种绑定方式需要第三方设备辅助完成,即假如A设备和B设备想进行绑定,A为源设备,B为目标设备,这时需要一个C设备来发起绑定,C设备需要知道A设备和B设备端点号、簇ID号和64位IEEE 地址。首先需要注册Bind_rsp/Unbind_rsp,然后绑定请求函数如下:
    1. destAddr.addrMode = Addr16Bit;
    2.                 destAddr.addr.shortAddr = BUILD_UINT16( Uart_buf[1], Uart_buf[2] ); //目标设备网络地址
    3.                 osal_cpyExtAddr(Bind_SourceAddr,&Uart_buf[3]);
    4.                 
    5.                 devAddr.addrMode = Addr64Bit;
    6.                 osal_cpyExtAddr( devAddr.addr.extAddr, &Uart_buf[11] );
    7.                 
    8.                 ZDP_BindReq( &destAddr,
    9.                              Bind_SourceAddr,
    10.                              ZG_Serial_Control_ENDPOINT,
    11.                              ZG_Serial_Control_CLUSTERID,
    12.                              &devAddr,
    13.                              ZG_Serial_Control_ENDPOINT,
    14.                              0 );
    复制代码
    回调处理函数如下:
    1. if ( ZDO_ParseBindRsp( inMsg ) == ZSuccess )//绑定成功
    2.       HalLedSet( HAL_LED_2, HAL_LED_MODE_OFF );   
    复制代码
    四、手工管理绑定表
    这种方式是最灵活的方式,不过目前我只实现了子节点对其父节点的绑定,而无法实现对非父节点的绑定,原因尚不清楚,若有朋友清楚还请告诉我,谢谢!
    绑定表添加绑定程序:
    1. BindAddr.addrMode = Addr64Bit;
    2.                 osal_cpyExtAddr( BindAddr.addr.extAddr, &Uart_buf[1] );
    3.                 bindAddEntry(ZG_Serial_Control_ENDPOINT,
    4.                              &BindAddr,
    5.                              ZG_Serial_Control_ENDPOINT,
    6.                              ZG_Serial_Control_MAX_CLUSTERS,
    7.                              ZG_Serial_Control_ClusterList);
    复制代码
    绑定表删除绑定条目:
    1. BindAddr.addrMode = Addr64Bit;
    2.                 osal_cpyExtAddr( BindAddr.addr.extAddr, &Uart_buf[1] );
    3.                 pBindingTable = bindFindExisting( ZG_Serial_Control_ENDPOINT,
    4.                                                   &BindAddr,
    5.                                                   ZG_Serial_Control_ENDPOINT );
    6.                 
    7.                 bindRemoveEntry( pBindingTable );
    复制代码
     
  • 相关阅读:
    装饰器模块和面试题
    装饰器和推导式
    设计商城系统,主要提供两个功能:商品管理、会员管理。
    写代码:三级菜单
    写代码:循环打印names列表,把元素和索引值都打印出来。
    写代码: 编写登录接口
    写代码:假设一年期定期利率为3.25%,计算一下需要过多少年,一万元的一年定期存款连本带息能翻番?
    写代码:输入一年份,判断该年份是否是闰年并输出结果。
    写代码:制作趣味模板程序
    变量n1和n2是什么关系
  • 原文地址:https://www.cnblogs.com/NL34/p/3524674.html
Copyright © 2011-2022 走看看