更新时间:2025-07-11 01:51:27下载pdf
Zigbee 本地管理功能为开发者提供了在本地网络中直接管理和控制 Zigbee 子设备的能力,无需完全依赖云端交互。该功能主要应用于智能家居网关设备中,可以实现以下功能:
这种本地化管理机制提高了设备控制的实时性,降低了云端依赖,在网络不稳定时仍能保证基本的设备控制功能。
/**
* @brief setup permit joining
*
* @param[in] tp protocol type, 0xFF means ignore the type
* @param[in] permit TRUE: enable joining, FALSE: disable joining
* @param[in] timeout timeout of permit joining (sec)
*
* @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h
*/
OPERATE_RET tuya_iot_dev_join_permit(GW_PERMIT_DEV_TP_T tp, BOOL_T permit, UINT_T timeout);
/**
* @brief execute obj DP command
*
* @param[in] cmd obj DP data, see TY_RECV_OBJ_DP_S
* @param[in] retrans TRUE: retransmit, FALSE: not retransmit
*
* @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h
*/
OPERATE_RET tuya_iot_dev_obj_cmd_send(CONST TY_RECV_OBJ_DP_S *cmd, BOOL_T retrans);
cmd
:指向 TY_RECV_OBJ_DP_S
结构体的指针,该结构体包含了要发送的命令的详细信息,如命令类型、传输类型、目标设备 CID、组播 ID、数据点数量及数据点数组等。retrans
:布尔值,用于指示是否需要重传。当设置为 TRUE
时,表示如果命令发送失败,则需要进行重传;当设置为 FALSE
时,则不会进行重传。OPERATE_RET
类型的值。如果命令发送成功,则返回 OPRT_OK
;如果发送失败,则返回错误码,具体错误码的含义可以参考 tuya_error_code.h
文件中的定义。typedef struct {
/** see DP_CMD_TYPE_E */
DP_CMD_TYPE_E cmd_tp;
/** see DP_TRANS_TYPE_T */
DP_TRANS_TYPE_T dtt_tp;
/** if(NULL == cid) then then the cid represents gwid */
CHAR_T *cid;
/** mb id */
CHAR_T *mb_id;
/** count of dp */
UINT_T dps_cnt;
/** the dp data */
TY_OBJ_DP_S dps[0];
} TY_RECV_OBJ_DP_S;
tuya_iot_dev_obj_cmd_send
函数中用于传递命令数据的重要结构体。cmd_tp
:命令类型,其取值范围见 DP_CMD_TYPE_E
dtt_tp
:传输类型,其取值范围见 DP_TRANS_TYPE_T
cid
:目标设备 CID,即设备的唯一标识。如果该值为 NULL
,则表示命令是发送给网关自身的。mb_id
:组播 ID,用于群组控制。dps_cnt
:数据点数量,表示该命令中包含的数据点的个数。dps
:数据点数组,是一个柔性数组,用于存储具体的数据点信息。数组的大小由 dps_cnt
决定,每个数据点的具体结构由 TY_OBJ_DP_S
定义。typedef struct {
/** dp id */
BYTE_T dpid;
/** dp type, see DP_PROP_TP_E */
DP_PROP_TP_E type;
/** dp value, see TY_OBJ_DP_VALUE_U */
TY_OBJ_DP_VALUE_U value;
/** dp happen time. if 0, mean now */
UINT_T time_stamp;
} TY_OBJ_DP_S;
dpid
:数据点 ID
type
: 数据点类型,见 DP_PROP_TP_E
枚举value
: 数据点值,见 TY_OBJ_DP_VALUE_U
联合体time_stamp
: 数据点发生时间,0
表示当前时间本地管理回调函数
/**
* @brief register local management callback.
*
* @param[in] cbs callback function.
*
* @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h
*/
OPERATE_RET tuya_zigbee_reg_lc_mgr(CONST TY_Z3_DEV_LC_MGR_S *cbs);
cbs
:指向 TY_Z3_DEV_LC_MGR_S
(上文提及)结构体的指针。该结构体包含了各种本地管理回调函数的指针,这些回调函数涵盖了设备加入、离开、离线、心跳查询、升级状态、升级进度、数据点上报和原始数据上报等多个方面。开发者需要根据实际需求,在结构体中提供相应的回调函数实现。OPERATE_RET
类型的值。如果注册成功,则返回 OPRT_OK
;如果注册失败,则返回错误码,具体错误码的含义可以参考 tuya_error_code.h
文件中的定义。typedef struct {
TY_Z3_DEV_JOIN_CB dev_join_cb;
TY_Z3_DEV_LEAVE_CB dev_leave_cb;
TY_Z3_DEV_OFFLINE_CB dev_offline_cb;
TY_Z3_DEV_HEARTBEAT_QUERY_CB dev_heartbeat_query_cb;
TY_Z3_DEV_UPGRADE_STATUS_CB dev_upgrade_status_cb;
TY_Z3_DEV_UPGRADE_PROGRESS_CB dev_upgrade_progress_cb;
TY_Z3_DEV_OBJ_DP_REPT_CB dev_obj_dp_rept_cb;
TY_Z3_DEV_RAW_DP_REPT_CB dev_raw_dp_rept_cb;
} TY_Z3_DEV_LC_MGR_S;
功能:该结构体用于封装 Zigbee 设备的本地管理回调函数。它提供了一种机制,使得开发者能够将自定义的函数与 Zigbee 设备的各种事件关联起来,从而实现对设备行为的灵活控制和管理。
成员变量:
dev_join_cb
:设备加入回调函数指针。当有新设备加入 Zigbee 网络时,系统会调用此函数,开发者可以在其中实现设备加入时的处理逻辑。
dev_leave_cb
:设备离开回调函数指针。当有设备离开 Zigbee 网络时,系统会调用此函数,开发者可以在其中实现设备离开时的处理逻辑。
dev_offline_cb
:设备离线回调函数指针。当设备离线时,系统会调用此函数,开发者可以在其中实现设备离线时的处理逻辑。
dev_heartbeat_query_cb
:心跳查询回调函数指针。当系统需要查询设备的心跳状态时,会调用此函数,开发者可以在其中实现心跳查询的处理逻辑。
dev_upgrade_status_cb
:升级状态回调函数指针。当设备升级状态发生变化时,系统会调用此函数,开发者可以在其中实现升级状态变化时的处理逻辑。
dev_upgrade_progress_cb
:升级进度回调函数指针。当设备升级进度发生变化时,系统会调用此函数,开发者可以在其中实现升级进度变化时的处理逻辑。
dev_obj_dp_rept_cb
:数据点上报回调函数指针。当设备上报数据点时,系统会调用此函数,开发者可以在其中实现数据点上报的处理逻辑。
dev_raw_dp_rept_cb
:原始数据上报回调函数指针。当设备上报原始数据时,系统会调用此函数,开发者可以在其中实现原始数据上报的处理逻辑。
// 初始化 Zigbee 本地管理
OPERATE_RET user_zigbee_local_init(VOID)
{
TY_Z3_DEV_LC_MGR_S __z3_dev_lc_mgr = {
.dev_join_cb = __z3_lc_dev_join_cb,
.dev_leave_cb = __z3_lc_dev_leave_cb,
.dev_offline_cb = __z3_lc_dev_offline_cb,
.dev_heartbeat_query_cb = __z3_lc_dev_hb_query_cb,
.dev_upgrade_status_cb = __z3_lc_dev_upgrade_status_cb,
.dev_upgrade_progress_cb = __z3_lc_dev_upgrade_progress_cb,
.dev_obj_dp_rept_cb = __z3_lc_dev_obj_dp_report_cb,
.dev_raw_dp_rept_cb = __z3_lc_dev_raw_dp_report_cb,
};
return tuya_zigbee_reg_lc_mgr(&__z3_dev_lc_mgr);
}
VOID test_subdev_list(VOID)
{
DEV_DESC_IF_S *dev_if = NULL;
VOID *iterator = NULL;
do {
dev_if = tuya_iot_dev_traversal(&iterator);
if (dev_if) {
PR_DEBUG("id: %s, type: %d", dev_if->id, dev_if->tp);
}
} while(dev_if);
}
/*子设备配网*/
OPERATE_RET user_zigbee_permit_join(IN BOOL_T enable, IN UINT_T timeout)
{
OPERATE_RET ret = OPRT_OK;
if (enable) {
// 开启 Permit Join 模式
PR_DEBUG("Enable Zigbee permit join for %d seconds", timeout);
ret = tuya_iot_dev_join_permit(timeout);
if (ret != OPRT_OK) {
PR_ERR("Enable permit join failed, ret=%d", ret);
return ret;
}
} else {
// 关闭 Permit Join 模式
PR_DEBUG("Disable Zigbee permit join");
ret = tuya_iot_dev_join_permit(0);
if (ret != OPRT_OK) {
PR_ERR("Disable permit join failed, ret=%d", ret);
return ret;
}
}
return ret;
}
VOID test_subdev_cmd(VOID)
{
UINT_T dp_cnt = 3;
TY_RECV_OBJ_DP_S *obj_cmd = NULL;
obj_cmd = Malloc(SIZEOF(TY_RECV_OBJ_DP_S) + dp_cnt * SIZEOF(TY_OBJ_DP_S));
if (obj_cmd == NULL) {
PR_ERR("Malloc error");
return;
}
obj_cmd->cid = "112233aabbcc";
obj_cmd->cmd_tp = DP_CMD_LAN;
obj_cmd->dtt_tp = DTT_SCT_UNC;
obj_cmd->dps_cnt = dp_cnt;
for (INT_T i = 0; i < dp_cnt; i++) {
obj_cmd->dps[i].dpid = (i + 1);
obj_cmd->dps[i].type = PROP_BOOL;
obj_cmd->dps[i].value.dp_bool = TRUE;
}
tuya_iot_dev_obj_cmd_send(obj_cmd);
Free(obj_cmd);
}
该内容对您有帮助吗?
是意见反馈该内容对您有帮助吗?
是意见反馈