zigbee cluster library

zigbee 2019-08-23 6980 次浏览 次点赞


zigbee zcl

zcl 框架图

首先, 需要清晰认识zigbee架构的系统框图,zcl 是zigbee 应用框架层上用以约定抽象描述物联网设备的协议,也就是对于不同厂商需要研发的物联网产品,都可以基于zcl 的设备描述,通过这样的标准设备描述语言,那么就可以实现真正意义的万物互联。

I. cluster

cluster list

在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还约定一系列的通用操作命令。

命令描述
0x00Read Attributes
0x01Read Attributes Response
0x02Write Attributes
0x03Write Attributes Undivided
0x04Write Attributes Response
0x05Write Attributes No Response
0x06Configure Reporting
0x07Configure Reporting Response
0x08Read Reporting Configuration
0x09Read Reporting Configuration Response
0x0aReport attributes
0x0bDefault Response
0x0cDiscover Attributes
0x0dDiscover Attributes Response
提示:详细参考,ZigBee Cluster Library Specification r6->2.5 General Command Frames ->Table 2-3. ZCL Command Frames

II. frame format

接下来需要理解的是zcl的数据帧,以此可以通过抓包加深理解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 IdentifierApplication version

  • 开

III. 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 的一个条目值。仔细思考其实和我们上面的包含关系理解并无偏差。


本文由 Jay 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处,点赞19

7 条评论

  1. Joey
    Joey

    请问UP主用的抓包工具是什么呀,不同层用不同颜色显示,很舒服

    1. lijie
      lijie

      https://notes.leconiot.com/ubiqua.html

      1. Joey
        Joey

        好的,谢谢~

  2. ZigBee教父
    ZigBee教父

    以前一直觉得ZCL只可意会不可言传,因为很多英文单词翻译过来会导致误解。
    我的个人解释,把一个ZigBee设备理解成一台多核心,多系统,多任务的的PC机。

    endpoint - 外设内核,一个ZigBee设备可以挂多个外设,比如灯,风扇。要控制几个风扇,几个灯就打开几个应用。
    cluster - 功能线程,每个构成应用的功能单元。比如控灯和控风扇,都会用到相同的版本显示,调级,通断电的功能。
    Server和Client - Sever和Client不能理解为字面上的意思。Sever应该理解为执行器,也就是“母头”。Client是控制器,也就是“公头”。Sever是“被操”者,Client是“操控”者。
    Attribute - 功能线程下的静态变量,正常情况下,被操者要把静态变量显示给操控着看。静态变量有两种同步方式,一种是操控者读被操者,另一种是被操者要主动报给操控者。而ZigBee的Bind就是让操控者和被操者建立关系。
    Command - 控制命令,就是操控者控制被操者的接口函数,被操者也会通过控制命令把执行结果return给操控者。通常操控者不会直接去改变被操者的Attribute值,而是通过向被操者发Command后,被操者执行动作,改变自己的物理状态,然后物理状态又反馈到自己的Attribute上面,操控者获取了Attribute,就知道被操者已经被操了

  3. lijie
    lijie

    这里理解zcl中的endpoint概念,endpoint其实zigbee 中的af层属性,用以zcl主要使用区分同一个设备上面具有相同的cluster,比如多键开关,都对应on/off cluster,此时就需要endpoint属性加以区分。

  4. lijie
    lijie

    okay,perfect.

  5. lijie
    lijie

    非常棒,终于完整理解了zcl。

添加新评论