ZigBee 设备用户指导
一、重要简称
ACE: Ancillary Control Equipment APDU: Application Protocol Data Unit API: Application Programming Interface BDB: Base Device Behavior CIE: Control and Indicating Equipment DRLC: Demand-Response and Load Control HA: Home Automation IAS: Intruder Alarm System SDK: Software Developer’s Kit SE: Smart Energy WD: Warning Device ZBD: ZigBee Base Device //这是一个处理诸如网络启动等基本操作的标准设备类型。此设备不需要端点。 ZDO: ZigBee Device Objects //这表示 ZigBee 节点类型(协调器、路由器或终端设备)并且具有多个通信角色。该设备占用端点 0。 ZCL: ZigBee Cluster Library ZLO: ZigBee Lighting and Occupancy ZPS: ZigBee PRO Stack MCPS: MAC common part sublayer Mlme: MAC Layer Management Entity
二、简单介绍
2.1、设备类型
ZigBee 无线网络的节点是基于设备类型定义,设备类型是软件实体它决定了设备的功能【如 EndDevice、Router、Coordinator】。设备类型定义组成这个功能的簇集合。因此,簇是设备功能的基本构建块。有些簇是强制性的,有些是可选的。设备是设备类型的实例。网络节点可以支持多个设备类型。设备类型的应用程序运行在一个称为端点的软件实体上,每个节点最多可以达到 240 个端点,编号从 1 开始。
2.2、软件架构 更多详细软件架构信息, 请参考 ZigBee 3.0 用户指导(JN-UG-3113)。
2.3、共享设备结构体
ZigBee3.0 网络中的基本操作涉及读取和设置设备簇的属性值。在每个设备中,通过共享结构在应用程序和 ZigBee 簇库(ZCL)之间交换属性值。这种结构由互斥体保护(在 ZCL 用户指南(JN-UG-3115)中描述)。特定设备的结构包含由该设备支撑的簇的结构。
共享设备结构可以用以下任一种方式使用: 本地应用程序将属性值写入结构,允许 ZCL 响应与这些属性相关的命令。 ZCL 解析将属性值写入结构的传入命令。然后可以由本地应用程序读取写入值。
2.4、 端点回调函数
必须为所使用的每个端点提供用户定义的回调函数,当与端点有关的事件(如传入消息)发生时,将调用该回调函数。当使用端点支持的设备类型的注册函数注册端点时,将注册回调函数。例如,使用 eZLO_RegisterOnOffLightEndPoint() 函数来开启/关闭光设备。端点回调函数具有下面给出的类型定义:typedef void (* tfpZCL_ZCLCallBackFunction) (tsZCL_CallBackEvent *pCallBackEvent); pCallBackEvent 是一个指向事件的指针。 Note: 没有关联端点的事件是通过通用堆栈提供的回调函数 APP_vGenCallback()。 例如,应用程序可以通过这个回调函数接收堆栈离开和加入事件。在 ZigBee3.0 栈用户指南(JN-UG-3113)中描述堆栈事件。
三、ZigBee 基础设备(ZigBee Base Device)
ZigBee 基础设备(ZBD)是 ZigBee3.0 网络的所有节点上的强制设备。它与一个或多个其他 ZigBee 设备类型一起存在于节点上,但不需要端点。ZigBee 基础设备提供了使用 ZigBee 设备类型的框架。它实现所有节点可能需要的基本功能,并确保所有节点之间的一致行为,特别是关于网络创建和加入以及网络安全。
它是 ZigBee 应用层上面的纯接口层,提供了设备操作网络相关的交互行为,也就是 BDB 已经概况总结了可能的人机操作网络的行为(例如,建立网络/加入网络/离开网络),并且规划成接口,方便应用层直接调用,从而进一步规范厂商的应用行为,达到标准化。 提示:这里之所以总结为纯接口层,是因为其未在 ZigBee 帧上面产生数据行为。
从功能上划分面归纳如下行为:
3.1、Commissioning
网络启动包括以下活动: - 创建网络
- 允许设备加入网络(通过本地节点)
- 加入网络
- 将本地端点绑定到远程节点上的端点
- 将一个远程节点添加到一个组
可以由单个节点执行的启动活动取决于 ZigBee 节点类型(协调器、路由器、终端设备)和为该节点使能的启动模式。通过 ZigBee 基础设备可获得多种不同的启动模式。
通过属性 u8bdbCommissioningMode 单独启用/禁用启动模式,如下表所示。这个属性是一个位图,对于四个启动模式中的每一个都有一个位——一个位是 “1” 以启用相应的启动模式,或者 “0” 以禁用相应的启动模式。可以使用枚举来启用各个模式(将它们的比特设置为 “1”)。 节点上的当前启动状态反映在属性 ebdbCommissioningStatus 中。
3.1.1、Network Steering 包含未加入网络设备的如下行为: - 信道扫描;
- 选择一个开放网络执行关联加入;
- 获取 Network Key;
- 集中式安全网络的 TC Link Key获取;
而对于已经加入网络的设备的: - 控制 MAC 运行设备加入180s(开放网络);
- 关闭网络;
详述如下: Network Steering 可以用于将本地节点加入现有网络,或者允许其他节点通过本地节点加入网络。如果需要在节点上进行 Network Steering,则必须通过属性 8bdbCommissioningMode 使能。您可以开始网络启动通过调用函数 BDB_eNsStartNwkSteering() 在你的应用程序。 所采取的路径取决于本地节点是否已经是网络的成员,如通过布尔属性 bbdbNodeIsOnANetwork 指示。在所有情况下,Network Steering 的结果都是通过传递到回调函数 APP_vBdbCallback() 中的事件来表示的。
Node is already in a network: 当节点已经是网络的成员时,它通过广播管理许可加入请求(任何节点类型都可以以这种方式打开网络)来打开网络,以便其他节点加入固定时间。默认情况下,这个时间段是 180 秒,但是可以通过 ZigBee 基础设备常数 BDBC_MIN_COMMISSIONING_TIME 配置(以秒为单位)。在启动上述广播之后,将生成事件 BDBC_MIN_COMMISSIONING_TIME。
Node is not in a network: 当节点不是网络的成员并且是路由器或终端设备时,它搜索要加入的合适网络,如果找到合适的网络,则尝试加入网络.
- 节点通过扫描通过 u32bdbPrimaryChannelSet 位图(属性)指定的主要无线电信道集来执行网络发现。如果没有发现开放网络,则在通过 u32bdbSecondaryChannelSet 位图(属性)指定的第二组无线电信道上重复网络发现。如果仍然没有找到网络,则生成事件 BDB_EVENT_NO_NETWORK 并且放弃 Network Steering。
第一组通道 #define BDB_PRIMARY_CHANNEL_SET (0x02108800) //11、15、20、25 第二组通道 #define BDB_SECONDARY_CHANNEL_SET (0x07FFF800 ^ BDB_PRIMARY_CHANNEL_SET) - 如果发现至少一个开放网络,则节点将尝试加入每一个网络。一个接一个地发现开放网络,最多 BDBC_MAX_SAME_NETWORK_RETRY_ATTEMPTS 尝试次数。如果成功连接网络,属性 bbdbNodeIsOnANetwork 设置为 true。如果在主信道扫描之后没有成功连接,在第二信道上重复扫描(步骤 1)。如果在此扫描之后仍然没有成功的连接,则生 BDB_EVENT_NWK_JOIN_FAILURE 事件,并放弃网络启动。
- 加入节点被认证,并从其父级接收网络密钥。如果加入的网络具有集中安全性因此是一个信任中心,节点向信任节点单播一个节点描述符请求。检查返回的节点描述符,以确保信任中心支持 ZigBee Pro Stand 版本 R21 或以上。如果是这种情况,节点执行用于检索新的信任中心链接密钥以替换其预先配置的链接密钥的过程。任何一点的失败都将通过 BDB_EVENT_NWK_JOIN_FAILURE 失败事件来指示应用程序。
- 在成功完成上述步骤后,加入节点请求通过 BDBC_MIN_COMMIS.ING_TIME(默认为 180s)延长“允许加入”时间(对于新节点加入网络),并为应用程序生成 BDB_EVENT_NWK_STEERING_SUCCESS 事件。
取决于上述网络启动处理的结果: - 如果节点成功加入网络,则可能希望将节点绑定到另一个节点或将节点添加到组,在这种情况下,需要继续到查找和绑定阶段。
- 如果节点未能加入网络,则可能希望确保所希望的网络已打开以便加入并重新启动此网络启动处理。在路由器节点的情况下,应用程序可以选择形成自己的分布式网络,在这种情况下,需要继续到的 Network Formation。
3.1.2、Network Formation
- 信道扫描;
- 选择一个合适信道,并且初始化网络参数;
- 集中式安全网络的 TC(信任中心)建立;
- 分布式网络的建立;
详述如下: Network Formation 允许由协调器或路由器创建新的网络。 - 协调员将形成集中式安全网络并激活其信任中心功能。
- 路由器将形成分布式安全网络
如果需要在节点上 Network Formation,则必须通过属性 u8bdbCommissioningMode 启用。您可以通过调用函数 BDB_eNfStartNwkFormation().来启动应用程序中的 Network Formation。
- 广播 Identify Query Request 并且接收回复;
- 请求Simple Descriptor;
- 匹配 Initiator 和 Target 的 Cluster;
- 在绑定表创建对应关系;
详述如下: 查找和绑定模式允许网络中的节点与另一网络节点配对,例如,新的灯可能需要与控制器设备配对,以允许对灯进行控制。此启动模式的目标是将新节点上的端点绑定到网络中远程节点上的兼容端点(取决于支持的簇)。或者,可以将新节点添加到共同控制的节点组中。 如果需要在节点上,则必须通过属性 u8bdbCommissioningMode 启用查找和绑定。在查找和绑定中,节点可以具有两个角色之一: Initiator:该节点可以创建与远程端点的(本地)绑定,也可以请求将远程端点添加到组 Target:此节点标识自身,并接收和响应来自发起方的请求。 预期的结果是发起人和目标之间的配对。通常,启动器是控制器设备。查找和绑定过程所遵循的路径取决于本地端点是发起方还是目标。 Initiator Node 查找和绑定可以通过调用函数 BDB_eFbTriggerAsInitiator() 在启动器节点上启动——该函数可作为节点上的用户操作的结果来调用,例如按钮按下。然后,启动器将保持在查找和绑定模式,以固定的时间间隔(以秒为单位)由常数 BDBC_MIN_COMMIS.ING_TIME 定义。。如果在此时间内查找和绑定不成功,则生成事件 BDB_EVENT_FB_TIMEOUT,并将其传递到回调函数 APP_vBdbCallback() 中。
一旦查找和绑定开始,发起节点就通过周期性地广播 Identify Query 命令来搜索目标端点,该命令具有通过宏 BDB_FB_RESEND_IDENTIFY_QUERY_TIME 定义的周期(以秒为单位)。
如果发起者从远程端点接收到 Identify Query 响应,则应用程序必须使用函数 BDB_vZclEventHandler() 将 ZCL 事件 BDB_E_ZCL_EVENT_IDENTIFY_QUERY 传递给基础设备。这将允许基础设备通过向相关端点发送简单描述符请求来收集关于标识设备的信息。如果所请求的 Simple Descriptor 随后被成功接收回来,则回调函数检查该描述符以寻找与发起者上匹配的簇。该应用程序通过一个传递到 APP_vBdbCallback() 中的 BDB_EVENT_FB_HANDLE_SIMPLE_DESC_RESP_OF_TARGET 事件来通知此应用程序。
如果存在至少一个匹配的簇,则发起方执行下列操作之一: 如果需要绑定(由 u16bdbCommissioningGroupID 属性表示等于 0xFFFF),发起者将远程端点添加到本地绑定表(但是可能首先需要请求远程节点的 IEEE/MAC 地址)。 如果需要分组(由 u16bdbCommissioningGroupID 属性表示等于 16 位组地址),则发起方将请求目标端点将组地址添加到其组地址表。 通过以下事件通知应用程序成功绑定或分组: - For a binding:
- BDB_EVENT_FB_BIND_CREATED_FOR_TARGET for success
- BDB_EVENT_FB_ERR_BINDING_FAILED for failure
- For a grouping:
- BDB_EVENT_FB_GROUP_ADDED_TO_TARGET for success
- BDB_EVENT_FB_ERR_GROUPING_FAILED for failure
此时,应用程序可以通过调用 Identify 簇函数 eCLD_IdentifyCommandIdentifyRequestSend() 来请求将标识模式周期设置为零,从而远程停止目标节点上的标识模式(以及查找和绑定)。
发现和绑定过程可以使用函数 BDB_vFbExitAsInitiator(). 在发起方端点上停止。这个函数通常在回调函数 APP_vBdbCallback() 中被调用,作为用户操作的结果,例如按钮按下或按钮释放。 Target Node:可以通过调用函数 BDB_eFbTriggerAsTarget() 在目标节点上启动查找和绑定——该函数可以作为节点上的用户操作(例如按钮按下)的结果来调用。
目标节点用可辨识的 Cluster 把它自己放入到一个固定的时间段的辨识阶段。这个周期(以秒为单位)由 u16IdentifyTime 确定,它是一个 Identify cluster 属性,自动设置为常数 BDBC_MIN_COMMIS.ING_TIME 的值。
在标识模式下,Cluster 将响应任何接收到的 Identify Query 命令以及其他查找和绑定命令。 节点还可以视觉或听觉地指示其处于识别模式。在上述期间结束时退出标识模式时,Cluster 将不再能够处理 Identify Query 命令,但是节点仍然能够服务来自发起者的与绑定/分组相关的其他命令。标识 cluster 在 ZigBee 簇库用户指南(JN-UG-3115)中得到充分描述。
3.1.4、Touch Link
这是分布式安全网络的两个设备之间的快速网络建立/设备加入机制,该流程区分常规的关联设备加入流程,看起来类似作为子节点的终端设备和父节点失联后,发起的孤儿节点宣告寻找父亲过程。所以设备的加入不是走的关联加入流程。
详述如下: TouchLink 启动可用于形成新的网络和/或加入到现有网络的节点。Touchlink 是在名为“发起者”的节点上发起的,该节点要么是现有网络的成员,要么(如果不是)将创建新网络。在这两种情况下,发起方将加入第二节点到网络,称为“目标”节点。 在 ZigBee 簇库(ZCL)中,TouchLink 被提供为簇。发起人必须作为客户端支持 TouchLink 簇和目标节点必须支持簇作为服务端。如果需要在节点上,必须通过 ZigBee 基础设备属性 u8bdbCommissioningMode 使能 TouchLink 启动。有关 TouchLink 启动簇以及如何实现TouchLink 的详细信息,请参阅 ZigBee 簇库用户指南(JN-UG-3115)。 提供在将节点启动到安全网络中期间使用的 TouchLink 预配置的 Link Key。如果TouchLink 调试不成功,则这通过属性 ebdbCommissioningStatus 的 NO_SCAN_RESPONSE 的状态来表示(所有其他状态都表示成功)。
3.2、Security
默认 TC Link Key 获取都是通过新加入网络设备发起数据请求。现在可以设备出厂的 Install code 携带一个随机 128bit TC Link Key 和16bit 的 CRC,加入网络前 TC 通过一些物理接口(Key/LCD、Serial)获取该 Install Code,从而直接允许新设备的加入。
3.3、Reset
BDB 还定义一些支持的网络复位行为,这里不再详细介绍; - 基本 Cluster 复位;
- 通过 TouchLink Commission Cluster复位;
- 通过离开网络命令;
- 通过 ZDO 层 Mgmt_Leave_Req 复位;
- 在系统的一些硬件交互的复位操作;
附录:
ZigBee 参考资料 JN-UG-3113 Stack User Guide JN-UG-3114 Devices User Guide JN-UG-3115 Cluster Library User Guider |