Topic

FAQ
Login Register
ZCL.c这样改一下,让协调器可以支持65535种cluster的控制命令
Feb 14, 2023 15:29

/

A

/A

zigbee协调器如果需要支持65535种cluster,就必须能够发出65535种cluster的控制命令,接收65535种cluster的应答消息。一般协调器的存储能力和处理能力都很弱,但是协调器都有强大的上位机。




ZCL命令有两种,一种是属性命令,一种是控制命令。在zigbee SDK中,属性命令是没有cluster限制的,也就是说协调器可以支持从0x0000~0xFFFF的cluster的属性命令,但是控制命令需要注册对应的处理回调,因此协调器作为一个万能的控制端来说,理论上需要注册从0x0000~0xFFFF的cluster,才能支持所有的控制命令。目前泰凌微平台的常用做法是协调器需要对接哪些类型的节点设备,再慢慢的对协调器进行固件升级。这里提供一种让协调器具备“未卜先知”的能力,让协调器提前支持所有类型设备的控制指令。




ZCL控制命令有两种,一种是Client to Server型,这种是控制请求命令(Request),是控制端发给受控端。还有一种是Server to Client,是受控端发给控制端的应答或通知(Response或Notify)。对于协调器来说,只需要能发送前者,能接收后者就行。发出去命令的格式交给上位机来拼装,收到的命令也交给上位机来处理。




在ZCL.h中找到 zcl_hookFn_t,修改成以下格式




typedef void (*zcl_hookFn_t)(zclIncoming_t *pInHdlrMsg, u8 *pStatus);




然后在/* Cluster command */也就是接收控制命令的时候这样处理




最后是处理ZCL属性命令的应答,也要加上pStatus指针,

if(zcl_vars.hookFn && toAppFlg && inMsg.attrCmd){
zcl_vars.hookFn(&inMsg, NULL);
ev_buf_free(inMsg.attrCmd);
}


然后在注册的hookFn回调中(如sampleGW_zclProcessIncomingMsg),增加一个参数pStatus。如果pStatus不为0,可以修改*pStatus的值。一般收到ZCL_FRAME_SERVER_CLIENT_DIR的命令,*pStatus建议修改成ZCL_STA_CMD_HAS_RESP,这样协调器在收到任何cluster下的应答命令,都可以交给上位机来处理。














  



No reply yet