3.1 简单描述符
一句话理解
简单描述符 = 设备的一张"服务名片"。每张名片回答三个问题:我是谁(端点号)、我属于什么场景(Profile)、我具体能干什么(Cluster 簇)。
为什么需要简单描述符
ZigBee 设备通常不只有一个功能。比如一个 ZigBee 温湿度传感器,它提供"温湿度监测"这个服务。要让网络里的其他设备知道"它提供什么服务、服务在哪里入口",就需要一份说明书——这份说明书在 Z-Stack 3.0 里就是简单描述符(Simple Descriptor)。
简单来说:简单描述符描述一个设备某一方面的服务(功能 / 应用)。一个设备可以有多张"名片",每张名片对应一个端点号。
结构分析:名片上写了什么
简单描述符本质上就是一个结构体,它在 Z-Stack 3.0 中的定义如下:
typedef struct
{
uint8 EndPoint; // 端点号:这张名片的编号
uint16 AppProfId; // 应用场景 ID(如家居自动化)
uint16 AppDeviceId; // 设备类型 ID(如插座、灯、传感器)
uint8 AppDevVer:4; // 版本号(开发者自定义)
uint8 Reserved:4; // 保留字段(暂时忽略)
uint8 AppNumInClusters; // 输入簇(In Cluster)的个数
cId_t *pAppInClusterList; // 指向输入簇列表的指针
uint8 AppNumOutClusters; // 输出簇(Out Cluster)的个数
cId_t *pAppOutClusterList; // 指向输出簇列表的指针
} SimpleDescriptionFormat_t;字段通俗讲解
类比理解
把简单描述符想成饭店的菜单:
- 端点号 = 菜单编号(几号桌的菜单)
- Profile ID = 菜系(川菜馆 / 粤菜馆)
- Device ID = 招牌菜类型(火锅 / 甜品)
- Cluster = 具体菜品(麻辣锅、清汤锅……)
别的设备一看菜单,就知道"这家店能点什么菜、怎么下单"。
应用示例:为设备创建一个简单描述符
设备的简单描述符在 zcl_samplesw_data.c 文件中创建(工程位置:SampleSwitch → App → zcl_samplesw_data.c)。
可以在这个文件中找到设备所包含的简单描述符,代码如下:
SimpleDescriptionFormat_t zclSampleSw_SimpleDesc =
{
SAMPLESW_ENDPOINT, // int EndPoint; 端点号
ZCL_HA_PROFILE_ID, // uint16 AppProfId[2]; 家居自动化场景
ZCL_HA_DEVICEID_ON_OFF_LIGHT_SWITCH, // uint16 AppDeviceId[2]; 设备类型 ID
SAMPLESW_DEVICE_VERSION, // int AppDevVer:4; 版本号
SAMPLESW_FLAGS, // int AppFlags:4; 保留字段
ZCLSAMPLESW_MAX_INCLUSTERS, // byte AppNumInClusters; 输入簇个数
(cId_t *)zclSampleSw_InClusterList, // byte *pAppInClusterList;
ZCLSAMPLESW_MAX_OUTCLUSTERS, // byte AppNumOutClusters; 输出簇个数
(cId_t *)zclSampleSw_OutClusterList // byte *pAppOutClusterList;
};逐项解读
- SAMPLESW_ENDPOINT:在
zcl_samplesw.h中定义的端点号:
#define SAMPLESW_ENDPOINT 8 // 这个工程使用端点号 8ZCL_HA_PROFILE_ID:由 ZigBee 联盟定义,表示智能家居领域的 Profile ID。
ZCL_HA_DEVICEID_ON_OFF_LIGHT_SWITCH:设备类型 ID,表示这是一个智能开关/插座,值由 ZigBee 联盟定义。不同公司开发同类型设备时必须使用同一个 ID,这是互联互通的基础。
SAMPLESW_DEVICE_VERSION:版本号(
zcl_samplesw_data.c中定义):
#define SAMPLESW_DEVICE_VERSION 1SAMPLESW_FLAGS:保留字段,暂时忽略(值为 0)。
ZCLSAMPLESW_MAX_INCLUSTERS / MAX_OUTCLUSTERS:支持的最大输入簇 / 输出簇数量。
zclSampleSw_InClusterList / OutClusterList:输入簇列表 / 输出簇列表,指向实际定义的簇数组。
小结
一张名片 = 端点号 + 场景 + 设备类型 + 一串功能(簇)。之后通信时,对方设备正是靠这张名片知道"这个端点能做什么、该怎么跟它说话"。
内容来源:紫甲 IoT《ZigBee 3.0 开发指南》第四部分·3.1 简单描述符,原站链接
本章自测
一、单项选择题(每题 4 分,共 40 分)
在 Z-Stack 3.0 中,用来描述设备某一方面服务(功能 / 应用)、被形象地称为设备"服务名片"的是(A. 简单描述符 B. 节点描述符 C. 功率描述符 D. 端点描述符) 答案:A
关于一个 ZigBee 设备可以拥有的简单描述符数量,下列说法正确的是(A. 只能有一张 B. 每张名片对应一个端点号,可以有多张 C. 必须有且仅有两张 D. 数量由网络地址决定) 答案:B
简单描述符结构体
SimpleDescriptionFormat_t中,标识这张"名片编号"的字段是(A. AppProfId B. AppDeviceId C. EndPoint D. AppDevVer) 答案:C字段
AppProfId的作用是(A. 描述设备的硬件版本号 B. 标识名片所属的应用场景(Profile)ID C. 标识输入簇的个数 D. 保留字段) 答案:B关于
AppDeviceId(设备类型 ID),下列说法正确的是(A. 由各公司自行随意定义 B. 只在本设备内部使用,对外无意义 C. 由 ZigBee 联盟统一定义,不同公司开发同类型设备必须使用同一 ID,是互联互通的基础 D. 与设备互联互通无关) 答案:C结构体中
AppDevVer:4与Reserved:4两个位域字段合起来占用的位数是(A. 4 位 B. 8 位 C. 16 位 D. 32 位) 答案:B简单描述符中,指向输入簇列表与输出簇列表的两个指针字段分别是(A. pAppInClusterList 与 pAppOutClusterList B. AppProfId 与 AppDeviceId C. EndPoint 与 AppDevVer D. AppNumInClusters 与 AppNumOutClusters) 答案:A
在 SampleSwitch 工程中,设备的简单描述符
zclSampleSw_SimpleDesc是在哪个文件中创建的(A. zcl_samplesw.c B. zcl_samplesw_data.c C. AF.h D. zcl_general.c) 答案:BSampleSwitch 工程使用的端点号
SAMPLESW_ENDPOINT被定义为(A. 0 B. 1 C. 8 D. 255) 答案:C示例代码中
ZCL_HA_PROFILE_ID表示的是(A. 照明领域的 Profile ID B. 智能家居(家居自动化)领域的 Profile ID C. 安防报警领域的 Profile ID D. 组播组的 Group ID) 答案:B
二、问答题(每题 20 分,共 60 分)
- 题干:用自己的话说明"简单描述符"在 ZigBee 设备中的作用,以及一张简单描述符主要包含哪些信息? 参考答案要点:
- 简单描述符是设备的一张"服务名片",向网络中其他设备说明本端点提供什么服务、服务入口在哪里。
- 一张名片 = 端点号 + 应用场景(Profile ID)+ 设备类型(Device ID)+ 版本号 + 一串功能簇(输入簇 / 输出簇)。
- 一个设备可以有多张名片,每张对应一个端点号;通信时对方设备正是靠这张名片知道"这个端点能做什么、该怎么跟它说话"。
- 题干:简单描述符中的"输入簇(In Cluster)"和"输出簇(Out Cluster)"各起什么作用?相关字段有哪些? 参考答案要点:
- 簇(Cluster)描述服务的具体内容,一张名片可含多个簇,共同描述该端点提供的服务。
- 字段 AppNumInClusters / AppNumOutClusters 分别记录输入簇、输出簇的个数。
- pAppInClusterList / pAppOutClusterList 为指针,分别指向输入簇列表、输出簇列表数组。
- 题干:为什么说
AppDeviceId(设备类型 ID)是 ZigBee 设备互联互通的基础? 参考答案要点:
- 设备类型 ID 由 ZigBee 联盟统一规定(如开关、灯、插座、传感器等各有固定 ID)。
- 不同公司开发同类型设备时必须使用同一个 Device ID。
- 只有大家都按统一编号描述设备类型,其他设备 / 网关才能识别并理解对方提供的服务,实现跨厂商互联互通。