0.前言
在zcl_demo.c中定義了很多的全局變量,與cluster和endpoint有關,本文來查看它們之間的關聯關係。
1.demo支持的所有cluster
所有的cluster都使用下面的結構,由ID、名稱、初始化函數、服務端函數和客戶端函數組成。
/* Structure to describe a cluster that can be used by this demo. */
typedef struct ZCL_Cluster_Descriptor_s
{
uint16_t ClusterID; //cluster的ID
const char *ClusterName; //cluster的名字
ZCL_Cluster_Demo_Init_Func_t InitFunc; //cluster demo的初始化函數
ZCL_Cluster_Demo_Create_Func_t ServerCreateFunc; //爲這個cluster創建一個服務器
ZCL_Cluster_Demo_Create_Func_t ClientCreateFunc; //爲這個cluster創建給客戶端
} ZCL_Cluster_Descriptor_t;
ClusterDescriptorList是所有的cluster的集合,定義了在demo中支持的cluster
/* Descriptor list for all clusters supported by this demo. */
static const ZCL_Cluster_Descriptor_t ClusterDescriptorList[] =
{
/* ClusterID ClusterName InitFunc ServerCreateFunc ClientCreateFunc */
{QAPI_ZB_CL_CLUSTER_ID_BASIC, "Basic", Initialize_ZCL_Basic_Demo, NULL, ZCL_Basic_Demo_Create_Client},
{QAPI_ZB_CL_CLUSTER_ID_POWER_CONFIG, "PowerConfig", NULL, ZCL_PowerConfig_Demo_Create_Server, ZCL_PowerConfig_Demo_Create_Client},
{QAPI_ZB_CL_CLUSTER_ID_TEMPERATURE_CONFIG, "DeviceTemp", NULL, ZCL_DeviceTemp_Demo_Create_Server, ZCL_DeviceTemp_Demo_Create_Client},
{QAPI_ZB_CL_CLUSTER_ID_IDENTIFY, "Identify", Initialize_ZCL_Identify_Demo, ZCL_Identify_Demo_Create_Server, ZCL_Identify_Demo_Create_Client},
{QAPI_ZB_CL_CLUSTER_ID_GROUPS, "Groups", Initialize_ZCL_Groups_Demo, ZCL_Groups_Demo_Create_Server, ZCL_Groups_Demo_Create_Client},
{QAPI_ZB_CL_CLUSTER_ID_SCENES, "Scenes", Initialize_ZCL_Scenes_Demo, ZCL_Scenes_Demo_Create_Server, ZCL_Scenes_Demo_Create_Client},
{QAPI_ZB_CL_CLUSTER_ID_ONOFF, "OnOff", Initialize_ZCL_OnOff_Demo, ZCL_OnOff_Demo_Create_Server, ZCL_OnOff_Demo_Create_Client},
{QAPI_ZB_CL_CLUSTER_ID_LEVEL_CONTROL, "LevelControl", Initialize_ZCL_LevelControl_Demo, ZCL_LevelControl_Demo_Create_Server, ZCL_LevelControl_Demo_Create_Client},
{QAPI_ZB_CL_CLUSTER_ID_ALARMS, "Alarms", Initialize_ZCL_Alarms_Demo, ZCL_Alarms_Demo_Create_Server, ZCL_Alarms_Demo_Create_Client},
{QAPI_ZB_CL_CLUSTER_ID_TIME, "Time", Initialize_ZCL_Time_Demo, NULL, ZCL_Time_Demo_Create_Client},
{QAPI_ZB_CL_CLUSTER _ID_OTA_UPGRADE, "OTA", Initialize_ZCL_OTA_Demo, ZCL_OTA_Demo_Create_Server, ZCL_OTA_Demo_Create_Client},
{QAPI_ZB_CL_CLUSTER_ID_DOORLOCK, "DoorLock", Initialize_ZCL_DoorLock_Demo, ZCL_DoorLock_Demo_Create_Server, ZCL_DoorLock_Demo_Create_Client},
{QAPI_ZB_CL_CLUSTER_ID_WINDOW_COVERING, "WinCover", Initialize_ZCL_WinCover_Demo, ZCL_WinCover_Demo_Create_Server, ZCL_WinCover_Demo_Create_Client},
{QAPI_ZB_CL_CLUSTER_ID_COLOR_CONTROL, "ColorControl", Initialize_ZCL_ColorControl_Demo, ZCL_ColorControl_Demo_Create_Server, ZCL_ColorControl_Demo_Create_Client},
{QAPI_ZB_CL_CLUSTER_ID_THERMOSTAT, "Thermostat", Initialize_ZCL_Thermostat_Demo, ZCL_Thermostat_Demo_Create_Server, ZCL_Thermostat_Demo_Create_Client},
{QAPI_ZB_CL_CLUSTER_ID_FAN_CONTROL, "FanControl", NULL, ZCL_FanControl_Demo_Create_Server, ZCL_FanControl_Demo_Create_Client},
{QAPI_ZB_CL_CLUSTER_ID_TEMP_MEASURE, "TempMeasure", NULL, ZCL_TempMeasure_Demo_Create_Server, ZCL_TempMeasure_Demo_Create_Client},
{QAPI_ZB_CL_CLUSTER_ID_OCCUPANCY_SENSING, "Occupancy", NULL, ZCL_Occupancy_Demo_Create_Server, ZCL_Occupancy_Demo_Create_Client},
{QAPI_ZB_CL_CLUSTER_ID_IAS_ZONE, "IASZone", Initialize_ZCL_IASZone_Demo, ZCL_IASZone_Demo_Create_Server, ZCL_IASZone_Demo_Create_Client},
{QAPI_ZB_CL_CLUSTER_ID_IAS_ACE, "IASAce", Initialize_ZCL_IASACE_Demo, ZCL_IASACE_Demo_Create_Server, ZCL_IASACE_Demo_Create_Client},
{QAPI_ZB_CL_CLUSTER_ID_IAS_WD, "IASWD", Initialize_ZCL_IASWD_Demo, ZCL_IASWD_Demo_Create_Server, ZCL_IASWD_Demo_Create_Client},
{QAPI_ZB_CL_CLUSTER_ID_BALLAST, "Ballast", NULL, ZCL_Ballast_Demo_Create_Server, ZCL_Ballast_Demo_Create_Client},
{QAPI_ZB_CL_CLUSTER_ID_ILLUMINANCE, "Illuminance", NULL, ZCL_Illuminance_Demo_Create_Server, ZCL_Illuminance_Demo_Create_Client},
{QAPI_ZB_CL_CLUSTER_ID_RELATIVE_HUMID, "RelHumid", NULL, ZCL_RelHumid_Demo_Create_Server, ZCL_RelHumid_Demo_Create_Client},
{QAPI_ZB_CL_CLUSTER_ID_TOUCHLINK_COMMISSIONING, "Touchlink", Initialize_ZCL_Touchlink_Demo, ZCL_Touchlink_Demo_Create_Server, ZCL_Touchlink_Demo_Create_Client},
{ZCL_CUSTOM_DEMO_CLUSTER_CLUSTER_ID, "Custom", Initialize_ZCL_Custom_Demo, ZCL_Custom_Demo_Create_Server, ZCL_Custom_Demo_Create_Client}
};
總共支持多少個cluster呢?
#define CLUSTER_DECRIPTOR_LIST_SIZE (sizeof(ClusterDescriptorList) / sizeof(ZCL_Cluster_Descriptor_t))
2.每個endpoint支持的cluster
下面的每個數組是按每個endpoint需要使用的cluster組成一個一個整體
static const uint16_t BaseServerClusterList[] = {QAPI_ZB_CL_CLUSTER_ID_BASIC, QAPI_ZB_CL_CLUSTER_ID_IDENTIFY};
static const uint16_t BaseClientClusterList[] = {QAPI_ZB_CL_CLUSTER_ID_OTA_UPGRADE};
static const uint16_t OnOffLightServerClusterList[] = {QAPI_ZB_CL_CLUSTER_ID_BASIC, QAPI_ZB_CL_CLUSTER_ID_IDENTIFY, QAPI_ZB_CL_CLUSTER_ID_GROUPS, QAPI_ZB_CL_CLUSTER_ID_SCENES, QAPI_ZB_CL_CLUSTER_ID_ONOFF};
static const uint16_t OnOffLightSwitchClientClusterList[] = {QAPI_ZB_CL_CLUSTER_ID_IDENTIFY, QAPI_ZB_CL_CLUSTER_ID_GROUPS, QAPI_ZB_CL_CLUSTER_ID_SCENES, QAPI_ZB_CL_CLUSTER_ID_ONOFF};
static const uint16_t DimmableLightServerClusterList[] = {QAPI_ZB_CL_CLUSTER_ID_BASIC, QAPI_ZB_CL_CLUSTER_ID_IDENTIFY, QAPI_ZB_CL_CLUSTER_ID_GROUPS, QAPI_ZB_CL_CLUSTER_ID_SCENES, QAPI_ZB_CL_CLUSTER_ID_ONOFF, QAPI_ZB_CL_CLUSTER_ID_LEVEL_CONTROL, QAPI_ZB_CL_CLUSTER_ID_BALLAST};
static const uint16_t DimmableLightSwitchClientClusterList[] = {QAPI_ZB_CL_CLUSTER_ID_IDENTIFY, QAPI_ZB_CL_CLUSTER_ID_GROUPS, QAPI_ZB_CL_CLUSTER_ID_SCENES, QAPI_ZB_CL_CLUSTER_ID_ONOFF, QAPI_ZB_CL_CLUSTER_ID_LEVEL_CONTROL, QAPI_ZB_CL_CLUSTER_ID_BALLAST};
static const uint16_t ColorDimmableLightServerClusterList[] = {QAPI_ZB_CL_CLUSTER_ID_BASIC, QAPI_ZB_CL_CLUSTER_ID_IDENTIFY, QAPI_ZB_CL_CLUSTER_ID_GROUPS, QAPI_ZB_CL_CLUSTER_ID_SCENES, QAPI_ZB_CL_CLUSTER_ID_ONOFF, QAPI_ZB_CL_CLUSTER_ID_LEVEL_CONTROL, QAPI_ZB_CL_CLUSTER_ID_COLOR_CONTROL};
static const uint16_t ColorDimmableLightSwitchClientClusterList[] = {QAPI_ZB_CL_CLUSTER_ID_IDENTIFY, QAPI_ZB_CL_CLUSTER_ID_GROUPS, QAPI_ZB_CL_CLUSTER_ID_SCENES, QAPI_ZB_CL_CLUSTER_ID_ONOFF, QAPI_ZB_CL_CLUSTER_ID_LEVEL_CONTROL, QAPI_ZB_CL_CLUSTER_ID_COLOR_CONTROL};
static const uint16_t TouchlinkServerServerClusterList[] = {QAPI_ZB_CL_CLUSTER_ID_BASIC, QAPI_ZB_CL_CLUSTER_ID_IDENTIFY, QAPI_ZB_CL_CLUSTER_ID_GROUPS, QAPI_ZB_CL_CLUSTER_ID_SCENES, QAPI_ZB_CL_CLUSTER_ID_ONOFF, QAPI_ZB_CL_CLUSTER_ID_TOUCHLINK_COMMISSIONING};
static const uint16_t TouchlinkClientClientClusterList[] = {QAPI_ZB_CL_CLUSTER_ID_IDENTIFY, QAPI_ZB_CL_CLUSTER_ID_GROUPS, QAPI_ZB_CL_CLUSTER_ID_SCENES, QAPI_ZB_CL_CLUSTER_ID_ONOFF, QAPI_ZB_CL_CLUSTER_ID_TOUCHLINK_COMMISSIONING};
static const uint16_t OTAUpgradeServerClusterList[] = {QAPI_ZB_CL_CLUSTER_ID_BASIC, QAPI_ZB_CL_CLUSTER_ID_IDENTIFY, QAPI_ZB_CL_CLUSTER_ID_OTA_UPGRADE};
static const uint16_t CustomServerServerClusterList[] = {QAPI_ZB_CL_CLUSTER_ID_BASIC, QAPI_ZB_CL_CLUSTER_ID_IDENTIFY, QAPI_ZB_CL_CLUSTER_ID_SCENES, QAPI_ZB_CL_CLUSTER_ID_ALARMS, ZCL_CUSTOM_DEMO_CLUSTER_CLUSTER_ID};
static const uint16_t CustomClientClientClusterList[] = {ZCL_CUSTOM_DEMO_CLUSTER_CLUSTER_ID};
static const uint16_t GeneralServerServerClusterList[] = {QAPI_ZB_CL_CLUSTER_ID_BASIC, QAPI_ZB_CL_CLUSTER_ID_TIME, QAPI_ZB_CL_CLUSTER_ID_IDENTIFY, QAPI_ZB_CL_CLUSTER_ID_ALARMS, QAPI_ZB_CL_CLUSTER_ID_TEMPERATURE_CONFIG, QAPI_ZB_CL_CLUSTER_ID_POWER_CONFIG};
static const uint16_t GeneralClientClientClusterList[] = {QAPI_ZB_CL_CLUSTER_ID_BASIC, QAPI_ZB_CL_CLUSTER_ID_TIME, QAPI_ZB_CL_CLUSTER_ID_IDENTIFY, QAPI_ZB_CL_CLUSTER_ID_GROUPS, QAPI_ZB_CL_CLUSTER_ID_SCENES, QAPI_ZB_CL_CLUSTER_ID_ALARMS, QAPI_ZB_CL_CLUSTER_ID_TEMPERATURE_CONFIG, QAPI_ZB_CL_CLUSTER_ID_POWER_CONFIG, QAPI_ZB_CL_CLUSTER_ID_OTA_UPGRADE};
static const uint16_t MeasureSensingServerClusterList[] = {QAPI_ZB_CL_CLUSTER_ID_BASIC, QAPI_ZB_CL_CLUSTER_ID_IDENTIFY, QAPI_ZB_CL_CLUSTER_ID_GROUPS, QAPI_ZB_CL_CLUSTER_ID_TEMP_MEASURE, QAPI_ZB_CL_CLUSTER_ID_OCCUPANCY_SENSING, QAPI_ZB_CL_CLUSTER_ID_ILLUMINANCE, QAPI_ZB_CL_CLUSTER_ID_RELATIVE_HUMID};
static const uint16_t MeasureSensingClientClusterList[] = {QAPI_ZB_CL_CLUSTER_ID_IDENTIFY, QAPI_ZB_CL_CLUSTER_ID_GROUPS, QAPI_ZB_CL_CLUSTER_ID_TEMP_MEASURE, QAPI_ZB_CL_CLUSTER_ID_OCCUPANCY_SENSING, QAPI_ZB_CL_CLUSTER_ID_ILLUMINANCE, QAPI_ZB_CL_CLUSTER_ID_RELATIVE_HUMID};
static const uint16_t HVACServerClusterList[] = {QAPI_ZB_CL_CLUSTER_ID_BASIC, QAPI_ZB_CL_CLUSTER_ID_IDENTIFY, QAPI_ZB_CL_CLUSTER_ID_GROUPS, QAPI_ZB_CL_CLUSTER_ID_THERMOSTAT, QAPI_ZB_CL_CLUSTER_ID_FAN_CONTROL};
static const uint16_t HVACClientClusterList[] = {QAPI_ZB_CL_CLUSTER_ID_IDENTIFY, QAPI_ZB_CL_CLUSTER_ID_GROUPS, QAPI_ZB_CL_CLUSTER_ID_THERMOSTAT, QAPI_ZB_CL_CLUSTER_ID_FAN_CONTROL};
static const uint16_t ClosuresServerClusterList[] = {QAPI_ZB_CL_CLUSTER_ID_BASIC, QAPI_ZB_CL_CLUSTER_ID_IDENTIFY, QAPI_ZB_CL_CLUSTER_ID_GROUPS, QAPI_ZB_CL_CLUSTER_ID_DOORLOCK, QAPI_ZB_CL_CLUSTER_ID_WINDOW_COVERING};
static const uint16_t ClosuresClientClusterList[] = {QAPI_ZB_CL_CLUSTER_ID_IDENTIFY, QAPI_ZB_CL_CLUSTER_ID_GROUPS, QAPI_ZB_CL_CLUSTER_ID_DOORLOCK, QAPI_ZB_CL_CLUSTER_ID_WINDOW_COVERING};
static const uint16_t IASControlServerClusterList[] = {QAPI_ZB_CL_CLUSTER_ID_BASIC, QAPI_ZB_CL_CLUSTER_ID_IDENTIFY, QAPI_ZB_CL_CLUSTER_ID_GROUPS, QAPI_ZB_CL_CLUSTER_ID_IAS_ACE};
static const uint16_t IASControlClientClusterList[] = {QAPI_ZB_CL_CLUSTER_ID_IDENTIFY, QAPI_ZB_CL_CLUSTER_ID_GROUPS, QAPI_ZB_CL_CLUSTER_ID_IAS_ZONE, QAPI_ZB_CL_CLUSTER_ID_IAS_WD};
static const uint16_t IASDeviceServerClusterList[] = {QAPI_ZB_CL_CLUSTER_ID_BASIC, QAPI_ZB_CL_CLUSTER_ID_IDENTIFY, QAPI_ZB_CL_CLUSTER_ID_GROUPS, QAPI_ZB_CL_CLUSTER_ID_IAS_ZONE, QAPI_ZB_CL_CLUSTER_ID_IAS_WD};
static const uint16_t IASDeviceClientClusterList[] = {QAPI_ZB_CL_CLUSTER_ID_IDENTIFY, QAPI_ZB_CL_CLUSTER_ID_GROUPS, QAPI_ZB_CL_CLUSTER_ID_IAS_ACE};
3.這個demo支持的所有endpoint
/* Structure to describe an endpoint that can be created by the demo. */
typedef struct ZCL_Endpoint_Descriptor_s
{
char *EndpointName; //ednpoint的名稱
uint16_t DeviceID; //endpoint的設備ID
qbool_t Touchlink; //與profile ID有關
uint8_t ServerClusterCount; //服務器 cluster列表的cluster數量
const uint16_t *ServerClusterList; //endpoint的服務器cluster的列表
uint8_t ClientClusterCount; //客戶端cluster列表中cluster的數量
const uint16_t *ClientClusterList; //endpoint的客戶端cluster的列表
} ZCL_Endpoint_Descriptor_t;
static const ZCL_Endpoint_Descriptor_t EndpointDescriptorList[] =
{
/* EndpointName, DeviceID, Touchlink, ServerClusterCount, ServerClusterList ClientClusterCount, ClientClusterList */
{"On/Off Light", QAPI_ZB_CL_DEVICE_ID_ONOFF_LIGHT, false, ZCL_EP_DESC_CLUSTER_LIST(OnOffLightServerClusterList), ZCL_EP_DESC_CLUSTER_LIST(BaseClientClusterList)},
{"On/Off Light Switch", QAPI_ZB_CL_DEVICE_ID_ONOFF_LIGHT_SWITCH, false, ZCL_EP_DESC_CLUSTER_LIST(BaseServerClusterList), ZCL_EP_DESC_CLUSTER_LIST(OnOffLightSwitchClientClusterList)},
{"Dimmable Light", QAPI_ZB_CL_DEVICE_ID_DIMMABLE_LIGHT, false, ZCL_EP_DESC_CLUSTER_LIST(DimmableLightServerClusterList), ZCL_EP_DESC_CLUSTER_LIST(BaseClientClusterList)},
{"Dimmer Switch", QAPI_ZB_CL_DEVICE_ID_DIMMER_SWITCH, false, ZCL_EP_DESC_CLUSTER_LIST(BaseServerClusterList), ZCL_EP_DESC_CLUSTER_LIST(DimmableLightSwitchClientClusterList)},
{"Color Dimmable Light", QAPI_ZB_CL_DEVICE_ID_COLOR_DIMMABLE_LIGHT, false, ZCL_EP_DESC_CLUSTER_LIST(ColorDimmableLightServerClusterList), ZCL_EP_DESC_CLUSTER_LIST(BaseClientClusterList)},
{"Color Dimmer Switch", QAPI_ZB_CL_DEVICE_ID_COLOR_DIMMER_SWITCH, false, ZCL_EP_DESC_CLUSTER_LIST(BaseServerClusterList), ZCL_EP_DESC_CLUSTER_LIST(ColorDimmableLightSwitchClientClusterList)},
{"Touchlink Server", QAPI_ZB_CL_DEVICE_ID_ONOFF_LIGHT, true, ZCL_EP_DESC_CLUSTER_LIST(TouchlinkServerServerClusterList), ZCL_EP_DESC_CLUSTER_LIST(BaseClientClusterList)},
{"Touchlink Client", QAPI_ZB_CL_DEVICE_ID_ONOFF_LIGHT_SWITCH, true, ZCL_EP_DESC_CLUSTER_LIST(BaseServerClusterList), ZCL_EP_DESC_CLUSTER_LIST(TouchlinkClientClientClusterList)},
{"OTA Upgrade Server", QAPI_ZB_CL_DEVICE_ID_CONTROL_BRIDGE, false, ZCL_EP_DESC_CLUSTER_LIST(OTAUpgradeServerClusterList), ZCL_EP_DESC_NULL_CLUSTER_LIST},
{"Custom Server", 0xF010, false, ZCL_EP_DESC_CLUSTER_LIST(CustomServerServerClusterList), ZCL_EP_DESC_CLUSTER_LIST(BaseClientClusterList)},
{"Custom Client", 0xF011, false, ZCL_EP_DESC_CLUSTER_LIST(BaseServerClusterList), ZCL_EP_DESC_CLUSTER_LIST(CustomClientClientClusterList)},
{"General Server", 0xF030, false, ZCL_EP_DESC_CLUSTER_LIST(GeneralServerServerClusterList), ZCL_EP_DESC_CLUSTER_LIST(BaseClientClusterList)},
{"General Client", 0xF031, false, ZCL_EP_DESC_CLUSTER_LIST(BaseServerClusterList), ZCL_EP_DESC_CLUSTER_LIST(GeneralClientClientClusterList)},
{"Measure/Sensing Server", 0xF040, false, ZCL_EP_DESC_CLUSTER_LIST(MeasureSensingServerClusterList), ZCL_EP_DESC_CLUSTER_LIST(BaseClientClusterList)},
{"Measure/Sensing Client", 0xF041, false, ZCL_EP_DESC_CLUSTER_LIST(BaseServerClusterList), ZCL_EP_DESC_CLUSTER_LIST(MeasureSensingClientClusterList)},
{"HVAC Server", 0xF060, false, ZCL_EP_DESC_CLUSTER_LIST(HVACServerClusterList), ZCL_EP_DESC_CLUSTER_LIST(BaseClientClusterList)},
{"HVAC Client", 0xF061, false, ZCL_EP_DESC_CLUSTER_LIST(BaseServerClusterList), ZCL_EP_DESC_CLUSTER_LIST(HVACClientClusterList)},
{"Closures Server", 0xF070, false, ZCL_EP_DESC_CLUSTER_LIST(ClosuresServerClusterList), ZCL_EP_DESC_CLUSTER_LIST(BaseClientClusterList)},
{"Closures Client", 0xF071, false, ZCL_EP_DESC_CLUSTER_LIST(BaseServerClusterList), ZCL_EP_DESC_CLUSTER_LIST(ClosuresClientClusterList)},
{"IAS Control", 0xF080, false, ZCL_EP_DESC_CLUSTER_LIST(IASControlServerClusterList), ZCL_EP_DESC_CLUSTER_LIST(IASControlClientClusterList)},
{"IAS Device", 0xF081, false, ZCL_EP_DESC_CLUSTER_LIST(IASDeviceServerClusterList), ZCL_EP_DESC_CLUSTER_LIST(IASDeviceClientClusterList)}
};