zigbee zcl
ZigBee Cluster Library Specification r6
提示:zigbee 3.0 是基于 r7版本,但是非zigbee 成员,官方只是只是释放了如上的r6版本。
- Webinar_ZigBee_3-0_Launch_FINAL->
ZigBee 3.0 Devices and Application Clusters
首先, 需要清晰认识zigbee架构的系统框图,zcl 是zigbee 应用框架层上用以约定抽象描述物联网设备的协议,也就是对于不同厂商需要研发的物联网产品,都可以基于zcl 的设备描述,通过这样的标准设备描述语言,那么就可以实现真正意义的万物互联。
cluster
在zigbee cluster specification 里,定义如上包含关系,某个设备可以理解为多个cluster的集合(list),而zcl 约定了这里cluster,同时对于每一个固定cluser又是同时包含一个或者多个Attribute、Behavior、Command、Dependency,如下分开解释Cluster下的A、B、C、D。
- Attribute
表示某个设备物理特征和状态的数据值,该数据值同其他设备通过如下Command操作关联;
- Behavior
行为;
- Command
操作或者影响熟悉的动作;
- Dependency
依赖;
提示:详细参考,ZigBee Cluster Library Specification r6->2.5 General Command Frames
->Table 2-3. ZCL Command Frames
。
如上的Command 集合是针对固定Cluster下面的Attribute操作的,同时对于所有的Attribute,zcl还约定一系列的通用操作命令。
命令描述 | |
---|---|
0x00 | Read Attributes |
0x01 | Read Attributes Response |
0x02 | Write Attributes |
0x03 | Write Attributes Undivided |
0x04 | Write Attributes Response |
0x05 | Write Attributes No Response |
0x06 | Configure Reporting |
0x07 | Configure Reporting Response |
0x08 | Read Reporting Configuration |
0x09 | Read Reporting Configuration Response |
0x0a | Report attributes |
0x0b | Default Response |
0x0c | Discover Attributes |
0x0d | Discover Attributes Response |
提示:详细参考,ZigBee Cluster Library Specification r6->2.5 General Command Frames
->Table 2-3. ZCL Command Frames
。
frame format
接下来需要理解的是zcl的数据帧,以此可以通过抓包加深理解zcl的协议分层。
提示:详细参考,ZigBee Cluster Library Specification r6->2.4 Command Frame Formats
每一个zcl数据帧都是用以来描述操作/影响 指定cluster下面的一个或者多个attribute的。
接下来拆解如上提示。
操作:通过如上描述的attribute 私有/通用 命令command决定,具体通过zcl 帧控制域的 Command identifier决定是通用还是私有命令;
指定cluster:通过cluster id确定,cluster id在没有在zcl 数据值,而是在aps 层的帧头,cluster id 参考ZigBee Cluster Library Specification r6-> Chapter 3 General
定义;
attribute:zcl payload描述,通过attribute id确定,attribute id 由cluster id 指定的类别中定义;
对应小米智能插座,理解如上抓包行为:
- 上报
generic
cluster 的Model Identifier
和Application version
- 开
code implement
有了上面的认识,还需要理解的是 cluster的master/slave 模式,简单来说需要基于cluster 实现指定产品功能集合物联网设备做 cluster master,需要交互这些产品功能的作为cluster slave。
我们参考zstack,找到zstack中关于灯产品samplelight 的cluster list定义。
//zcl_samplelight_data line 204
/*********************************************************************
* ATTRIBUTE DEFINITIONS - Uses REAL cluster IDs
*/
// NOTE: The attributes listed in the AttrRec must be in ascending order
// per cluster to allow right function of the Foundation discovery commands
CONST zclAttrRec_t zclSampleLight_Attrs[] =
{
// *** General Basic Cluster Attributes ***
{
ZCL_CLUSTER_ID_GEN_BASIC,
{ // Attribute record
ATTRID_BASIC_ZCL_VERSION,
ZCL_DATATYPE_UINT8,
ACCESS_CONTROL_READ,
(void *)&zclSampleLight_ZCLVersion
}
},
{
ZCL_CLUSTER_ID_GEN_BASIC, // Cluster IDs - defined in the foundation (ie. zcl.h)
{ // Attribute record
ATTRID_BASIC_HW_VERSION, // Attribute ID - Found in Cluster Library header (ie. zcl_general.h)
ZCL_DATATYPE_UINT8, // Data Type - found in zcl.h
ACCESS_CONTROL_READ, // Variable access control - found in zcl.h
(void *)&zclSampleLight_HWRevision // Pointer to attribute variable
}
提示:看起来,zstack在实现上面是直接按照attribute构造产品的,cluster 的就变成了特定attribute 的一个条目值。仔细思考其实和我们上面的包含关系理解并无偏差。
请问UP主用的抓包工具是什么呀,不同层用不同颜色显示,很舒服
https://notes.leconiot.com/ubiqua.html
好的,谢谢~
以前一直觉得ZCL只可意会不可言传,因为很多英文单词翻译过来会导致误解。
我的个人解释,把一个ZigBee设备理解成一台多核心,多系统,多任务的的PC机。
endpoint - 外设内核,一个ZigBee设备可以挂多个外设,比如灯,风扇。要控制几个风扇,几个灯就打开几个应用。
cluster - 功能线程,每个构成应用的功能单元。比如控灯和控风扇,都会用到相同的版本显示,调级,通断电的功能。
Server和Client - Sever和Client不能理解为字面上的意思。Sever应该理解为执行器,也就是“母头”。Client是控制器,也就是“公头”。Sever是“被操”者,Client是“操控”者。
Attribute - 功能线程下的静态变量,正常情况下,被操者要把静态变量显示给操控着看。静态变量有两种同步方式,一种是操控者读被操者,另一种是被操者要主动报给操控者。而ZigBee的Bind就是让操控者和被操者建立关系。
Command - 控制命令,就是操控者控制被操者的接口函数,被操者也会通过控制命令把执行结果return给操控者。通常操控者不会直接去改变被操者的Attribute值,而是通过向被操者发Command后,被操者执行动作,改变自己的物理状态,然后物理状态又反馈到自己的Attribute上面,操控者获取了Attribute,就知道被操者已经被操了
这里理解zcl中的endpoint概念,endpoint其实zigbee 中的af层属性,用以zcl主要使用区分同一个设备上面具有相同的cluster,比如多键开关,都对应on/off cluster,此时就需要endpoint属性加以区分。
okay,perfect.
非常棒,终于完整理解了zcl。