接入 Matter 设备

更新时间:2023-12-27 03:32:21下载pdf

本文介绍如何使用 TuyaOS 网关开发框架支持 Matter 协议的网关产品。

Matter 业务

本小节介绍使用 TuyaOS 网关开发框架如何开启 Matter 功能,通过搭配涂鸦 ZS3L 模组,实现 Matter 网关能力。完成开发后,可以接入 Thread 子设备,以及桥接 Zigbee 子设备到 Matter 网络中。

  • 如果您想接入 Thread 子设备,则需要在配置文件中开启 Thread 子设备功能,同时启动 OpenThread Border Router(OTBR)服务。 在网关配置文件中设置 thread 字段,示例如下:

    "matter":{
        "thread": {
            "netif_name":"wpan0"
        }
    }
    
  • 如果您想关闭 Thread 子设备接入,则需要在配置文件中设置删除 thread 字段部分接口。示例如下:

    "matter":{
    }
    
  • 如果您想桥接 Zigbee 子设备,则需要开启 Zigbee 业务功能,进行正常的 Zigbee 接入流程。

    接入 Thread 子设备,以及桥接 Zigbee 子设备到 Matter 网络,您需要编写 DP 引擎文件,上传到 涂鸦 IoT 开发平台 即可。有关 DP 引擎文件编写方法以及上传流程,请参考 子设备配置文件接入

初始化与启动 Matter 网关功能

开启 Matter 功能主要涉及以下接口:

  • Matter 初始化
  • Matter 启动
  • Matter 产测数据导入

初始化以及启动接口的参数都是相同的 JSON 数据,区别在于配置信息不同。

typedef struct {
    CHAR_T *matterDacCrt;
    UINT_T matterDacCrtLen;
    CHAR_T *matterPaiCrt;
    UINT_T matterPaiCrtLen;
    CHAR_T *matterResource;
    UINT_T matterResourceLen;
    CHAR_T *matterPrivateKey;
    UINT_T matterPrivateKeyLen;
    CHAR_T *matterPubKey;
    UINT_T matterPubKeyLen;
} MATTER_MANUFACTYORY_DATA_T;

实现读出保存在网关设备非易失性存储区的 Matter 产测数据,保存在结构体 MATTER_MANUFACTYORY_DATA_T 中,供 SDK 使用。当前为了方便体验,直接提供回调函数方式。

使用示例

int main(int argc, char **argv)
{
    ...
     /* init tuya service */
    ty_cJSON *js_tuya_cfg = ty_cJSON_GetObjectItem(cfg, "tuya");
    if (js_tuya_cfg != NULL) {
        // built-in Zigbee service
        ty_cJSON *js_zb_cfg = ty_cJSON_GetObjectItem(js_tuya_cfg, "zigbee");
        if (js_zb_cfg != NULL) {
            tuya_zigbee_svc_init(js_zb_cfg);
        }
        // built-in matter service
        ty_cJSON *js_matter_cfg = ty_cJSON_GetObjectItem(js_tuya_cfg, "matter");
        if (js_matter_cfg != NULL) {
            matter_svc_init(js_matter_cfg);
        }
    }
    ...

    // start tuya service
    if (js_tuya_cfg != NULL) {
        ty_cJSON *js_matter_cfg = ty_cJSON_GetObjectItem(js_tuya_cfg, "matter");
        if (js_matter_cfg != NULL) {
            matter_manufactory_data_set(user_prod_test_matter_get);
            matter_svc_start(js_matter_cfg);
        }
    }
    ...
    return 0;
}

user_prod_test_matter_get 函数为产测代码中获取 Matter 相关产测时配置的证书信息。

解绑

当网关解绑时,需要调用此函数,SDK 内部会删除绑定数据。

/**
  * @brief: the unbind of matter gateway. The reset type is GW_REMOTE_UNACTIVE or GW_LOCAL_UNACTIVE.
  *
  * @param[in] VOID:
  * @return OPRT_OK on success. Others on error
  */
OPERATE_RET matter_unactive(VOID);

清除数据

当网关重置时,调用此函数,清除保存在设备上的数据。

/**
  * @brief: clear data when resetting. The reset type is GW_RESET_DATA_FACTORY
  *
  * @param[in] VOID: .
  * @return OPRT_OK on success. Others on error
  */
OPERATE_RET matter_clear_data(VOID);

恢复出厂设置

当网关重置时,调用此函数,SDK 执行 Matter 恢复出厂设置流程。

/**
  * @brief: the reset of Matter gateway. The reset type is GW_REMOTE_RESET_FACTORY or GW_LOCAL_RESET_FACTORY
  *
  * @param[in] VOID:
  * @return OPRT_OK on success. Others on error
  */
OPERATE_RET matter_factory_reset(VOID);

使用用例

STATIC VOID __gw_reset_cb(GW_RESET_TYPE_E type)
{
    PR_DEBUG("gw reset callback, type: %d", type);

    if ((GW_REMOTE_RESET_FACTORY == type) || (GW_LOCAL_RESET_FACTORY == type)) {
        matter_factory_reset();
    }
    else if ((GW_REMOTE_UNACTIVE == type) || (GW_LOCAL_UNACTIVE == type)){
        matter_unactive();
    }
    else if(GW_RESET_DATA_FACTORY == type) {
        matter_clear_data();
    }
    else{
        PR_DEBUG("NOT SUPPORTED, type: %d", type);
    }

    if (type != GW_RESET_DATA_FACTORY) {
        sleep(3);
       /* restart GW */
        system("/tmp/tuya/tuya_start.sh /tmp/tuya &");
    }
}

int main(int argc, char **argv)
{
    (VOID_T) argc;
    (VOID_T) argv;
    OPERATE_RET rt = OPRT_OK;

    TY_GW_INFRA_CBS_S gw_cbs = {
        .gw_reset_cb       = __gw_reset_cb,
        .gw_reboot_cb      = __gw_reboot_cb,
        .gw_active_stat_cb = __gw_active_cb,
        .gw_upgrade_cb     = __gw_upgrade_cb,
    };

    TUYA_CALL_ERR_RETURN(user_svc_init((VOID *)&gw_cbs));
    ...
    while (1) {
        tal_system_sleep(10*1000);
    }
    return 0;