更新时间:2024-06-25 06:01:39下载pdf
本文介绍如何使用 TuyaOS 网关开发框架支持 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 引擎文件,上传到 涂鸦开发者平台 即可。有关 DP 引擎文件编写方法以及上传流程,请参考 子设备配置文件接入。
开启 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;
该内容对您有帮助吗?
是意见反馈该内容对您有帮助吗?
是意见反馈