搜索
bottom↓
回复: 19

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

[复制链接]

出0入0汤圆

发表于 2013-3-12 14:01:44 | 显示全部楼层 |阅读模式
大家好!今天在这里送上我的第五篇分享。
大家都知道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 );
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2013-3-12 14:21:45 | 显示全部楼层
很好         
头像被屏蔽

出0入0汤圆

发表于 2013-3-14 11:05:19 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

 楼主| 发表于 2013-3-14 14:56:48 | 显示全部楼层
zigbee_luo 发表于 2013-3-14 11:05
有没有试过AES加密?

加密到没试过,一般情况下都用不到呀,呵呵
头像被屏蔽

出0入0汤圆

发表于 2013-3-15 09:02:41 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

 楼主| 发表于 2013-3-16 22:25:23 | 显示全部楼层
zigbee_luo 发表于 2013-3-15 09:02
听说过协议分析仪没,直接抓你包,你的数据全部就曝光了。

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

出0入0汤圆

发表于 2013-3-17 12:11:57 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2013-8-26 00:43:39 | 显示全部楼层
不懂。。。。

出0入0汤圆

 楼主| 发表于 2013-8-26 09:27:47 | 显示全部楼层
I爱电子 发表于 2013-8-26 00:43
不懂。。。。

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

出0入0汤圆

发表于 2013-12-17 17:54:31 | 显示全部楼层
请问一下楼主,第四种方法你现在搞定了吗?

出0入0汤圆

发表于 2013-12-17 20:00:00 | 显示全部楼层
先MARK一下!!

出0入0汤圆

发表于 2013-12-18 15:22:02 | 显示全部楼层
支持!楼主加油,以后上更多ZIGBEE的资料给我们学习

出10入95汤圆

发表于 2013-12-23 09:28:06 | 显示全部楼层
zigbee 协议栈绑定

出0入0汤圆

发表于 2014-5-5 11:20:17 | 显示全部楼层
正想弄这个呢,感谢楼主

出0入0汤圆

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

出0入0汤圆

 楼主| 发表于 2014-5-6 21:30:44 | 显示全部楼层
werewofe 发表于 2014-5-5 17:11
楼主,你方式一中的回调处理函数在协调器中,还是在节点中?

是在节点中

出0入0汤圆

发表于 2014-5-6 23:41:06 | 显示全部楼层

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

出0入0汤圆

 楼主| 发表于 2014-5-9 10:56:49 | 显示全部楼层
werewofe 发表于 2014-5-6 23:41
协调器中需要做什么处理吗?

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

出0入0汤圆

发表于 2014-8-5 08:07:34 | 显示全部楼层
学习了..刚看到这部分内容..

出0入0汤圆

发表于 2016-2-25 10:54:38 | 显示全部楼层
正学习中,MARK备忘
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-16 13:40

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表