/* * Copyright (C) 2015-2018 Alibaba Group Holding Limited */ #include "iotx_dm_internal.h" #if defined(DEPRECATED_LINKKIT) && defined(DEVICE_MODEL_GATEWAY) #include "impl_gateway.h" #ifdef INFRA_MEM_STATS #include "infra_mem_stats.h" #define IMPL_GATEWAY_MALLOC(size) LITE_malloc(size, MEM_MAGIC, "impl.gateway") #define IMPL_GATEWAY_FREE(ptr) IMPL_GATEWAY_FREE(ptr) #else #define IMPL_GATEWAY_MALLOC(size) HAL_Malloc(size) #define IMPL_GATEWAY_FREE(ptr) {HAL_Free((void *)ptr);ptr = NULL;} #endif #ifdef INFRA_LOG #include "infra_log.h" #define impl_gateway_err(...) log_err("impl.gateway", __VA_ARGS__) #define impl_gateway_info(...) log_info("impl.gateway", __VA_ARGS__) #define impl_gateway_debug(...) log_debug("impl.gateway", __VA_ARGS__) #else #define impl_gateway_err(...) #define impl_gateway_info(...) #define impl_gateway_debug(...) #endif static linkkit_gateway_legacy_ctx_t g_linkkit_gateway_legacy_ctx = {0}; static linkkit_gateway_legacy_ctx_t *_linkkit_gateway_legacy_get_ctx(void) { return &g_linkkit_gateway_legacy_ctx; } static void _linkkit_gateway_mutex_lock(void) { linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); if (linkkit_gateway_ctx->mutex) { HAL_MutexLock(linkkit_gateway_ctx->mutex); } } static void _linkkit_gateway_mutex_unlock(void) { linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); if (linkkit_gateway_ctx->mutex) { HAL_MutexUnlock(linkkit_gateway_ctx->mutex); } } static void _linkkit_gateway_upstream_mutex_lock(void) { linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); if (linkkit_gateway_ctx->upstream_mutex) { HAL_MutexLock(linkkit_gateway_ctx->upstream_mutex); } } static void _linkkit_gateway_upstream_mutex_unlock(void) { linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); if (linkkit_gateway_ctx->upstream_mutex) { HAL_MutexUnlock(linkkit_gateway_ctx->upstream_mutex); } } static int _linkkit_gateway_callback_list_insert(int devid, linkkit_cbs_t *callback, void *context) { linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); linkkit_gateway_dev_callback_node_t *search_node = NULL, *node = NULL; list_for_each_entry(search_node, &linkkit_gateway_ctx->dev_callback_list, linked_list, linkkit_gateway_dev_callback_node_t) { if (search_node->devid == devid) { impl_gateway_info("Device Already Exist: %d", devid); return SUCCESS_RETURN; } } node = IMPL_GATEWAY_MALLOC(sizeof(linkkit_gateway_dev_callback_node_t)); if (node == NULL) { return STATE_SYS_DEPEND_MALLOC; } memset(node, 0, sizeof(linkkit_gateway_dev_callback_node_t)); node->devid = devid; node->callback = callback; node->callback_ctx = context; INIT_LIST_HEAD(&node->linked_list); list_add(&node->linked_list, &linkkit_gateway_ctx->dev_callback_list); return SUCCESS_RETURN; } static int _linkkit_gateway_callback_list_remove(int devid) { linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); linkkit_gateway_dev_callback_node_t *search_node = NULL; list_for_each_entry(search_node, &linkkit_gateway_ctx->dev_callback_list, linked_list, linkkit_gateway_dev_callback_node_t) { if (search_node->devid == devid) { impl_gateway_info("Device Found: %d, Delete It", devid); list_del(&search_node->linked_list); IMPL_GATEWAY_FREE(search_node); return SUCCESS_RETURN; } } return FAIL_RETURN; } static int _linkkit_gateway_callback_list_search(int devid, linkkit_gateway_dev_callback_node_t **node) { linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); linkkit_gateway_dev_callback_node_t *search_node = NULL; if (devid < 0 || node == NULL || *node != NULL) { return FAIL_RETURN; } list_for_each_entry(search_node, &linkkit_gateway_ctx->dev_callback_list, linked_list, linkkit_gateway_dev_callback_node_t) { if (search_node->devid == devid) { impl_gateway_info("Device Found: %d", devid); *node = search_node; return SUCCESS_RETURN; } } return FAIL_RETURN; } static void _linkkit_gateway_callback_list_destroy(void) { linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); linkkit_gateway_dev_callback_node_t *search_node = NULL; linkkit_gateway_dev_callback_node_t *next_node = NULL; list_for_each_entry_safe(search_node, next_node, &linkkit_gateway_ctx->dev_callback_list, linked_list, linkkit_gateway_dev_callback_node_t) { list_del(&search_node->linked_list); IMPL_GATEWAY_FREE(search_node); } } static int _linkkit_gateway_upstream_sync_callback_list_insert(int msgid, void *semaphore, linkkit_gateway_upstream_sync_callback_node_t **node) { linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); linkkit_gateway_upstream_sync_callback_node_t *search_node = NULL; list_for_each_entry(search_node, &linkkit_gateway_ctx->upstream_sync_callback_list, linked_list, linkkit_gateway_upstream_sync_callback_node_t) { if (search_node->msgid == msgid) { impl_gateway_info("Message Already Exist: %d", msgid); return FAIL_RETURN; } } search_node = IMPL_GATEWAY_MALLOC(sizeof(linkkit_gateway_upstream_sync_callback_node_t)); if (search_node == NULL) { return STATE_SYS_DEPEND_MALLOC; } memset(search_node, 0, sizeof(linkkit_gateway_upstream_sync_callback_node_t)); search_node->msgid = msgid; search_node->semaphore = semaphore; INIT_LIST_HEAD(&search_node->linked_list); list_add(&search_node->linked_list, &linkkit_gateway_ctx->upstream_sync_callback_list); impl_gateway_info("New Message, msgid: %d", msgid); *node = search_node; return SUCCESS_RETURN; } static int _linkkit_gateway_upstream_sync_callback_list_remove(int msgid) { linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); linkkit_gateway_upstream_sync_callback_node_t *search_node = NULL; list_for_each_entry(search_node, &linkkit_gateway_ctx->upstream_sync_callback_list, linked_list, linkkit_gateway_upstream_sync_callback_node_t) { if (search_node->msgid == msgid) { impl_gateway_info("Message Found: %d, Delete It", msgid); HAL_SemaphoreDestroy(search_node->semaphore); list_del(&search_node->linked_list); IMPL_GATEWAY_FREE(search_node); return SUCCESS_RETURN; } } return FAIL_RETURN; } static int _linkkit_gateway_upstream_sync_callback_list_search(int msgid, linkkit_gateway_upstream_sync_callback_node_t **node) { linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); linkkit_gateway_upstream_sync_callback_node_t *search_node = NULL; if (node == NULL || *node != NULL) { return FAIL_RETURN; } list_for_each_entry(search_node, &linkkit_gateway_ctx->upstream_sync_callback_list, linked_list, linkkit_gateway_upstream_sync_callback_node_t) { if (search_node->msgid == msgid) { impl_gateway_info("Sync Message Found: %d", msgid); *node = search_node; return SUCCESS_RETURN; } } return FAIL_RETURN; } static void _linkkit_gateway_upstream_sync_callback_list_destroy(void) { linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); linkkit_gateway_upstream_sync_callback_node_t *search_node = NULL, *next_node = NULL; list_for_each_entry_safe(search_node, next_node, &linkkit_gateway_ctx->upstream_sync_callback_list, linked_list, linkkit_gateway_upstream_sync_callback_node_t) { list_del(&search_node->linked_list); HAL_SemaphoreDestroy(search_node->semaphore); IMPL_GATEWAY_FREE(search_node); } } static int _linkkit_gateway_upstream_async_callback_list_insert(int msgid, int timeout_ms, linkkit_gateway_upstream_async_callback callback, void *context) { linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); linkkit_gateway_upstream_async_callback_node_t *search_node = NULL, *node = NULL; list_for_each_entry(search_node, &linkkit_gateway_ctx->upstream_async_callback_list, linked_list, linkkit_gateway_upstream_async_callback_node_t) { if (search_node->msgid == msgid) { impl_gateway_info("Async Message Already Exist: %d", msgid); return FAIL_RETURN; } } node = IMPL_GATEWAY_MALLOC(sizeof(linkkit_gateway_upstream_async_callback_node_t)); if (node == NULL) { return STATE_SYS_DEPEND_MALLOC; } memset(node, 0, sizeof(linkkit_gateway_upstream_async_callback_node_t)); node->msgid = msgid; node->timeout_ms = timeout_ms; node->timestamp_ms = HAL_UptimeMs(); node->callback = callback; node->callback_ctx = context; INIT_LIST_HEAD(&node->linked_list); list_add(&node->linked_list, &linkkit_gateway_ctx->upstream_async_callback_list); return SUCCESS_RETURN; } static int _linkkit_gateway_upstream_async_callback_list_remove(int msgid) { linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); linkkit_gateway_upstream_async_callback_node_t *search_node = NULL; list_for_each_entry(search_node, &linkkit_gateway_ctx->upstream_async_callback_list, linked_list, linkkit_gateway_upstream_async_callback_node_t) { if (search_node->msgid == msgid) { impl_gateway_info("Async Message Found: %d, Delete It", msgid); list_del(&search_node->linked_list); IMPL_GATEWAY_FREE(search_node); return SUCCESS_RETURN; } } return FAIL_RETURN; } static int _linkkit_gateway_upstream_async_callback_list_search(int msgid, linkkit_gateway_upstream_async_callback_node_t **node) { linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); linkkit_gateway_upstream_async_callback_node_t *search_node = NULL; if (node == NULL || *node != NULL) { return FAIL_RETURN; } list_for_each_entry(search_node, &linkkit_gateway_ctx->upstream_async_callback_list, linked_list, linkkit_gateway_upstream_async_callback_node_t) { if (search_node->msgid == msgid) { impl_gateway_info("Async Message Found: %d", msgid); *node = search_node; return SUCCESS_RETURN; } } return FAIL_RETURN; } static void _linkkit_gateway_upstream_async_callback_list_destroy(void) { linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); linkkit_gateway_upstream_async_callback_node_t *search_node = NULL, *next_node = NULL; list_for_each_entry_safe(search_node, next_node, &linkkit_gateway_ctx->upstream_async_callback_list, linked_list, linkkit_gateway_upstream_async_callback_node_t) { list_del(&search_node->linked_list); IMPL_GATEWAY_FREE(search_node); } } static void _linkkit_gateway_upstream_callback_remove(int msgid, int code) { int res = 0; linkkit_gateway_upstream_sync_callback_node_t *sync_node = NULL; res = _linkkit_gateway_upstream_sync_callback_list_search(msgid, &sync_node); if (res != SUCCESS_RETURN) { linkkit_gateway_upstream_async_callback_node_t *node = NULL; res = _linkkit_gateway_upstream_async_callback_list_search(msgid, &node); if (res == SUCCESS_RETURN) { uint64_t current_time = HAL_UptimeMs(); if (current_time - node->timestamp_ms > node->timeout_ms) { if (node->callback) { node->callback(FAIL_RETURN, node->callback_ctx); } } else { if (node->callback) { int return_value = (code == IOTX_DM_ERR_CODE_SUCCESS) ? (SUCCESS_RETURN) : (FAIL_RETURN); impl_gateway_info("Async Message %d Result: %d", msgid, return_value); node->callback(return_value, node->callback_ctx); } } _linkkit_gateway_upstream_async_callback_list_remove(msgid); } } else { sync_node->code = (code == IOTX_DM_ERR_CODE_SUCCESS) ? (SUCCESS_RETURN) : (FAIL_RETURN); impl_gateway_info("Sync Message %d Result: %d", msgid, sync_node->code); HAL_SemaphorePost(sync_node->semaphore); } } linkkit_params_t *linkkit_gateway_get_default_params(void) { linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); /* Legacy Parameter */ linkkit_gateway_ctx->init_params.maxMsgSize = 20 * 1024; linkkit_gateway_ctx->init_params.maxMsgQueueSize = 16; linkkit_gateway_ctx->init_params.threadPoolSize = 4; linkkit_gateway_ctx->init_params.threadStackSize = 8 * 1024; return &linkkit_gateway_ctx->init_params; } int linkkit_gateway_setopt(linkkit_params_t *params, int option, void *value, int value_len) { linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); if (params == NULL || value == NULL) { return FAIL_RETURN; } switch (option) { case LINKKIT_OPT_MAX_MSG_SIZE: { if (value_len != sizeof(int)) { return FAIL_RETURN; } if (*((int *)value) < 256) { impl_gateway_err("maxMsgSize should not less than 256 bytes\n"); return FAIL_RETURN; } linkkit_gateway_ctx->init_params.maxMsgSize = *((int *)value); } break; case LINKKIT_OPT_MAX_MSG_QUEUE_SIZE: { if (value_len != sizeof(int)) { return FAIL_RETURN; } if (*((int *)value) < 1) { impl_gateway_err("maxMsgQueueSize should not less than 1\n"); return FAIL_RETURN; } linkkit_gateway_ctx->init_params.maxMsgQueueSize = *((int *)value); } break; case LINKKIT_OPT_THREAD_POOL_SIZE: { if (value_len != sizeof(int)) { return FAIL_RETURN; } if (*((int *)value) < 1) { impl_gateway_err("threadPoolSize should not less than 1\n"); return FAIL_RETURN; } linkkit_gateway_ctx->init_params.threadPoolSize = *((int *)value); } break; case LINKKIT_OPT_THREAD_STACK_SIZE: { if (value_len != sizeof(int)) { return FAIL_RETURN; } if (*((int *)value) < 1024) { impl_gateway_err("threadStackSize should not less than 1024\n"); return FAIL_RETURN; } linkkit_gateway_ctx->init_params.threadStackSize = *((int *)value); } break; case LINKKIT_OPT_PROPERTY_POST_REPLY: iotx_dm_set_opt(0, value); break; case LINKKIT_OPT_EVENT_POST_REPLY: iotx_dm_set_opt(1, value); break; case LINKKIT_OPT_PROPERTY_SET_REPLY: iotx_dm_set_opt(2, value); break; default: impl_gateway_err("unknow option: %d\n", option); return FAIL_RETURN; } return SUCCESS_RETURN; } int linkkit_gateway_set_event_callback(linkkit_params_t *params, int (*event_cb)(linkkit_event_t *ev, void *ctx), void *ctx) { linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); if (params == NULL || event_cb == NULL) { return FAIL_RETURN; } linkkit_gateway_ctx->init_params.event_cb = event_cb; linkkit_gateway_ctx->init_params.ctx = ctx; return SUCCESS_RETURN; } int linkkit_gateway_init(linkkit_params_t *initParams) { linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); if (initParams == NULL) { return FAIL_RETURN; } if (linkkit_gateway_ctx->is_inited == 1) { return FAIL_RETURN; } if (initParams->maxMsgSize < 256 || initParams->maxMsgQueueSize < 1 || initParams->threadPoolSize < 1 || initParams->threadStackSize < 1024) { return FAIL_RETURN; } linkkit_gateway_ctx->is_inited = 1; return SUCCESS_RETURN; } int linkkit_gateway_exit(void) { linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); if (linkkit_gateway_ctx->is_inited == 0) { return FAIL_RETURN; } linkkit_gateway_ctx->is_inited = 0; return SUCCESS_RETURN; } static void _linkkit_gateway_event_callback(iotx_dm_event_types_t type, char *payload) { linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); impl_gateway_info("Receive Message Type: %d", type); if (payload) { impl_gateway_info("Receive Message: %s", payload); } switch (type) { case IOTX_DM_EVENT_CLOUD_CONNECTED: { if (linkkit_gateway_ctx->init_params.event_cb) { linkkit_event_t event; memset(&event, 0, sizeof(linkkit_event_t)); event.event_type = LINKKIT_EVENT_CLOUD_CONNECTED; linkkit_gateway_ctx->init_params.event_cb(&event, linkkit_gateway_ctx->init_params.ctx); } } break; case IOTX_DM_EVENT_CLOUD_DISCONNECT: { if (linkkit_gateway_ctx->init_params.event_cb) { linkkit_event_t event; memset(&event, 0, sizeof(linkkit_event_t)); event.event_type = LINKKIT_EVENT_CLOUD_DISCONNECTED; linkkit_gateway_ctx->init_params.event_cb(&event, linkkit_gateway_ctx->init_params.ctx); } } break; case IOTX_DM_EVENT_SUBDEV_REGISTER_REPLY: { int res = 0; lite_cjson_t lite, lite_item_id, lite_item_code, lite_item_devid; if (payload == NULL) { return; } /* Parse JSON */ res = lite_cjson_parse(payload, strlen(payload), &lite); if (res != SUCCESS_RETURN || !lite_cjson_is_object(&lite)) { return; } /* Parse Message ID */ res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_ID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_ID), &lite_item_id); if (res != SUCCESS_RETURN || !lite_cjson_is_number(&lite_item_id)) { return; } impl_gateway_info("Current Msg ID: %d", lite_item_id.value_int); /* Parse Message Code */ res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_CODE, strlen(LINKKIT_GATEWAY_LEGACY_KEY_CODE), &lite_item_code); if (res != SUCCESS_RETURN || !lite_cjson_is_number(&lite_item_code)) { return; } impl_gateway_info("Current Code: %d", lite_item_code.value_int); /* Parse Devid */ res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_DEVID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_DEVID), &lite_item_devid); if (res != SUCCESS_RETURN || !lite_cjson_is_number(&lite_item_devid)) { return; } impl_gateway_info("Current devid: %d", lite_item_devid.value_int); _linkkit_gateway_upstream_mutex_lock(); _linkkit_gateway_upstream_callback_remove(lite_item_id.value_int, lite_item_code.value_int); _linkkit_gateway_upstream_mutex_unlock(); } break; case IOTX_DM_EVENT_SUBDEV_UNREGISTER_REPLY: { } break; case IOTX_DM_EVENT_TOPO_ADD_REPLY: { int res = 0; lite_cjson_t lite, lite_item_id, lite_item_code, lite_item_devid; if (payload == NULL) { return; } /* Parse JSON */ res = lite_cjson_parse(payload, strlen(payload), &lite); if (res != SUCCESS_RETURN || !lite_cjson_is_object(&lite)) { return; } /* Parse Message ID */ res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_ID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_ID), &lite_item_id); if (res != SUCCESS_RETURN || !lite_cjson_is_number(&lite_item_id)) { return; } impl_gateway_info("Current Msg ID: %d", lite_item_id.value_int); /* Parse Message Code */ res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_CODE, strlen(LINKKIT_GATEWAY_LEGACY_KEY_CODE), &lite_item_code); if (res != SUCCESS_RETURN || !lite_cjson_is_number(&lite_item_code)) { return; } impl_gateway_info("Current Code: %d", lite_item_code.value_int); /* Parse Devid */ res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_DEVID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_DEVID), &lite_item_devid); if (res != SUCCESS_RETURN || !lite_cjson_is_number(&lite_item_devid)) { return; } impl_gateway_info("Current devid: %d", lite_item_devid.value_int); _linkkit_gateway_upstream_mutex_lock(); _linkkit_gateway_upstream_callback_remove(lite_item_id.value_int, lite_item_code.value_int); _linkkit_gateway_upstream_mutex_unlock(); } break; case IOTX_DM_EVENT_TOPO_DELETE_REPLY: { int res = 0; lite_cjson_t lite, lite_item_id, lite_item_code, lite_item_devid; if (payload == NULL) { return; } /* Parse Payload */ memset(&lite, 0, sizeof(lite_cjson_t)); res = lite_cjson_parse(payload, strlen(payload), &lite); if (res != SUCCESS_RETURN) { return; } /* Parse Id */ memset(&lite_item_id, 0, sizeof(lite_cjson_t)); res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_ID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_ID), &lite_item_id); if (res != SUCCESS_RETURN) { return; } impl_gateway_debug("Current Id: %d", lite_item_id.value_int); /* Parse Code */ memset(&lite_item_code, 0, sizeof(lite_cjson_t)); res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_CODE, strlen(LINKKIT_GATEWAY_LEGACY_KEY_CODE), &lite_item_code); if (res != SUCCESS_RETURN) { return; } impl_gateway_debug("Current Code: %d", lite_item_code.value_int); /* Parse Devid */ memset(&lite_item_devid, 0, sizeof(lite_cjson_t)); res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_DEVID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_DEVID), &lite_item_devid); if (res != SUCCESS_RETURN) { return; } impl_gateway_debug("Current Devid: %d", lite_item_devid.value_int); _linkkit_gateway_upstream_mutex_lock(); _linkkit_gateway_upstream_callback_remove(lite_item_id.value_int, lite_item_code.value_int); _linkkit_gateway_upstream_mutex_unlock(); } break; case IOTX_DM_EVENT_COMBINE_LOGIN_REPLY: { int res = 0; lite_cjson_t lite, lite_item_id, lite_item_code, lite_item_devid; if (payload == NULL) { return; } /* Parse Payload */ memset(&lite, 0, sizeof(lite_cjson_t)); res = lite_cjson_parse(payload, strlen(payload), &lite); if (res != SUCCESS_RETURN) { return; } /* Parse Id */ memset(&lite_item_id, 0, sizeof(lite_cjson_t)); res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_ID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_ID), &lite_item_id); if (res != SUCCESS_RETURN) { return; } impl_gateway_debug("Current Id: %d", lite_item_id.value_int); /* Parse Code */ memset(&lite_item_code, 0, sizeof(lite_cjson_t)); res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_CODE, strlen(LINKKIT_GATEWAY_LEGACY_KEY_CODE), &lite_item_code); if (res != SUCCESS_RETURN) { return; } impl_gateway_debug("Current Code: %d", lite_item_code.value_int); /* Parse Devid */ memset(&lite_item_devid, 0, sizeof(lite_cjson_t)); res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_DEVID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_DEVID), &lite_item_devid); if (res != SUCCESS_RETURN) { return; } impl_gateway_debug("Current Devid: %d", lite_item_devid.value_int); _linkkit_gateway_upstream_mutex_lock(); _linkkit_gateway_upstream_callback_remove(lite_item_id.value_int, lite_item_code.value_int); _linkkit_gateway_upstream_mutex_unlock(); } break; case IOTX_DM_EVENT_COMBINE_LOGOUT_REPLY: { int res = 0; lite_cjson_t lite, lite_item_id, lite_item_code, lite_item_devid; if (payload == NULL) { return; } /* Parse Payload */ memset(&lite, 0, sizeof(lite_cjson_t)); res = lite_cjson_parse(payload, strlen(payload), &lite); if (res != SUCCESS_RETURN) { return; } /* Parse Id */ memset(&lite_item_id, 0, sizeof(lite_cjson_t)); res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_ID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_ID), &lite_item_id); if (res != SUCCESS_RETURN) { return; } impl_gateway_debug("Current Id: %d", lite_item_id.value_int); /* Parse Code */ memset(&lite_item_code, 0, sizeof(lite_cjson_t)); res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_CODE, strlen(LINKKIT_GATEWAY_LEGACY_KEY_CODE), &lite_item_code); if (res != SUCCESS_RETURN) { return; } impl_gateway_debug("Current Code: %d", lite_item_code.value_int); /* Parse Devid */ memset(&lite_item_devid, 0, sizeof(lite_cjson_t)); res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_DEVID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_DEVID), &lite_item_devid); if (res != SUCCESS_RETURN) { return; } impl_gateway_debug("Current Devid: %d", lite_item_devid.value_int); _linkkit_gateway_upstream_mutex_lock(); _linkkit_gateway_upstream_callback_remove(lite_item_id.value_int, lite_item_code.value_int); _linkkit_gateway_upstream_mutex_unlock(); } break; case IOTX_DM_EVENT_PROPERTY_SET: { int res = 0; linkkit_gateway_dev_callback_node_t *node = NULL; lite_cjson_t lite, lite_item_devid, lite_item_payload; char *params = NULL; if (payload == NULL) { return; } /* Parse Payload */ memset(&lite, 0, sizeof(lite_cjson_t)); res = lite_cjson_parse(payload, strlen(payload), &lite); if (res != SUCCESS_RETURN) { return; } /* Parse Devid */ memset(&lite_item_devid, 0, sizeof(lite_cjson_t)); res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_DEVID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_DEVID), &lite_item_devid); if (res != SUCCESS_RETURN) { return; } impl_gateway_debug("Current Devid: %d", lite_item_devid.value_int); /* Parse Payload */ memset(&lite_item_payload, 0, sizeof(lite_cjson_t)); res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_PAYLOAD, strlen(LINKKIT_GATEWAY_LEGACY_KEY_PAYLOAD), &lite_item_payload); if (res != SUCCESS_RETURN) { return; } impl_gateway_debug("Current Payload: %.*", lite_item_payload.value_length, lite_item_payload.value); params = IMPL_GATEWAY_MALLOC(lite_item_payload.value_length + 1); if (params == NULL) { return; } memset(params, 0, lite_item_payload.value_length + 1); memcpy(params, lite_item_payload.value, lite_item_payload.value_length); _linkkit_gateway_upstream_mutex_lock(); res = _linkkit_gateway_callback_list_search(lite_item_devid.value_int, &node); _linkkit_gateway_upstream_mutex_unlock(); if (res == SUCCESS_RETURN) { if (node->callback->set_property) { node->callback->set_property(params, node->callback_ctx); } } IMPL_GATEWAY_FREE(params); } break; case IOTX_DM_EVENT_GATEWAY_PERMIT: { int res = 0; char product_key[IOTX_PRODUCT_KEY_LEN + 1] = {0}; lite_cjson_t lite, lite_item_pk, lite_item_timeout; if (payload == NULL) { return; } /* Parse Payload */ memset(&lite, 0, sizeof(lite_cjson_t)); res = lite_cjson_parse(payload, strlen(payload), &lite); if (res != SUCCESS_RETURN) { return; } /* Parse Product Key */ memset(&lite_item_pk, 0, sizeof(lite_cjson_t)); res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_PRODUCT_KEY, strlen(LINKKIT_GATEWAY_LEGACY_KEY_PRODUCT_KEY), &lite_item_pk); if (res != SUCCESS_RETURN || lite_item_pk.value_length >= IOTX_PRODUCT_KEY_LEN + 1) { return; } impl_gateway_debug("Current Product Key: %.*s", lite_item_pk.value_length, lite_item_pk.value); /* Parse Timeout */ memset(&lite_item_timeout, 0, sizeof(lite_cjson_t)); res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_TIME, strlen(LINKKIT_GATEWAY_LEGACY_KEY_TIME), &lite_item_timeout); if (res != SUCCESS_RETURN) { return; } impl_gateway_debug("Current Timeout: %d", lite_item_timeout.value_int); memcpy(product_key, lite_item_pk.value, lite_item_pk.value_length); if (linkkit_gateway_ctx->init_params.event_cb) { linkkit_event_t event; memset(&event, 0, sizeof(linkkit_event_t)); event.event_type = LINKKIT_EVENT_SUBDEV_PERMITED; event.event_data.subdev_permited.productKey = product_key; event.event_data.subdev_permited.timeoutSec = lite_item_timeout.value_int; linkkit_gateway_ctx->init_params.event_cb(&event, linkkit_gateway_ctx->init_params.ctx); } } break; case IOTX_DM_EVENT_THING_SERVICE_REQUEST: { int res = 0; linkkit_gateway_dev_callback_node_t *node = NULL; lite_cjson_t lite, lite_item_id, lite_item_devid, lite_item_serviceid, lite_item_paylaod; char *identifier = NULL, *input = NULL, *output = NULL; if (payload == NULL) { return; } /* Parse Payload */ memset(&lite, 0, sizeof(lite_cjson_t)); res = lite_cjson_parse(payload, strlen(payload), &lite); if (res != SUCCESS_RETURN) { return; } /* Parse Id */ memset(&lite_item_id, 0, sizeof(lite_cjson_t)); res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_ID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_ID), &lite_item_id); if (res != SUCCESS_RETURN) { return; } impl_gateway_debug("Current Id: %d", lite_item_id.value_int); /* Parse Devid */ memset(&lite_item_devid, 0, sizeof(lite_cjson_t)); res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_DEVID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_DEVID), &lite_item_devid); if (res != SUCCESS_RETURN) { return; } impl_gateway_debug("Current Devid: %d", lite_item_devid.value_int); /* Parse Serviceid */ memset(&lite_item_serviceid, 0, sizeof(lite_cjson_t)); res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_SERVICEID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_SERVICEID), &lite_item_serviceid); if (res != SUCCESS_RETURN) { return; } impl_gateway_debug("Current ServiceID: %.*s", lite_item_serviceid.value_length, lite_item_serviceid.value); /* Parse Payload */ memset(&lite_item_paylaod, 0, sizeof(lite_cjson_t)); res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_PAYLOAD, strlen(LINKKIT_GATEWAY_LEGACY_KEY_PAYLOAD), &lite_item_paylaod); if (res != SUCCESS_RETURN) { return; } impl_gateway_debug("Current Payload: %.*s", lite_item_paylaod.value_length, lite_item_paylaod.value); identifier = IMPL_GATEWAY_MALLOC(lite_item_serviceid.value_length + 1); if (identifier == NULL) { return; } memset(identifier, 0, lite_item_serviceid.value_length + 1); memcpy(identifier, lite_item_serviceid.value, lite_item_serviceid.value_length); input = IMPL_GATEWAY_MALLOC(lite_item_paylaod.value_length + 1); if (input == NULL) { IMPL_GATEWAY_FREE(identifier); return; } memset(input, 0, lite_item_paylaod.value_length + 1); memcpy(input, lite_item_paylaod.value, lite_item_paylaod.value_length); output = IMPL_GATEWAY_MALLOC(linkkit_gateway_ctx->init_params.maxMsgSize + 1); if (output == NULL) { IMPL_GATEWAY_FREE(identifier); IMPL_GATEWAY_FREE(input); return; } memset(output, 0, linkkit_gateway_ctx->init_params.maxMsgSize + 1); _linkkit_gateway_upstream_mutex_lock(); res = _linkkit_gateway_callback_list_search(lite_item_devid.value_int, &node); _linkkit_gateway_upstream_mutex_unlock(); if (res == SUCCESS_RETURN) { if (node->callback->call_service) { res = node->callback->call_service(identifier, input, output, linkkit_gateway_ctx->init_params.maxMsgSize, node->callback_ctx); if (res == SUCCESS_RETURN) { iotx_dm_deprecated_legacy_send_service_response(lite_item_devid.value_int, lite_item_id.value_int, 200, lite_item_serviceid.value, lite_item_serviceid.value_length, output, strlen(output)); } else { iotx_dm_deprecated_legacy_send_service_response(lite_item_devid.value_int, lite_item_id.value_int, 202, lite_item_serviceid.value, lite_item_serviceid.value_length, "{}", strlen("{}")); } } } IMPL_GATEWAY_FREE(identifier); IMPL_GATEWAY_FREE(input); IMPL_GATEWAY_FREE(output); } break; case IOTX_DM_EVENT_MODEL_DOWN_RAW: { int res = 0; linkkit_gateway_dev_callback_node_t *node = NULL; lite_cjson_t lite, lite_item_devid, lite_item_rawdata; char *output = NULL; if (payload == NULL) { return; } /* Parse Payload */ memset(&lite, 0, sizeof(lite_cjson_t)); res = lite_cjson_parse(payload, strlen(payload), &lite); if (res != SUCCESS_RETURN) { return; } /* Parse Devid */ memset(&lite_item_devid, 0, sizeof(lite_cjson_t)); res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_DEVID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_DEVID), &lite_item_devid); if (res != SUCCESS_RETURN) { return; } impl_gateway_debug("Current Devid: %d", lite_item_devid.value_int); /* Parse Raw Data */ memset(&lite_item_rawdata, 0, sizeof(lite_cjson_t)); res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_PAYLOAD, strlen(LINKKIT_GATEWAY_LEGACY_KEY_PAYLOAD), &lite_item_rawdata); if (res != SUCCESS_RETURN) { return; } impl_gateway_debug("Current Raw Data: %.*s", lite_item_rawdata.value_length, lite_item_rawdata.value); output = IMPL_GATEWAY_MALLOC(linkkit_gateway_ctx->init_params.maxMsgSize + 1); if (output == NULL) { return; } memset(output, 0, linkkit_gateway_ctx->init_params.maxMsgSize + 1); _linkkit_gateway_upstream_mutex_lock(); res = _linkkit_gateway_callback_list_search(lite_item_devid.value_int, &node); _linkkit_gateway_upstream_mutex_unlock(); if (res == SUCCESS_RETURN) { if (node->callback->down_rawdata) { res = node->callback->down_rawdata(lite_item_rawdata.value, lite_item_rawdata.value_length, output, linkkit_gateway_ctx->init_params.maxMsgSize, node->callback_ctx); if (res > 0) { iotx_dm_post_rawdata(lite_item_devid.value_int, output, res); } } } IMPL_GATEWAY_FREE(output); } break; case IOTX_DM_EVENT_MODEL_UP_RAW_REPLY: { int res = 0; linkkit_gateway_dev_callback_node_t *node = NULL; lite_cjson_t lite, lite_item_devid, lite_item_rawdata; if (payload == NULL) { return; } /* Parse Payload */ memset(&lite, 0, sizeof(lite_cjson_t)); res = lite_cjson_parse(payload, strlen(payload), &lite); if (res != SUCCESS_RETURN) { return; } /* Parse Devid */ memset(&lite_item_devid, 0, sizeof(lite_cjson_t)); res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_DEVID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_DEVID), &lite_item_devid); if (res != SUCCESS_RETURN) { return; } impl_gateway_debug("Current Devid: %d", lite_item_devid.value_int); /* Parse Raw Data */ memset(&lite_item_rawdata, 0, sizeof(lite_cjson_t)); res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_PAYLOAD, strlen(LINKKIT_GATEWAY_LEGACY_KEY_PAYLOAD), &lite_item_rawdata); if (res != SUCCESS_RETURN) { return; } impl_gateway_debug("Current Raw Data: %.*s", lite_item_rawdata.value_length, lite_item_rawdata.value); _linkkit_gateway_upstream_mutex_lock(); res = _linkkit_gateway_callback_list_search(lite_item_devid.value_int, &node); _linkkit_gateway_upstream_mutex_unlock(); if (res == SUCCESS_RETURN) { if (node->callback->post_rawdata_reply) { node->callback->post_rawdata_reply(lite_item_rawdata.value, lite_item_rawdata.value_length, node->callback_ctx); } } } break; case IOTX_DM_EVENT_INITIALIZED: { int res = 0; linkkit_gateway_dev_callback_node_t *node = NULL; lite_cjson_t lite, lite_item_devid; if (payload == NULL) { return; } /* Parse Payload */ memset(&lite, 0, sizeof(lite_cjson_t)); res = lite_cjson_parse(payload, strlen(payload), &lite); if (res != SUCCESS_RETURN) { return; } /* Parse Devid */ memset(&lite_item_devid, 0, sizeof(lite_cjson_t)); res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_DEVID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_DEVID), &lite_item_devid); if (res != SUCCESS_RETURN) { return; } impl_gateway_debug("Current Devid: %d", lite_item_devid.value_int); _linkkit_gateway_upstream_mutex_lock(); res = _linkkit_gateway_callback_list_search(lite_item_devid.value_int, &node); _linkkit_gateway_upstream_mutex_unlock(); if (res == SUCCESS_RETURN) { if (node->callback->register_complete) { node->callback->register_complete(node->callback_ctx); } } } break; case IOTX_DM_EVENT_EVENT_PROPERTY_POST_REPLY: { int res = 0; lite_cjson_t lite, lite_item_id, lite_item_code, lite_item_devid; if (payload == NULL) { return; } /* Parse Payload */ memset(&lite, 0, sizeof(lite_cjson_t)); res = lite_cjson_parse(payload, strlen(payload), &lite); if (res != SUCCESS_RETURN) { return; } /* Parse Id */ memset(&lite_item_id, 0, sizeof(lite_cjson_t)); res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_ID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_ID), &lite_item_id); if (res != SUCCESS_RETURN) { return; } impl_gateway_debug("Current Id: %d", lite_item_id.value_int); /* Parse Code */ memset(&lite_item_code, 0, sizeof(lite_cjson_t)); res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_CODE, strlen(LINKKIT_GATEWAY_LEGACY_KEY_CODE), &lite_item_code); if (res != SUCCESS_RETURN) { return; } impl_gateway_debug("Current Code: %d", lite_item_code.value_int); /* Parse Devid */ memset(&lite_item_devid, 0, sizeof(lite_cjson_t)); res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_DEVID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_DEVID), &lite_item_devid); if (res != SUCCESS_RETURN) { return; } impl_gateway_debug("Current Devid: %d", lite_item_devid.value_int); _linkkit_gateway_upstream_mutex_lock(); _linkkit_gateway_upstream_callback_remove(lite_item_id.value_int, lite_item_code.value_int); _linkkit_gateway_upstream_mutex_unlock(); } break; case IOTX_DM_EVENT_EVENT_SPECIFIC_POST_REPLY: { int res = 0; char *eventid = NULL; lite_cjson_t lite, lite_item_id, lite_item_code, lite_item_devid, lite_item_eventid; if (payload == NULL) { return; } /* Parse Payload */ memset(&lite, 0, sizeof(lite_cjson_t)); res = lite_cjson_parse(payload, strlen(payload), &lite); if (res != SUCCESS_RETURN) { return; } /* Parse Id */ memset(&lite_item_id, 0, sizeof(lite_cjson_t)); res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_ID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_ID), &lite_item_id); if (res != SUCCESS_RETURN) { return; } impl_gateway_debug("Current Id: %d", lite_item_id.value_int); /* Parse Code */ memset(&lite_item_code, 0, sizeof(lite_cjson_t)); res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_CODE, strlen(LINKKIT_GATEWAY_LEGACY_KEY_CODE), &lite_item_code); if (res != SUCCESS_RETURN) { return; } impl_gateway_debug("Current Code: %d", lite_item_code.value_int); /* Parse Devid */ memset(&lite_item_devid, 0, sizeof(lite_cjson_t)); res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_DEVID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_DEVID), &lite_item_devid); if (res != SUCCESS_RETURN) { return; } impl_gateway_debug("Current Devid: %d", lite_item_devid.value_int); /* Parse Property ID */ memset(&lite_item_eventid, 0, sizeof(lite_cjson_t)); res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_EVENTID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_EVENTID), &lite_item_eventid); if (res != SUCCESS_RETURN) { return; } impl_gateway_debug("Current EventID: %.*s", lite_item_eventid.value_length, lite_item_eventid.value); eventid = IMPL_GATEWAY_MALLOC(lite_item_eventid.value_length + 1); if (eventid == NULL) { return; } memset(eventid, 0, lite_item_eventid.value_length + 1); memcpy(eventid, lite_item_eventid.value, lite_item_eventid.value_length); _linkkit_gateway_upstream_mutex_lock(); _linkkit_gateway_upstream_callback_remove(lite_item_id.value_int, lite_item_code.value_int); _linkkit_gateway_upstream_mutex_unlock(); IMPL_GATEWAY_FREE(eventid); } break; case IOTX_DM_EVENT_FOTA_NEW_FIRMWARE: { int res = 0; lite_cjson_t lite, lite_item_version; char *version = NULL; if (payload == NULL) { return; } /* Parse Payload */ memset(&lite, 0, sizeof(lite_cjson_t)); res = lite_cjson_parse(payload, strlen(payload), &lite); if (res != SUCCESS_RETURN || !lite_cjson_is_object(&lite)) { return; } /* Parse Version */ memset(&lite_item_version, 0, sizeof(lite_cjson_t)); res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_VERSION, strlen(LINKKIT_GATEWAY_LEGACY_KEY_VERSION), &lite_item_version); if (res != SUCCESS_RETURN || !lite_cjson_is_string(&lite_item_version)) { return; } impl_gateway_debug("Current Firmware Version: %.*s", lite_item_version.value_length, lite_item_version.value); version = IMPL_GATEWAY_MALLOC(lite_item_version.value_length + 1); if (version == NULL) { return; } memset(version, 0, lite_item_version.value_length + 1); memcpy(version, lite_item_version.value, lite_item_version.value_length); if (linkkit_gateway_ctx->fota_callback) { linkkit_gateway_ctx->fota_callback(service_fota_callback_type_new_version_detected, version); } if (version) { IMPL_GATEWAY_FREE(version); } } break; case IOTX_DM_EVENT_DEVICEINFO_UPDATE_REPLY: { int res = 0; lite_cjson_t lite, lite_item_id, lite_item_code, lite_item_devid; if (payload == NULL) { return; } /* Parse Payload */ memset(&lite, 0, sizeof(lite_cjson_t)); res = lite_cjson_parse(payload, strlen(payload), &lite); if (res != SUCCESS_RETURN) { return; } /* Parse Id */ memset(&lite_item_id, 0, sizeof(lite_cjson_t)); res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_ID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_ID), &lite_item_id); if (res != SUCCESS_RETURN) { return; } impl_gateway_debug("Current Id: %d", lite_item_id.value_int); /* Parse Code */ memset(&lite_item_code, 0, sizeof(lite_cjson_t)); res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_CODE, strlen(LINKKIT_GATEWAY_LEGACY_KEY_CODE), &lite_item_code); if (res != SUCCESS_RETURN) { return; } impl_gateway_debug("Current Code: %d", lite_item_code.value_int); /* Parse Devid */ memset(&lite_item_devid, 0, sizeof(lite_cjson_t)); res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_DEVID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_DEVID), &lite_item_devid); if (res != SUCCESS_RETURN) { return; } impl_gateway_debug("Current Devid: %d", lite_item_devid.value_int); _linkkit_gateway_upstream_mutex_lock(); _linkkit_gateway_upstream_callback_remove(lite_item_id.value_int, lite_item_code.value_int); _linkkit_gateway_upstream_mutex_unlock(); } break; case IOTX_DM_EVENT_DEVICEINFO_DELETE_REPLY: { int res = 0; lite_cjson_t lite, lite_item_id, lite_item_code, lite_item_devid; if (payload == NULL) { return; } /* Parse Payload */ memset(&lite, 0, sizeof(lite_cjson_t)); res = lite_cjson_parse(payload, strlen(payload), &lite); if (res != SUCCESS_RETURN) { return; } /* Parse Id */ memset(&lite_item_id, 0, sizeof(lite_cjson_t)); res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_ID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_ID), &lite_item_id); if (res != SUCCESS_RETURN) { return; } impl_gateway_debug("Current Id: %d", lite_item_id.value_int); /* Parse Code */ memset(&lite_item_code, 0, sizeof(lite_cjson_t)); res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_CODE, strlen(LINKKIT_GATEWAY_LEGACY_KEY_CODE), &lite_item_code); if (res != SUCCESS_RETURN) { return; } impl_gateway_debug("Current Code: %d", lite_item_code.value_int); /* Parse Devid */ memset(&lite_item_devid, 0, sizeof(lite_cjson_t)); res = lite_cjson_object_item(&lite, LINKKIT_GATEWAY_LEGACY_KEY_DEVID, strlen(LINKKIT_GATEWAY_LEGACY_KEY_DEVID), &lite_item_devid); if (res != SUCCESS_RETURN) { return; } impl_gateway_debug("Current Devid: %d", lite_item_devid.value_int); _linkkit_gateway_upstream_mutex_lock(); _linkkit_gateway_upstream_callback_remove(lite_item_id.value_int, lite_item_code.value_int); _linkkit_gateway_upstream_mutex_unlock(); } break; default: { impl_gateway_info("Not Found Type For Now, Smile"); } break; } } static void *_linkkit_gateway_dispatch(void *params) { linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = (linkkit_gateway_legacy_ctx_t *)params; if (params == NULL) { return NULL; } while (linkkit_gateway_ctx->is_started) { iotx_dm_dispatch(); HAL_SleepMs(20); } return NULL; } int linkkit_gateway_start(linkkit_cbs_t *cbs, void *ctx) { int res = 0, stack_used = 0; linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); iotx_dm_init_params_t dm_init_params; linkkit_gateway_dev_callback_node_t *node = NULL; if (cbs == NULL) { return FAIL_RETURN; } if (linkkit_gateway_ctx->is_inited == 0) { return FAIL_RETURN; } if (linkkit_gateway_ctx->is_started) { impl_gateway_info("Linkkit Gateway Already Started"); return SUCCESS_RETURN; } linkkit_gateway_ctx->is_inited = 1; linkkit_gateway_ctx->is_started = 1; /* Create Mutex */ linkkit_gateway_ctx->mutex = HAL_MutexCreate(); if (linkkit_gateway_ctx->mutex == NULL) { linkkit_gateway_ctx->is_started = 0; return FAIL_RETURN; } linkkit_gateway_ctx->upstream_mutex = HAL_MutexCreate(); if (linkkit_gateway_ctx->upstream_mutex == NULL) { HAL_MutexDestroy(linkkit_gateway_ctx->mutex); linkkit_gateway_ctx->is_started = 0; return FAIL_RETURN; } /* Initialize Device Manager */ memset(&dm_init_params, 0, sizeof(iotx_dm_init_params_t)); dm_init_params.secret_type = IOTX_DM_DEVICE_SECRET_DEVICE; dm_init_params.domain_type = IOTX_DM_CLOUD_DOMAIN_SHANGHAI; dm_init_params.event_callback = _linkkit_gateway_event_callback; res = iotx_dm_open(); if (res != SUCCESS_RETURN) { HAL_MutexDestroy(linkkit_gateway_ctx->mutex); HAL_MutexDestroy(linkkit_gateway_ctx->upstream_mutex); linkkit_gateway_ctx->is_started = 0; return FAIL_RETURN; } res = iotx_dm_connect(&dm_init_params); if (res != SUCCESS_RETURN) { HAL_MutexDestroy(linkkit_gateway_ctx->mutex); HAL_MutexDestroy(linkkit_gateway_ctx->upstream_mutex); iotx_dm_close(); linkkit_gateway_ctx->is_started = 0; return FAIL_RETURN; } res = iotx_dm_subscribe(IOTX_DM_LOCAL_NODE_DEVID); if (res != SUCCESS_RETURN) { HAL_MutexDestroy(linkkit_gateway_ctx->mutex); HAL_MutexDestroy(linkkit_gateway_ctx->upstream_mutex); iotx_dm_close(); linkkit_gateway_ctx->is_started = 0; return FAIL_RETURN; } res = HAL_ThreadCreate(&linkkit_gateway_ctx->dispatch_thread, _linkkit_gateway_dispatch, linkkit_gateway_ctx, NULL, &stack_used); if (res != SUCCESS_RETURN) { HAL_MutexDestroy(linkkit_gateway_ctx->mutex); HAL_MutexDestroy(linkkit_gateway_ctx->upstream_mutex); iotx_dm_close(); linkkit_gateway_ctx->is_started = 0; return FAIL_RETURN; } /* Insert Gateway Callback And Callback Context Into Device Callback Linkked List */ INIT_LIST_HEAD(&linkkit_gateway_ctx->dev_callback_list); res = _linkkit_gateway_callback_list_insert(IOTX_DM_LOCAL_NODE_DEVID, cbs, ctx); if (res != SUCCESS_RETURN) { HAL_MutexDestroy(linkkit_gateway_ctx->mutex); HAL_MutexDestroy(linkkit_gateway_ctx->upstream_mutex); iotx_dm_close(); linkkit_gateway_ctx->is_started = 0; return FAIL_RETURN; } /* Init Upstream Callback List */ INIT_LIST_HEAD(&linkkit_gateway_ctx->upstream_sync_callback_list); INIT_LIST_HEAD(&linkkit_gateway_ctx->upstream_async_callback_list); _linkkit_gateway_upstream_mutex_lock(); res = _linkkit_gateway_callback_list_search(IOTX_DM_LOCAL_NODE_DEVID, &node); _linkkit_gateway_upstream_mutex_unlock(); if (res == SUCCESS_RETURN) { if (node->callback->register_complete) { node->callback->register_complete(node->callback_ctx); } } return SUCCESS_RETURN; } int linkkit_gateway_stop(int devid) { linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); if (linkkit_gateway_ctx->is_started == 0) { return FAIL_RETURN; } if (devid != IOTX_DM_LOCAL_NODE_DEVID) { return FAIL_RETURN; } _linkkit_gateway_mutex_lock(); _linkkit_gateway_upstream_mutex_lock(); linkkit_gateway_ctx->is_started = 0; iotx_dm_close(); HAL_SleepMs(200); _linkkit_gateway_callback_list_destroy(); _linkkit_gateway_upstream_sync_callback_list_destroy(); _linkkit_gateway_upstream_async_callback_list_destroy(); _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); HAL_MutexDestroy(linkkit_gateway_ctx->upstream_mutex); HAL_MutexDestroy(linkkit_gateway_ctx->mutex); linkkit_gateway_ctx->mutex = NULL; linkkit_gateway_ctx->upstream_mutex = NULL; memset(&linkkit_gateway_ctx->init_params, 0, sizeof(linkkit_params_t)); linkkit_gateway_ctx->dispatch_thread = NULL; linkkit_gateway_ctx->fota_callback = NULL; INIT_LIST_HEAD(&linkkit_gateway_ctx->dev_callback_list); INIT_LIST_HEAD(&linkkit_gateway_ctx->upstream_sync_callback_list); INIT_LIST_HEAD(&linkkit_gateway_ctx->upstream_async_callback_list); return SUCCESS_RETURN; } int linkkit_gateway_subdev_register(char *productKey, char *deviceName, char *deviceSecret) { int res = 0, msgid = 0, code = 0, devid = 0; linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); linkkit_gateway_upstream_sync_callback_node_t *node = NULL; void *semaphore = NULL; linkkit_gateway_dev_callback_node_t *dev_callback_node = NULL; if (productKey == NULL || strlen(productKey) >= IOTX_PRODUCT_KEY_LEN + 1 || deviceName == NULL || strlen(deviceName) >= IOTX_DEVICE_NAME_LEN + 1) { return FAIL_RETURN; } if (linkkit_gateway_ctx->is_started == 0) { return FAIL_RETURN; } _linkkit_gateway_mutex_lock(); res = iotx_dm_deprecated_legacy_get_devid_by_pkdn(productKey, deviceName, &devid); if (res != SUCCESS_RETURN) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } /* Subdev Delete Topo */ res = iotx_dm_subdev_topo_del(devid); if (res < SUCCESS_RETURN) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } msgid = res; semaphore = HAL_SemaphoreCreate(); if (semaphore == NULL) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_lock(); res = _linkkit_gateway_upstream_sync_callback_list_insert(msgid, semaphore, &node); if (res != SUCCESS_RETURN) { HAL_SemaphoreDestroy(semaphore); _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_unlock(); res = HAL_SemaphoreWait(semaphore, LINKKIT_GATEWAY_LEGACY_SYNC_DEFAULT_TIMEOUT_MS); if (res < SUCCESS_RETURN) { _linkkit_gateway_upstream_mutex_lock(); _linkkit_gateway_upstream_sync_callback_list_remove(msgid); _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_lock(); code = node->code; _linkkit_gateway_upstream_sync_callback_list_remove(msgid); if (code != SUCCESS_RETURN) { _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_unlock(); /* Subdev Register */ res = iotx_dm_deprecated_subdev_register(devid, deviceSecret); if (res < SUCCESS_RETURN) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } if (res > SUCCESS_RETURN) { semaphore = HAL_SemaphoreCreate(); if (semaphore == NULL) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } msgid = res; _linkkit_gateway_upstream_mutex_lock(); res = _linkkit_gateway_upstream_sync_callback_list_insert(msgid, semaphore, &node); if (res != SUCCESS_RETURN) { HAL_SemaphoreDestroy(semaphore); _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_unlock(); res = HAL_SemaphoreWait(semaphore, LINKKIT_GATEWAY_LEGACY_SYNC_DEFAULT_TIMEOUT_MS); if (res < SUCCESS_RETURN) { _linkkit_gateway_upstream_mutex_lock(); _linkkit_gateway_upstream_sync_callback_list_remove(msgid); _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_lock(); code = node->code; _linkkit_gateway_upstream_sync_callback_list_remove(msgid); if (code != SUCCESS_RETURN) { _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_unlock(); } /* Subdev Add Topo */ res = iotx_dm_subdev_topo_add(devid); if (res < SUCCESS_RETURN) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } semaphore = HAL_SemaphoreCreate(); if (semaphore == NULL) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } msgid = res; _linkkit_gateway_upstream_mutex_lock(); res = _linkkit_gateway_upstream_sync_callback_list_insert(msgid, semaphore, &node); if (res != SUCCESS_RETURN) { HAL_SemaphoreDestroy(semaphore); _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_unlock(); res = HAL_SemaphoreWait(semaphore, LINKKIT_GATEWAY_LEGACY_SYNC_DEFAULT_TIMEOUT_MS); if (res < SUCCESS_RETURN) { _linkkit_gateway_upstream_mutex_lock(); _linkkit_gateway_upstream_sync_callback_list_remove(msgid); _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_lock(); code = node->code; _linkkit_gateway_upstream_sync_callback_list_remove(msgid); if (code != SUCCESS_RETURN) { _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_upstream_mutex_lock(); res = _linkkit_gateway_callback_list_search(devid, &dev_callback_node); _linkkit_gateway_upstream_mutex_unlock(); if (res == SUCCESS_RETURN) { if (dev_callback_node->callback->register_complete) { dev_callback_node->callback->register_complete(dev_callback_node->callback_ctx); } } _linkkit_gateway_mutex_unlock(); return SUCCESS_RETURN; } int linkkit_gateway_subdev_unregister(char *productKey, char *deviceName) { int res = 0, msgid = 0, code = 0, devid = 0; linkkit_gateway_upstream_sync_callback_node_t *node = NULL; linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); void *semaphore = NULL; if (productKey == NULL || strlen(productKey) >= IOTX_PRODUCT_KEY_LEN + 1 || deviceName == NULL || strlen(deviceName) >= IOTX_DEVICE_NAME_LEN + 1) { return FAIL_RETURN; } if (linkkit_gateway_ctx->is_started == 0) { return FAIL_RETURN; } _linkkit_gateway_mutex_lock(); res = iotx_dm_deprecated_legacy_get_devid_by_pkdn(productKey, deviceName, &devid); if (res != SUCCESS_RETURN) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } /* Subdev Delete Topo */ res = iotx_dm_subdev_topo_del(devid); if (res < SUCCESS_RETURN) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } msgid = res; semaphore = HAL_SemaphoreCreate(); if (semaphore == NULL) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_lock(); res = _linkkit_gateway_upstream_sync_callback_list_insert(msgid, semaphore, &node); if (res != SUCCESS_RETURN) { HAL_SemaphoreDestroy(semaphore); _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_unlock(); res = HAL_SemaphoreWait(semaphore, LINKKIT_GATEWAY_LEGACY_SYNC_DEFAULT_TIMEOUT_MS); if (res < SUCCESS_RETURN) { _linkkit_gateway_upstream_mutex_lock(); _linkkit_gateway_upstream_sync_callback_list_remove(msgid); _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_lock(); code = node->code; _linkkit_gateway_upstream_sync_callback_list_remove(msgid); if (code != SUCCESS_RETURN) { _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return SUCCESS_RETURN; } int linkkit_gateway_subdev_create(char *productKey, char *deviceName, linkkit_cbs_t *cbs, void *ctx) { int res = 0, devid = 0; linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); if (productKey == NULL || strlen(productKey) >= IOTX_PRODUCT_KEY_LEN + 1 || deviceName == NULL || strlen(deviceName) >= IOTX_DEVICE_NAME_LEN + 1 || cbs == NULL) { return FAIL_RETURN; } if (linkkit_gateway_ctx->is_started == 0) { return FAIL_RETURN; } _linkkit_gateway_mutex_lock(); res = iotx_dm_subdev_create(productKey, "", deviceName, NULL, &devid); if (res != SUCCESS_RETURN) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_lock(); res = _linkkit_gateway_callback_list_insert(devid, cbs, ctx); if (res != SUCCESS_RETURN) { iotx_dm_subdev_destroy(devid); _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return devid; } int linkkit_gateway_subdev_destroy(int devid) { int res = 0; linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); if (devid <= 0) { return FAIL_RETURN; } if (linkkit_gateway_ctx->is_started == 0) { return FAIL_RETURN; } _linkkit_gateway_mutex_lock(); _linkkit_gateway_upstream_mutex_lock(); res = _linkkit_gateway_callback_list_remove(devid); if (res != SUCCESS_RETURN) { _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_unlock(); res = iotx_dm_subdev_destroy(devid); if (res != SUCCESS_RETURN) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_mutex_unlock(); return SUCCESS_RETURN; } int linkkit_gateway_subdev_login(int devid) { int res = 0, msgid = 0, code = 0; linkkit_gateway_upstream_sync_callback_node_t *node = NULL; linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); void *semaphore = NULL; if (devid <= 0) { return FAIL_RETURN; } if (linkkit_gateway_ctx->is_started == 0) { return FAIL_RETURN; } _linkkit_gateway_mutex_lock(); res = iotx_dm_subdev_login(devid); if (res < SUCCESS_RETURN) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } msgid = res; semaphore = HAL_SemaphoreCreate(); if (semaphore == NULL) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_lock(); res = _linkkit_gateway_upstream_sync_callback_list_insert(msgid, semaphore, &node); if (res != SUCCESS_RETURN) { HAL_SemaphoreDestroy(semaphore); _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_unlock(); res = HAL_SemaphoreWait(semaphore, LINKKIT_GATEWAY_LEGACY_SYNC_DEFAULT_TIMEOUT_MS); if (res < SUCCESS_RETURN) { _linkkit_gateway_upstream_mutex_lock(); _linkkit_gateway_upstream_sync_callback_list_remove(msgid); _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_lock(); code = node->code; _linkkit_gateway_upstream_sync_callback_list_remove(msgid); if (code != SUCCESS_RETURN) { _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_unlock(); res = iotx_dm_subscribe(devid); if (res != SUCCESS_RETURN) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_mutex_unlock(); return SUCCESS_RETURN; } int linkkit_gateway_subdev_logout(int devid) { int res = 0, msgid = 0, code = 0; linkkit_gateway_upstream_sync_callback_node_t *node = NULL; linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); void *semaphore = NULL; if (devid <= 0) { return FAIL_RETURN; } if (linkkit_gateway_ctx->is_started == 0) { return FAIL_RETURN; } _linkkit_gateway_mutex_lock(); res = iotx_dm_subdev_logout(devid); if (res < SUCCESS_RETURN) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } msgid = res; semaphore = HAL_SemaphoreCreate(); if (semaphore == NULL) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_lock(); res = _linkkit_gateway_upstream_sync_callback_list_insert(msgid, semaphore, &node); if (res != SUCCESS_RETURN) { HAL_SemaphoreDestroy(semaphore); _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_unlock(); res = HAL_SemaphoreWait(semaphore, LINKKIT_GATEWAY_LEGACY_SYNC_DEFAULT_TIMEOUT_MS); if (res < SUCCESS_RETURN) { _linkkit_gateway_upstream_mutex_lock(); _linkkit_gateway_upstream_sync_callback_list_remove(msgid); _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_lock(); code = node->code; _linkkit_gateway_upstream_sync_callback_list_remove(msgid); if (code != SUCCESS_RETURN) { _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return SUCCESS_RETURN; } int linkkit_gateway_get_devinfo(int devid, linkkit_devinfo_t *devinfo) { int res = 0, type = 0; iotx_dm_dev_status_t status; iotx_dm_dev_avail_t available; linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); if (devid < 0 || devinfo == NULL) { return FAIL_RETURN; } if (linkkit_gateway_ctx->is_started == 0) { return FAIL_RETURN; } _linkkit_gateway_mutex_lock(); memset(devinfo, 0, sizeof(linkkit_devinfo_t)); res = iotx_dm_deprecated_legacy_get_pkdn_ptr_by_devid(devid, &(devinfo->productKey), &(devinfo->deviceName)); if (res != SUCCESS_RETURN) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } res = iotx_dm_get_device_type(devid, &type); if (res != SUCCESS_RETURN) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } if (type == IOTX_DM_DEVICE_GATEWAY) { devinfo->devtype = 0; } else if (type == IOTX_DM_DEVICE_SUBDEV) { devinfo->devtype = 1; } else { impl_gateway_info("wrong device type\n"); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } res = iotx_dm_get_device_status(devid, &status); if (res != SUCCESS_RETURN) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } if (status >= IOTX_DM_DEV_STATUS_LOGINED) { devinfo->login = 1; } if (status == IOTX_DM_DEV_STATUS_ONLINE) { devinfo->online = 1; } res = iotx_dm_get_device_avail_status(devid, &available); if (res != SUCCESS_RETURN) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } devinfo->state = available; _linkkit_gateway_mutex_unlock(); return SUCCESS_RETURN; } int linkkit_gateway_trigger_event_json_sync(int devid, char *identifier, char *event, int timeout_ms) { int res = 0, msgid = 0, code = 0, event_reply_value = 0; linkkit_gateway_upstream_sync_callback_node_t *node = NULL; linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); void *semaphore = NULL; if (devid < 0 || identifier == NULL || event == NULL || timeout_ms < 0) { return FAIL_RETURN; } if (linkkit_gateway_ctx->is_started == 0) { return FAIL_RETURN; } _linkkit_gateway_mutex_lock(); res = iotx_dm_get_opt(1, (void *)&event_reply_value); if (res != SUCCESS_RETURN) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } if (timeout_ms == 0 || event_reply_value == 0) { res = iotx_dm_post_event(devid, identifier, strlen(identifier), event, strlen(event)); if (res < SUCCESS_RETURN) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } else { _linkkit_gateway_mutex_unlock(); return SUCCESS_RETURN; } } res = iotx_dm_post_event(devid, identifier, strlen(identifier), event, strlen(event)); if (res < SUCCESS_RETURN) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } msgid = res; semaphore = HAL_SemaphoreCreate(); if (semaphore == NULL) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_lock(); res = _linkkit_gateway_upstream_sync_callback_list_insert(msgid, semaphore, &node); if (res != SUCCESS_RETURN) { HAL_SemaphoreDestroy(semaphore); _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_unlock(); res = HAL_SemaphoreWait(semaphore, timeout_ms); if (res < SUCCESS_RETURN) { _linkkit_gateway_upstream_mutex_lock(); _linkkit_gateway_upstream_sync_callback_list_remove(msgid); _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_lock(); code = node->code; _linkkit_gateway_upstream_sync_callback_list_remove(msgid); if (code != SUCCESS_RETURN) { _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return SUCCESS_RETURN; } int linkkit_gateway_trigger_event_json(int devid, char *identifier, char *event, int timeout_ms, void (*func)(int retval, void *ctx), void *ctx) { int res = 0, event_reply_value = 0; linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); if (devid < 0 || identifier == NULL || event == NULL || timeout_ms < 0) { return FAIL_RETURN; } if (linkkit_gateway_ctx->is_started == 0) { return FAIL_RETURN; } _linkkit_gateway_mutex_lock(); res = iotx_dm_get_opt(1, (void *)&event_reply_value); if (res != SUCCESS_RETURN) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } impl_gateway_info("event_reply_value: %d", event_reply_value); if (timeout_ms == 0 || event_reply_value == 0) { res = iotx_dm_post_event(devid, identifier, strlen(identifier), event, strlen(event)); if (res < SUCCESS_RETURN) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } else { _linkkit_gateway_mutex_unlock(); return SUCCESS_RETURN; } } res = iotx_dm_post_event(devid, identifier, strlen(identifier), event, strlen(event)); if (res < SUCCESS_RETURN) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_lock(); res = _linkkit_gateway_upstream_async_callback_list_insert(res, timeout_ms, func, ctx); if (res != SUCCESS_RETURN) { _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return SUCCESS_RETURN; } int linkkit_gateway_post_property_json_sync(int devid, char *property, int timeout_ms) { int res = 0, msgid = 0, code = 0, property_reply_value = 0; linkkit_gateway_upstream_sync_callback_node_t *node = NULL; linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); void *semaphore = NULL; if (devid < 0 || property == NULL || timeout_ms < 0) { return FAIL_RETURN; } if (linkkit_gateway_ctx->is_started == 0) { return FAIL_RETURN; } _linkkit_gateway_mutex_lock(); res = iotx_dm_get_opt(0, (void *)&property_reply_value); if (res != SUCCESS_RETURN) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } if (timeout_ms == 0 || property_reply_value == 0) { res = iotx_dm_post_property(devid, property, strlen(property)); if (res < SUCCESS_RETURN) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } else { _linkkit_gateway_mutex_unlock(); return SUCCESS_RETURN; } } res = iotx_dm_post_property(devid, property, strlen(property)); if (res < SUCCESS_RETURN) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } msgid = res; semaphore = HAL_SemaphoreCreate(); if (semaphore == NULL) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_lock(); res = _linkkit_gateway_upstream_sync_callback_list_insert(msgid, semaphore, &node); if (res != SUCCESS_RETURN) { HAL_SemaphoreDestroy(semaphore); _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_unlock(); res = HAL_SemaphoreWait(semaphore, timeout_ms); if (res < SUCCESS_RETURN) { _linkkit_gateway_upstream_mutex_lock(); _linkkit_gateway_upstream_sync_callback_list_remove(msgid); _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_lock(); code = node->code; _linkkit_gateway_upstream_sync_callback_list_remove(msgid); if (code != SUCCESS_RETURN) { _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return SUCCESS_RETURN; } int linkkit_gateway_post_property_json(int devid, char *property, int timeout_ms, void (*func)(int retval, void *ctx), void *ctx) { int res = 0, property_reply_value = 0; linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); if (devid < 0 || property == NULL || timeout_ms < 0) { return FAIL_RETURN; } if (linkkit_gateway_ctx->is_started == 0) { return FAIL_RETURN; } _linkkit_gateway_mutex_lock(); res = iotx_dm_get_opt(0, (void *)&property_reply_value); if (res != SUCCESS_RETURN) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } if (timeout_ms == 0 || property_reply_value == 0) { res = iotx_dm_post_property(devid, property, strlen(property)); if (res < SUCCESS_RETURN) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } else { _linkkit_gateway_mutex_unlock(); return SUCCESS_RETURN; } } res = iotx_dm_post_property(devid, property, strlen(property)); if (res < SUCCESS_RETURN) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_lock(); res = _linkkit_gateway_upstream_async_callback_list_insert(res, timeout_ms, func, ctx); if (res != SUCCESS_RETURN) { _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return SUCCESS_RETURN; } int linkkit_gateway_post_rawdata(int devid, void *data, int len) { int res = 0; linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); if (devid < 0 || data == NULL || len <= 0) { return FAIL_RETURN; } if (linkkit_gateway_ctx->is_started == 0) { return FAIL_RETURN; } _linkkit_gateway_mutex_lock(); res = iotx_dm_post_rawdata(devid, data, len); _linkkit_gateway_mutex_unlock(); return res; } int linkkit_gateway_fota_init(handle_service_fota_callback_fp_t callback_fp) { linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); if (linkkit_gateway_ctx->is_started == 0) { return FAIL_RETURN; } linkkit_gateway_ctx->fota_callback = callback_fp; return SUCCESS_RETURN; } int linkkit_gateway_invoke_fota_service(void *data_buf, int data_buf_length) { int res = 0; linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); if (linkkit_gateway_ctx->is_started == 0) { return FAIL_RETURN; } _linkkit_gateway_mutex_lock(); res = iotx_dm_fota_perform_sync(data_buf, data_buf_length); _linkkit_gateway_mutex_unlock(); return res; } int linkkit_gateway_post_extinfos(int devid, linkkit_extinfo_t *extinfos, int nb_extinfos, int timeout_ms) { int res = 0, index = 0, msgid = 0, code = 0; linkkit_gateway_upstream_sync_callback_node_t *node = NULL; linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); void *semaphore = NULL; char *payload = NULL; lite_cjson_item_t *lite_array = NULL, *lite_array_item = NULL; if (devid < 0 || extinfos == NULL || nb_extinfos <= 0 || timeout_ms < 0) { return FAIL_RETURN; } if (linkkit_gateway_ctx->is_started == 0) { return FAIL_RETURN; } _linkkit_gateway_mutex_lock(); lite_array = lite_cjson_create_array(); if (lite_array == NULL) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } for (index = 0; index < nb_extinfos; index++) { if (extinfos[index].attrKey == NULL || extinfos[index].attrValue == NULL) { lite_cjson_delete(lite_array); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } lite_array_item = lite_cjson_create_object(); if (lite_array_item == NULL) { lite_cjson_delete(lite_array); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } lite_cjson_add_string_to_object(lite_array_item, "attrKey", extinfos[index].attrKey); lite_cjson_add_string_to_object(lite_array_item, "attrValue", extinfos[index].attrValue); lite_cjson_add_item_to_array(lite_array, lite_array_item); } payload = lite_cjson_print_unformatted(lite_array); if (payload == NULL) { lite_cjson_delete(lite_array); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } lite_cjson_delete(lite_array); if (timeout_ms == 0) { res = iotx_dm_deviceinfo_update(devid, payload, strlen(payload)); IMPL_GATEWAY_FREE(payload); if (res < SUCCESS_RETURN) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } else { _linkkit_gateway_mutex_unlock(); return SUCCESS_RETURN; } } res = iotx_dm_deviceinfo_update(devid, payload, strlen(payload)); if (res < SUCCESS_RETURN) { IMPL_GATEWAY_FREE(payload); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } msgid = res; IMPL_GATEWAY_FREE(payload); semaphore = HAL_SemaphoreCreate(); if (semaphore == NULL) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_lock(); res = _linkkit_gateway_upstream_sync_callback_list_insert(msgid, semaphore, &node); if (res != SUCCESS_RETURN) { HAL_SemaphoreDestroy(semaphore); _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_unlock(); res = HAL_SemaphoreWait(semaphore, timeout_ms); if (res < SUCCESS_RETURN) { _linkkit_gateway_upstream_mutex_lock(); _linkkit_gateway_upstream_sync_callback_list_remove(msgid); _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_lock(); code = node->code; _linkkit_gateway_upstream_sync_callback_list_remove(msgid); if (code != SUCCESS_RETURN) { _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return SUCCESS_RETURN; } int linkkit_gateway_delete_extinfos(int devid, linkkit_extinfo_t *extinfos, int nb_extinfos, int timeout_ms) { int res = 0, index = 0, msgid = 0, code = 0; linkkit_gateway_upstream_sync_callback_node_t *node = NULL; linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); void *semaphore = NULL; char *payload = NULL; lite_cjson_item_t *lite_array = NULL, *lite_array_item = NULL; if (devid < 0 || extinfos == NULL || nb_extinfos <= 0 || timeout_ms < 0) { return FAIL_RETURN; } if (linkkit_gateway_ctx->is_started == 0) { return FAIL_RETURN; } _linkkit_gateway_mutex_lock(); lite_array = lite_cjson_create_array(); if (lite_array == NULL) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } for (index = 0; index < nb_extinfos; index++) { if (extinfos[index].attrKey == NULL || extinfos[index].attrValue == NULL) { lite_cjson_delete(lite_array); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } lite_array_item = lite_cjson_create_object(); if (lite_array_item == NULL) { lite_cjson_delete(lite_array); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } lite_cjson_add_string_to_object(lite_array_item, "attrKey", extinfos[index].attrKey); lite_cjson_add_string_to_object(lite_array_item, "attrValue", extinfos[index].attrValue); lite_cjson_add_item_to_array(lite_array, lite_array_item); } payload = lite_cjson_print_unformatted(lite_array); if (payload == NULL) { lite_cjson_delete(lite_array); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } lite_cjson_delete(lite_array); if (timeout_ms == 0) { res = iotx_dm_deviceinfo_delete(devid, payload, strlen(payload)); IMPL_GATEWAY_FREE(payload); if (res < SUCCESS_RETURN) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } else { _linkkit_gateway_mutex_unlock(); return SUCCESS_RETURN; } } res = iotx_dm_deviceinfo_delete(devid, payload, strlen(payload)); if (res < SUCCESS_RETURN) { IMPL_GATEWAY_FREE(payload); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } msgid = res; IMPL_GATEWAY_FREE(payload); semaphore = HAL_SemaphoreCreate(); if (semaphore == NULL) { _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_lock(); res = _linkkit_gateway_upstream_sync_callback_list_insert(msgid, semaphore, &node); if (res != SUCCESS_RETURN) { HAL_SemaphoreDestroy(semaphore); _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_unlock(); res = HAL_SemaphoreWait(semaphore, timeout_ms); if (res < SUCCESS_RETURN) { _linkkit_gateway_upstream_mutex_lock(); _linkkit_gateway_upstream_sync_callback_list_remove(msgid); _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_lock(); code = node->code; _linkkit_gateway_upstream_sync_callback_list_remove(msgid); if (code != SUCCESS_RETURN) { _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return FAIL_RETURN; } _linkkit_gateway_upstream_mutex_unlock(); _linkkit_gateway_mutex_unlock(); return SUCCESS_RETURN; } int linkkit_gateway_get_num_devices(void) { int dev_nums = 0; linkkit_gateway_legacy_ctx_t *linkkit_gateway_ctx = _linkkit_gateway_legacy_get_ctx(); if (linkkit_gateway_ctx->is_started == 0) { return FAIL_RETURN; } _linkkit_gateway_mutex_lock(); dev_nums = iotx_dm_subdev_number(); _linkkit_gateway_mutex_unlock(); return dev_nums; } #endif