本文档主要介绍基于 RTOS 网关 SDK-WR11-G 的红外发送和学习能力,便于开发者快速上手开发和问题排查。本方案中配套使用的红外应用组件仅支持 fastlz 红外码库(红外标准 DP_V3 版本)。
OPERATE_RET tuya_svc_ir_control_init(TY_GW_IR_INIT_ATTR_T *attr);
/*当用于网关自身红外学习上报时,devid 传入空字符串*/
OPERATE_RET tuya_svc_ir_code_learn(IN CONST CHAR_T *devid, IN CONST CHAR_T *p_data, IN UINT_T data_len);
OPERATE_RET tuya_ir_study_stat_report(IN TY_IR_STUDY_CTL_E mode);
OPERATE_RET tuya_ir_study_error_report(VOID_T);
/*下发的红外码使用完后,通过此接口释放资源*/
OPERATE_RET tuya_ir_code_free(IN TY_IR_CODE_S *ir_code, IN UCHAR_T code_num);
typedef VOID (*GW_IR_SEND_APP_CB)(IN TY_IR_CODE_S *timecode, IN UCHAR_T code_num);
typedef VOID (*GW_IR_STUDY_APP_CB)(IN TY_IR_STUDY_CTL_E mode);
typedef struct {
GW_IR_SEND_APP_CB gw_ir_send_cb; // SDK 红外组件的发送回调,开发者自行实现发送逻辑
GW_IR_STUDY_APP_CB gw_ir_study_cb;//SDK 红外组件的学习回调,开发者自行实现学习逻辑
}TY_GW_IR_APP_CBS_S;
typedef struct {
TY_GW_IR_APP_CBS_S ir_cbs; // 网关自身发送和学习的回调
} TY_GW_IR_INIT_ATTR_T;
typedef CHAR_T TY_IR_STUDY_CTL_E;
#define TY_IR_STUDY_START 0
#define TY_IR_STUDY_EXIT 1
typedef struct
{
USHORT_T *code; //要发送的红外时间码
USHORT_T code_len; //时间码长度
BYTE_T send_count; //重复次数
UINT_T feq; //发送频率
USHORT_T delay; //ms
}TY_IR_CODE_S;
STATIC VOID_T tuya_irapp_sysdp_send_cb(IN TY_IR_CODE_S *ir_code, IN UCHAR_T code_num)
{
}
STATIC VOID_T tuya_irapp_sysdp_study_cb(IN TY_IR_STUDY_CTL_E irstudy_mode)
{
}
TY_GW_IR_INIT_ATTR_T ir_attr = {
.ir_cbs.gw_ir_send_cb = tuya_irapp_sysdp_send_cb,
.ir_cbs.gw_ir_study_cb = tuya_irapp_sysdp_study_cb,
};
op_ret = tuya_svc_ir_control_init(&ir_attr);
if (OPRT_OK != op_ret)
{
PR_ERR("tuya_svc_ir_control_init err:%d !",op_ret);
return op_ret
}
为避免阻塞 SDK 回调,发送和学习业务逻辑请不要在回调中实现。
/*实现 gw_ir_send_cb 回调*/
STATIC VOID_T tuya_irapp_sysdp_send_cb(IN TY_IR_CODE_S *ir_code, IN UCHAR_T code_num)
{
if (NULL == ir_code || 0 == code_num) {
PR_ERR("invalid param.");
return;
}
/*自定义发送逻辑*/
tuya_ir_code_free(ir_code, code_num);
}
为避免阻塞 SDK 回调,发送和学习业务逻辑请不要在回调中实现。
/*实现 gw_ir_study_cb 回调*/
STATIC VOID_T tuya_irapp_sysdp_study_cb(IN TY_IR_STUDY_CTL_E irstudy_mode)
{
if(TY_IR_STUDY_START == irstudy_mode)
{
PR_NOTICE("ir study start...");
tuya_ir_study_stat_report(TY_IR_STUDY_START);
/*自定义学习逻辑*/
if () {
tuya_svc_ir_code_learn("", data, data_len);
PR_NOTICE("ir study successed...");
} else {
tuya_ir_study_error_report();
PR_NOTICE("ir study failed...");
}
}
else if(TY_IR_STUDY_EXIT == irstudy_mode)
{
PR_NOTICE("ir study stop...");
tuya_ir_study_stat_report(TY_IR_STUDY_EXIT);
/*学习完成,回收资源*/
}
}
使用红外功能时,网关的 PID 下需要后台配置 DP201 和 DP202。

若面板点击下发红外码时网关接收不到相应 MQTT 消息,需排查红外 V2 能力是否打开。

红外组件初始化接口在网关初始化(tuya_iot_wf_sdk_init/tuya_iot_wr_wf_sdk_init)之前调用,详见 设备初始化。
首先需要排查学习时接收的红外时间码与实际时间码是否一致,可通过 kingst 抓取实际波形与接收时间码对比,建议接收时间码和实际波形误差小于 20 us。
同样通过 kingst 抓取实际波形与发送时间码进行对比,建议误差小于 20 us(可考虑分别增加高低电平补偿值来减小硬件定时器误差)。
该内容对您有帮助吗?
是意见反馈该内容对您有帮助吗?
是意见反馈