当前位置: 首页 > 工具软件 > Switch Light > 使用案例 >

Zstack3.0 之switch与light组网绑定流程

苗运珧
2023-12-01

协议栈版本: ZStack 3.0.1

3.1 BDB  概念
    在 ZigBee3.0 中,很重要的一点是提出了 BDB 的服务结构,BDB(BaseDevice Behavior)也就是“设备基本行为”,比如网络的建立,设备的入网、绑定、等功能被放到 BDB 框架中进行使用,BDB 在工程中的体现:

BDB 有几个概念:BDB Commissioning Modes、BDB Security、ResetMethods availablewith BDB。
本章主要讲解 BDB Commissioning Modes。
3.2 BDB Commissioning Modes
    Commissioning 用中文进行直译(“调试”、“尝试运作”)其实很奇怪,所以我们索性不做中文翻译,Commisioning Modes 有如下几个服务模式:
Touchlink (可选功能):
    这是一种设备入网的方式,在以前的 ZLL 协议中使用,加网的方式是两个设备靠得很近,然后通过按键触发 Touchlink(可以理解为发送特殊的无线数据包,这种数据包叫 Touchlink),设备会检测信号强度(靠得越近信号当然越强),然后决定是否允许该设备加入网络中!
Network Steering (强制使用):
网络操作。有两种情况:
1. 如果设备已经在网络中,那么打开允许入网标志(只有路由器可以打开),允许入网标志指的是一个设备是否允许其他设备通过他加入网络,允许入网一般会有个时间周期,比如 60 秒,时间到了后就关闭该标志!
2. 如果设备没有在网络中,那么尝试寻找一个合适的网络加入,如果加入成功,那么打开允许入网标志。
Network Formation(协调器为强制使用,路由器为可选功能)
1. 如果是协调器,那么会建立一个中心信任的安全网络。
2. 如果是路由器,那么如果没有找到合适的网络加入,会建立一个分布式的安全网络。这里必须理解什么是中心信任网络,简单来讲,就是协调器作为信任中心,所有想加入网络的设备都得经过信任中心同意才能加入该网络,方法是交换网络私钥,信任中心同意才会颁发网络私钥给入网设备!
Finding and Binding(强制使用但依赖于定义的端点)
    发现绑定。如果设备在网络中,就会调用该服务!
    首先我们得理解绑定这个概念,用一个简单的例子做说明,比如插座有开关这个 InCluster,而协调器同样有开关 OutCluster,也就是说协调器可以对插座发开关命令,那么协调器的这个 OutCluster 就可以和插座的 InCluster 进行绑定,当然协调器可以和多个插座做绑定操作!Finding and Binding(F & B),首先是寻找有没有可以绑定的目标设备,如果找到了(目标设备主动回复),那么尝试进行绑定操作!
** 程序实例
我们可以在工程中找到 BDB Commissioning Modes 的 API:

同样可以找到 Commissioning Mode 的定义如下:

有了上面的信息,我们就可以使用 Commissioning Mode 了:


3.3 ZigBee  网络创建及入网
去除应用层 UI 功能


    这两个文件是针对 TI 自己的评估板设计的交互界面,在实际使用中我们并不需要 UI,而且反而会影响到我们的开发,因此可以直接去掉这两个文件:

然后在文件 zcl_samplesw.c 中根据搜索结果一个个删除:


** 配置协调器组建网络及设备入网程序
    程序添加在 zcl_samplesw.c 中的初始化函数中,由于协调器和路由器/终端设备虽然工程不同,但是都共用了同个文件,所以我们必须根据不同的网络设备类型进行功能的区分。
    


知识点:
1. 宏 ZDO_COORDINATOR 如果被定义,说明是协调器,否则就是路由器或者终端设备!
2. NLME_PermitJoiningRequest(255);用来开启当前设备入网允许时间,255 表示永远开启,如果设置为 0 表示关闭,1~254 表示时间(单位是秒)!
** 设备入网失败的解决方法
    首先,在应用程序文件 zcl_samplesw.c 中可以找到一个函数:zclSampleSw_ProcessCommissioningStatus,这个函数的作用是处理Commissioning 返回的结果,比如组建网络是否成功,加入网络是否成功等。如果我们设备入网失败,就会来到这个函数,那么应该在相应的位置设置一个事件,比如 1 秒后重新尝试入网。因此我们需要定义一个事件,当设备加入网络失败时,就会启动该事件,然后重新调用入网函数:

事件定义在头文件 zcl_samplesw.h 中:

找到函数 zclSampleSw_ProcessCommissioningStatus

在入网失败的地方添加代码,启动设备重新入网事件:

最后在应用层事件处理函数中处理该事件,也就是重新启动入网:


** 编译下载
首先选择协调器,编译完成后下载到其中一块开发板中:

接着选择路由器(或者终端设备),同样编译完成后下载到另一个板子中:

** 仿真调试
给协调器和路由器/终端设备上电,我们可以看到:
1. 协调器组建网络,组建成功后可以看到网络 ID 也就是 PanID:

2. 设备入网后会拿到分配的网络地址,并显示父节点的网络地址:
路由器:

终端设备:

能看到这样的信息说明网络已经组建成功了!
 类似资料: