Last Updated on : 2023-09-06 10:19:56download
This topic describes how to develop a Matter gateway with TuyaOS Gateway Development Framework.
This section describes how to enable Matter features with TuyaOS Gateway Development Framework and implement Matter gateway capabilities with Tuya’s ZS3L module. A Matter gateway can connect to Thread sub-devices and bridge Zigbee sub-devices to interoperate with Matter networks.
0
in the configuration file.To enable Thread connectivity and bridging Zigbee sub-devices into Matter, you need to write a DP engine file and upload it to the Tuya IoT Development Platform. For more information about the DP engine file, see Matter Gateway Development Kit.
Two interfaces are used to enable Matter features.
These two interfaces have the same parameters in JSON, but differ in configurations.
typedef struct {
BOOL_T isinit;
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;
typedef MATTER_MANUFACTYORY_DATA_T* (*MATTER_MANUFACTORY_DATA_GET_CB)(VOID);
Implement reading the Matter production testing data from the struct MATTER_MANUFACTYORY_DATA_T
that is stored in the gateway’s non-volatile memory. The SDK will use this data. A callback is provided to facilitate implementation.
Configuration description
Fields in the JSON data:
Field | Description |
---|---|
thread |
|
Example
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;
}
The user_prod_test_matter_get
function is used to get the certificate that is configured in Matter protection testing.
When the gateway is unbound, call this function to instruct the SDK to delete the binding data.
/**
* @brief: the unbind of matter gateway. when 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);
When the gateway is reset, call this function to erase the data from the device.
/**
* @brief: clear data when resetting. when reset type is GW_RESET_DATA_FACTORY
*
* @param[in] VOID: .
* @return OPRT_OK on success. Others on error
*/
OPERATE_RET matter_clear_data(VOID);
When the gateway is reset, call this function to instruct the SDK to execute the factory reset process.
/**
* @brief: the reset of Matter gateway. When 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;
Is this page helpful?
YesFeedbackIs this page helpful?
YesFeedback