基于Z-stack协议栈ZCL库且符合HA规范的ZigBee应用开发
扫描二维码
随时随地手机看文章
引言
目前,国内市场上ZigBee产品虽然很多,但大多采用 的都是私有协议栈,阻碍了不同厂家产品之间的互用和替代, 这也是ZigBee市场规模无法迅速扩大的一个重要原因,因 此,开发具有符合标准规范的ZigBee产品成为当务之急。目 前国内的ZigBee行业规范还正在处于形成阶段,但国际上的 ZigBee规范已经建立并受到国际上众多厂商的追随,因此, 本文就如何开发符合ZigBee联盟规定的HA规范的ZigBee 应用进行了探讨。
Z-stack是TI公司推出的ZigBee协议栈系统,这是一个 通过ZigBee联盟认证的符合ZigBee2007规范的平台。借由 TI公司ZigBee芯片及SOC产品在国内的广泛接受,Z-stack 也称为众多芯片厂商提供的协议栈中开发者接受度比较广的一 款ZigBee协议栈。本文探讨的ZigBee产品应用开发是基于 Z-stack协议栈的。
收稿日期:2013-01-30
ZCL 库(ZigBee cluster library)111
在ZigBee协议栈中,簇是一组命令和属性的集合,这些 命令和属性组合起来,构成了实现某一功能的实体。
ZCL是由ZigBee联盟制定的包含了大量功能簇(cluster) 的大集合。在应用开发中,以ZCL中已有的簇作为功能单元 来使用,可以增强通用性,避免重复开发。
ZCL对功能簇进行了分类和描述。每个功能簇都包含有 一个或多个属性及命令,ZCL对每个属性都进行了定义和描 述,包括属性ID、名称、数据类型、数值范围、初始值、可 读写性以及强制性;同时,也对此簇所包含的命令进行了定义, 包括命令ID、命令名称、命令数据帧内容和触发效果等。
ZCL中的通信是基于Client/Server模型的以簇为单位进 行的。两个不同功能设备之间的相互通信,是基于某一个或多 个功能簇的。用来储存这些簇属性的设备,称为Server端; 而用来操作这些簇属性的设备,称为Client端。针对Client/ Server端口类型的不同,同一个簇也具有不同的属性和命令。例如,操作属性的命令,通常由Client端发送给Server 端;而用针对这些操作命令的回复,通常由Server端发送给 Client 端。另外,报告类型的命令(report attribute command) 通常由Server端发送给Client端。以On/Off簇为例,该簇的 作用是实现开关设备的开/关状态的控制,体现在设备上,分 为Client端和Server端两种角色的设备,比如开关是Client端, 而某个具有ZigBee模块的灯节点则代表了相应的Server端。 Server端作为命令的接收者,必须能够识别开/关/切换这几 个来自Client端的命令(在ZCL中,已经规定好这些命令对 应的ID,如0x00代表关,0x01代表开,0x02代表切换),同时, 由于命令操作的是属性,因此,该Server端必须保存有开关 状态这一属性。
另外,ZCL制定了基于cluster的各类命令帧的格式(包 括读、写、报告等);定义了用于寻址的各指示参数(包括规 范ID、设备ID、簇ID、属性ID和命令ID);规定了用于各 属性和命令中各类数据的数据类型;还规定了在通信中可能 会出现的所有状态的枚举数组。
HA(home automation)规范[2]
HA规范是由ZigBee联盟(ZigBee alliance)制定的对用 于住宅环境的各类常见应用的设备描述和操作规范。通过这 一规范,为不同厂商的ZigBee HA设备提供了标准的接口和 定义,确保其相互之间能够相互通信并协同工作。
HA规范的范围主要集中在对家用设备进行的实时操 作,该规范可以构筑在ZigBee2007的两个子规范(ZigBee、 ZigBee pro)之上。
HA规范可以简单分成围绕网络特性的参数设置和围绕 功能实现的设备描述分类(包括相应设备的簇以及特性和功 能)这两大部分的内容。
2.1参数设置
HA规范对涉及到协议栈各功能方面的一些参数进行 了明确的规定,例如用于设备启动时的启动参数集(startup attribute sets),要求每个设备都必须内置这些参数,例如将 PAN ID设置成0xffff等。还有比如用于网络重连接的时间间 隔、安全中心连接秘钥等等参数。
在安全参数的设置方面,HA规范中规定,设备的初始 网络安全秘钥(network key)是空的,即每个设备的网络安全 秘钥必须由安全中心来统一分配;而安全中心连接秘钥(trust center link key)是每个设备都预置好的。
2.2设备描述
HA规范对可能会用到的设备进行了划分并设置了相应的 ID,在HA网络中的每个终端都必须符合至少一项该分类图 中给出的设备描述分类(如果同时符合多个设备描述的话,需 要在自己的设备描述中枚举这些设备类型)。
在HA规范中,每个设备描述都详细规定了其所支持的 簇,以及所支持的特性和功能。以通用设备中的开关(On/Off Switch)设备为例。其所支持的簇如表1所列。
也就是说,如果某个设备是开关的Client端节点,则必 须具有On/Off簇,用以发出控制On/Off属性的命令。
针对每一类设备,HA规范都通过特性和功能描述对其 进行行为上的描述,而通过其所包含的cluster来对其进行程 序层面上功能域与接口的界定。从整体上来讲,HA规范中为 一个设备应该实现什么以及如何实现进行了明确的说明。
Z-stack中的ZCL库及使用
Z-stack协议栈中包含有针对ZigBee联盟的ZCL规范进 行编写的ZCL库,用以在自己的协议栈中支持ZCL的实现叫 ZCL层API封装了大量针对ZCL的包括帧格式、命令ID等 细节,而只是向开发者提供了简单明了的命令函数,通过引入 ZCL层API,可以大大简化标准化应用的开发。在Z-stack中, 利用ZCL层API开发符合HA规范的应用的步骤如下叫 3.1 ZCL层的注册及初始化
首先,必须将ZCL层初始化并注册到任务列表中 去。ZCL的初始化是在osalInitTasks函数中添加zcl_Init( taskID++ )语句,用来给ZCL层的事件分配一个任务ID ;注 册即是在OSAL的任务列表tasksArr[]中,添加zcl_event_ loop, zcl_event_loop是在zcl.c里定义的用来处理ZCL层事 件的一个任务循环函数。
ZCL层的注册和初始化必须放在应用层之前。
3.2应用层的注册和初始化
用ZCL来构建基于HA规范的应用层,与ZCL层的注 册和初始化相类似,也必须在任务列表里添加应用层的任务 循环,并在初始化函数中进行初始化。
应用层的初始化主要包括以下几个方面。
3.2.1终端节点的注册
通过zclHA_Init函数对终端节点进行注册,表明该节点 是HA规范中的一个节点,该注册过程同时也包括了该节点相 应功能簇的注册。
3.2.2 ZCL回调函数集的注册
ZCL中每一类设备都会包含一系列与其实现功能相关的命令(包括自身发出的和来自其他设备的),ZCL回调函数集 用以接收并处理这些来自其他设备发出的命令。
HA规范中每个功能域都有不同的回调函数集,用以接收 不同种类的命令。以HA规范中的General功能域为例,其所 包含的回调函数类型如下:
typedef struct
{
zclGCB_BasicReset_t pfnBasicReset; // Basic Reset zclGCB_Identify _t pfnIdentify; // Identify Response zclGCB_IdentifyQueryRsp_t pfnIdentifyQueryRsp; // Identify Query Rsp
zclGCB_OnOff_t pfnOnOff; // On/Off cluster zclGCB_LevelControlMoveToLevel_t pfnLevelControlMoveTbLevel; // MoveToLevel
zclGCB_LevelControlMove_t pfnLevelControlMove; // Move
zclGCB_LevelControlStep_t pfnLevelControlStep; // Step zclGCB_LevelControlStop_t pfnLevelControlStop; // Stop zclGCB_GroupRsp_t pfnGroupRsp; // Group Response zclGCB_SceneStoreReq_t pfnSceneStoreReq; // Scene Store Request
zclGCB_SceneRecallReq_t pfnSceneRecallReq; // Scene Recall Request
zclGCB_SceneRsp_t pfnSceneRsp; // Scene Response zclGCB_Alarm_t pfnAlarm; // Alarm Req & Rsp zclGCB_Location_t pfnLocation; // RSSI Location zclGCB_LocationRsp_t pfnLocationRsp; // RSSI Location Rsp
} zclGeneral_AppCallbacks_t;
每个节点根据功能域的划分来选择对应的回调函数集的 类型(例如节点用到的是General功能域下的某些功能簇,则 使用zclGeneral_AppCallbacks_t类型来构建回调函数集),并 根据实际功能的需要来裁剪和自定义自己的回调函数集。
在完成回调函数集的构建之后,通过调用相应功能 域的注册函数来注册该功能域的回调函数集(如要注册 zclGeneral_AppCallbacks_t类型的回调函数集,则需要使用 相应的 zclGeneral_RegisterCmdCallbacks 函数)。
3.2.3 ZCL属性的注册
每个簇都有相应的一个或者多个属性,在Z-stack中, 簇属性由zclAttribute_t类型来表征。具体结构如下所示:
typedef struct
{
uintl6 attrId; // Attribute ID
uint8 dataType; // Data Type - defined in AF.h
uint8 accessControl; // Read/write - bit field
void *dataPtr; // Pointer to data field
} zclAttribute_t;
由于每个簇可能有多个属性,并且每个节点可以有多个功 能簇,因此,通过属性列表zclAttrRec_t类型来表征一个节 点所具有的属性集合。
typedef struct
{
uint16 clusterID; // Cluster ID
zclAttribute_t attr; // Attribute record
} zclAttrRec_t;
开发人员在构建了该应用节点的属性列表之后,通过zcl_ registerAttrList函数完成这些属性的注册。
3.2.4 ZCL层消息的注册
由于ZCL是一个中间层,其负责接收并初步处理的一些 消息需要上传至应用层来处理。为了实现这一功能,需要调用 zcl_registerForMsg函数来在应用层进行注册,确保经ZCL层 预加工的消息能够传达到应用层。
3.2.5其他注册
其他注册包括一般应用都需要的按键事件的注册、ZDO 层消息的注册[5]以及一些非HA规范节点的注册等。
3.3应用层逻辑的实现
应用层逻辑的开发与一般应用开发的区别,主要就是 使用ZCL层API来进行命令的发送,比如当触发开关按 键时,使用ZCL库的API来发送相应的命令zclGeneral_ SendOnOff_CmdOn,可以看到,在应用层只需写入这种标准 命令函数,协议栈会自动调用下层的函数库来进行相应的操作 并实现命令的发送。
另外还需要注意的一点是,在应用层的节点行为以及网 络层的参数设置上,也必须符合HA规范给出的限定,例如 PAN ID的设置、安全相关的一些秘钥的初始值设置以及终端 设备向父节点轮询的时间间隔等参数和行为的设定。
4结语
可以看到,通过在协议栈中引入ZCL层,可以大大简化 符合HA标准的ZigBee应用的开发:来自应用层的数据通过 ZCL层的封装处理后,实现了数据和命令格式的标准化;同样, 来自其他设备或节点的消息通过ZCL层的分析和提取,能够 将应用层敏感的命令和相关数据直接呈现给应用层,从而保 证应用层只需关注于其节点自身功能的实现,而将繁琐的标准 化通信任务交给下层来处理。
20211020_61702baf2afa0__基于Z